]> git.sesse.net Git - vlc/blobdiff - modules/audio_output/auhal.c
Made vout_display_opengl_t private.
[vlc] / modules / audio_output / auhal.c
index 7448898a554e7ebc9e113ed2bd37fd8c1bcd3620..306515f9b0842e55f728a885883604761d97a0f3 100644 (file)
@@ -1,10 +1,11 @@
 /*****************************************************************************
  * auhal.c: AUHAL and Coreaudio output plugin
  *****************************************************************************
- * Copyright (C) 2005 the VideoLAN team
+ * Copyright (C) 2005, 2011 the VideoLAN team
  * $Id$
  *
  * Authors: Derk-Jan Hartman <hartman at videolan dot org>
+ *          Felix Paul Kühne <fkuehne at videolan dot org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 #include <unistd.h>
 
-#include <vlc/vlc.h>
-#include <vlc_interface.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_dialog.h>
 #include <vlc_aout.h>
 
 #include <CoreAudio/CoreAudio.h>
-#include <AudioUnit/AudioUnitProperties.h>
-#include <AudioUnit/AudioUnitParameters.h>
-#include <AudioUnit/AudioOutputUnit.h>
+#include <AudioUnit/AudioUnit.h>
 #include <AudioToolbox/AudioFormat.h>
 
+#include <CoreServices/CoreServices.h>
+
+#ifndef verify_noerr
+#define verify_noerr(a) assert((a) == noErr)
+#endif
+
 #define STREAM_FORMAT_MSG( pre, sfm ) \
-    pre "[%ld][%4.4s][%ld][%ld][%ld][%ld][%ld][%ld]", \
+    pre "[%u][%4.4s][%u][%u][%u][%u][%u][%u]", \
     (UInt32)sfm.mSampleRate, (char *)&sfm.mFormatID, \
     sfm.mFormatFlags, sfm.mBytesPerPacket, \
     sfm.mFramesPerPacket, sfm.mBytesPerFrame, \
     sfm.mChannelsPerFrame, sfm.mBitsPerChannel
 
 #define STREAM_FORMAT_MSG_FULL( pre, sfm ) \
-    pre ":\nsamplerate: [%ld]\nFormatID: [%4.4s]\nFormatFlags: [%ld]\nBypesPerPacket: [%ld]\nFramesPerPacket: [%ld]\nBytesPerFrame: [%ld]\nChannelsPerFrame: [%ld]\nBitsPerChannel[%ld]", \
+    pre ":\nsamplerate: [%u]\nFormatID: [%4.4s]\nFormatFlags: [%u]\nBypesPerPacket: [%u]\nFramesPerPacket: [%u]\nBytesPerFrame: [%u]\nChannelsPerFrame: [%u]\nBitsPerChannel[%u]", \
     (UInt32)sfm.mSampleRate, (char *)&sfm.mFormatID, \
     sfm.mFormatFlags, sfm.mBytesPerPacket, \
     sfm.mFramesPerPacket, sfm.mBytesPerFrame, \
     sfm.mChannelsPerFrame, sfm.mBitsPerChannel
 
-#define BUFSIZE 0xffffff
+#define FRAMESIZE 2048
+#define BUFSIZE (FRAMESIZE * 8) * 8
 #define AOUT_VAR_SPDIF_FLAG 0xf00000
 
 /*
  * TODO:
  * - clean up the debug info
- * - clean up C99'isms
  * - be better at changing stream setup or devices setup changes while playing.
  * - fix 6.1 and 7.1
  */
@@ -75,9 +81,10 @@ struct aout_sys_t
 {
     AudioDeviceID               i_default_dev;  /* Keeps DeviceID of defaultOutputDevice */
     AudioDeviceID               i_selected_dev; /* Keeps DeviceID of the selected device */
+    AudioDeviceIOProcID         i_procID;       /* DeviceID of current device */
     UInt32                      i_devices;      /* Number of CoreAudio Devices */
-    bool                  b_supports_digital;/* Does the currently selected device support digital mode? */
-    bool                  b_digital;      /* Are we running in digital mode? */
+    bool                        b_supports_digital;/* Does the currently selected device support digital mode? */
+    bool                        b_digital;      /* Are we running in digital mode? */
     mtime_t                     clock_diff;     /* Difference between VLC clock and Device clock */
 
     /* AUHAL specific */
@@ -93,8 +100,8 @@ struct aout_sys_t
     int                         i_stream_index; /* The index of i_stream_id in an AudioBufferList */
     AudioStreamBasicDescription stream_format;  /* The format we changed the stream to */
     AudioStreamBasicDescription sfmt_revert;    /* The original format of the stream */
-    bool                  b_revert;       /* Wether we need to revert the stream format */
-    bool                  b_changed_mixing;/* Wether we need to set the mixing mode back */
+    bool                        b_revert;       /* Wether we need to revert the stream format */
+    bool                        b_changed_mixing;/* Wether we need to set the mixing mode back */
 };
 
 /*****************************************************************************
@@ -124,6 +131,7 @@ static int      AudioDeviceCallback     ( vlc_object_t *, const char *,
                                           vlc_value_t, vlc_value_t, void * );
 
 
+
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
@@ -132,15 +140,15 @@ static int      AudioDeviceCallback     ( vlc_object_t *, const char *,
     "audio device, as listed in your 'Audio Device' menu. This device will " \
     "then be used by default for audio playback.")
 
-vlc_module_begin();
-    set_shortname( "auhal" );
-    set_description( _("HAL AudioUnit output") );
-    set_capability( "audio output", 101 );
-    set_category( CAT_AUDIO );
-    set_subcategory( SUBCAT_AUDIO_AOUT );
-    set_callbacks( Open, Close );
-    add_integer( "macosx-audio-device", 0, NULL, ADEV_TEXT, ADEV_LONGTEXT, false );
-vlc_module_end();
+vlc_module_begin ()
+    set_shortname( "auhal" )
+    set_description( N_("HAL AudioUnit output") )
+    set_capability( "audio output", 101 )
+    set_category( CAT_AUDIO )
+    set_subcategory( SUBCAT_AUDIO_AOUT )
+    set_callbacks( Open, Close )
+    add_integer( "macosx-audio-device", 0, ADEV_TEXT, ADEV_LONGTEXT, false )
+vlc_module_end ()
 
 /*****************************************************************************
  * Open: open macosx audio output
@@ -155,15 +163,12 @@ static int Open( vlc_object_t * p_this )
 
     /* Use int here, to match kAudioDevicePropertyDeviceIsAlive
      * property size */
-    int                     b_alive = false; 
+    int                     b_alive = false;
 
     /* Allocate structure */
     p_aout->output.p_sys = malloc( sizeof( aout_sys_t ) );
     if( p_aout->output.p_sys == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
-        return( VLC_ENOMEM );
-    }
+        return VLC_ENOMEM;
 
     p_sys = p_aout->output.p_sys;
     p_sys->i_default_dev = 0;
@@ -184,9 +189,9 @@ static int Open( vlc_object_t * p_this )
     memset( p_sys->p_remainder_buffer, 0, sizeof(uint8_t) * BUFSIZE );
 
     p_aout->output.pf_play = Play;
+
     aout_FormatPrint( p_aout, "VLC is looking for:", (audio_sample_format_t *)&p_aout->output.output );
+
     /* Persistent device variable */
     if( var_Type( p_aout->p_libvlc, "macosx-audio-device" ) == 0 )
     {
@@ -223,7 +228,7 @@ static int Open( vlc_object_t * p_this )
         b_alive = false;
     }
 
-    if( b_alive == false )
+    if( !b_alive )
     {
         msg_Warn( p_aout, "selected audio device is not alive, switching to default device" );
         p_sys->i_selected_dev = p_sys->i_default_dev;
@@ -245,7 +250,7 @@ static int Open( vlc_object_t * p_this )
     if( p_sys->i_hog_pid != -1 && p_sys->i_hog_pid != getpid() )
     {
         msg_Err( p_aout, "Selected audio device is exclusively in use by another program." );
-        intf_UserFatal( p_aout, false, _("Audio output failed"),
+        dialog_Fatal( p_aout, _("Audio output failed"), "%s",
                         _("The selected audio output device is exclusively in "
                           "use by another program.") );
         goto error;
@@ -305,7 +310,7 @@ static int OpenAnalog( aout_instance_t *p_aout )
         msg_Warn( p_aout, "we cannot open our HAL component" );
         return false;
     }
+
     /* Set the device we will use for this output unit */
     err = AudioUnitSetProperty( p_sys->au_unit,
                          kAudioOutputUnitProperty_CurrentDevice,
@@ -313,13 +318,13 @@ static int OpenAnalog( aout_instance_t *p_aout )
                          0,
                          &p_sys->i_selected_dev,
                          sizeof( AudioDeviceID ));
+
     if( err != noErr )
     {
         msg_Warn( p_aout, "we cannot select the audio device" );
         return false;
     }
+
     /* Get the current format */
     i_param_size = sizeof(AudioStreamBasicDescription);
 
@@ -329,7 +334,7 @@ static int OpenAnalog( aout_instance_t *p_aout )
                                    0,
                                    &DeviceFormat,
                                    &i_param_size );
+
     if( err != noErr ) return false;
     else msg_Dbg( p_aout, STREAM_FORMAT_MSG( "current format is: ", DeviceFormat ) );
 
@@ -351,7 +356,7 @@ static int OpenAnalog( aout_instance_t *p_aout )
                                        0,
                                        layout,
                                        &i_param_size ));
+
         /* We need to "fill out" the ChannelLayout, because there are multiple ways that it can be set */
         if( layout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap)
         {
@@ -371,11 +376,11 @@ static int OpenAnalog( aout_instance_t *p_aout )
         }
 
         msg_Dbg( p_aout, "layout of AUHAL has %d channels" , (int)layout->mNumberChannelDescriptions );
+
         /* Initialize the VLC core channel count */
         p_aout->output.output.i_physical_channels = 0;
         i_original = p_aout->output.output.i_original_channels & AOUT_CHAN_PHYSMASK;
+
         if( i_original == AOUT_CHAN_CENTER || layout->mNumberChannelDescriptions < 2 )
         {
             /* We only need Mono or cannot output more than 1 channel */
@@ -430,7 +435,7 @@ static int OpenAnalog( aout_instance_t *p_aout )
             {
                 p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
                 msg_Err( p_aout, "You should configure your speaker layout with Audio Midi Setup Utility in /Applications/Utilities. Now using Stereo mode." );
-                intf_UserFatal( p_aout, false, _("Audio device is not configured"),
+                dialog_Fatal( p_aout, _("Audio device is not configured"), "%s",
                                 _("You should configure your speaker layout with "
                                   "the \"Audio Midi Setup\" utility in /Applications/"
                                   "Utilities. Stereo mode is being used now.") );
@@ -515,16 +520,16 @@ static int OpenAnalog( aout_instance_t *p_aout )
     DeviceFormat.mFormatID = kAudioFormatLinearPCM;
 
     /* We use float 32. It's the best supported format by both VLC and Coreaudio */
-    p_aout->output.output.i_format = VLC_FOURCC( 'f','l','3','2');
+    p_aout->output.output.i_format = VLC_CODEC_FL32;
     DeviceFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
     DeviceFormat.mBitsPerChannel = 32;
     DeviceFormat.mChannelsPerFrame = aout_FormatNbChannels( &p_aout->output.output );
+
     /* Calculate framesizes and stuff */
     DeviceFormat.mFramesPerPacket = 1;
     DeviceFormat.mBytesPerFrame = DeviceFormat.mBitsPerChannel * DeviceFormat.mChannelsPerFrame / 8;
     DeviceFormat.mBytesPerPacket = DeviceFormat.mBytesPerFrame * DeviceFormat.mFramesPerPacket;
+
     /* Set the desired format */
     i_param_size = sizeof(AudioStreamBasicDescription);
     verify_noerr( AudioUnitSetProperty( p_sys->au_unit,
@@ -533,9 +538,9 @@ static int OpenAnalog( aout_instance_t *p_aout )
                                    0,
                                    &DeviceFormat,
                                    i_param_size ));
+
     msg_Dbg( p_aout, STREAM_FORMAT_MSG( "we set the AU format: " , DeviceFormat ) );
+
     /* Retrieve actual format */
     verify_noerr( AudioUnitGetProperty( p_sys->au_unit,
                                    kAudioUnitProperty_StreamFormat,
@@ -543,18 +548,18 @@ static int OpenAnalog( aout_instance_t *p_aout )
                                    0,
                                    &DeviceFormat,
                                    &i_param_size ));
+
     msg_Dbg( p_aout, STREAM_FORMAT_MSG( "the actual set AU format is " , DeviceFormat ) );
 
     /* Do the last VLC aout setups */
     aout_FormatPrepare( &p_aout->output.output );
-    p_aout->output.i_nb_samples = 2048;
+    p_aout->output.i_nb_samples = FRAMESIZE;
     aout_VolumeSoftInit( p_aout );
 
     /* set the IOproc callback */
     input.inputProc = (AURenderCallback) RenderCallbackAnalog;
     input.inputProcRefCon = p_aout;
+
     verify_noerr( AudioUnitSetProperty( p_sys->au_unit,
                             kAudioUnitProperty_SetRenderCallback,
                             kAudioUnitScope_Input,
@@ -562,16 +567,16 @@ static int OpenAnalog( aout_instance_t *p_aout )
 
     input.inputProc = (AURenderCallback) RenderCallbackAnalog;
     input.inputProcRefCon = p_aout;
+
     /* Set the new_layout as the layout VLC will use to feed the AU unit */
     verify_noerr( AudioUnitSetProperty( p_sys->au_unit,
                             kAudioUnitProperty_AudioChannelLayout,
                             kAudioUnitScope_Input,
                             0, &new_layout, sizeof(new_layout) ) );
+
     if( new_layout.mNumberChannelDescriptions > 0 )
         free( new_layout.mChannelDescriptions );
+
     /* AU initiliaze */
     verify_noerr( AudioUnitInitialize(p_sys->au_unit) );
 
@@ -582,7 +587,7 @@ static int OpenAnalog( aout_instance_t *p_aout )
 
     /* Start the AU */
     verify_noerr( AudioOutputUnitStart(p_sys->au_unit) );
+
     return true;
 }
 
@@ -604,10 +609,10 @@ static int OpenSPDIF( aout_instance_t * p_aout )
     /* Hog the device */
     i_param_size = sizeof( p_sys->i_hog_pid );
     p_sys->i_hog_pid = getpid() ;
+
     err = AudioDeviceSetProperty( p_sys->i_selected_dev, 0, 0, FALSE,
                                   kAudioDevicePropertyHogMode, i_param_size, &p_sys->i_hog_pid );
+
     if( err != noErr )
     {
         msg_Err( p_aout, "failed to set hogmode: [%4.4s]", (char *)&err );
@@ -620,7 +625,7 @@ static int OpenSPDIF( aout_instance_t * p_aout )
 
     err = AudioDeviceGetProperty( p_sys->i_selected_dev, 0, FALSE, kAudioDevicePropertySupportsMixing,
                                     &i_param_size, &b_mix );
+
     if( !err && b_writeable )
     {
         b_mix = 0;
@@ -628,7 +633,7 @@ static int OpenSPDIF( aout_instance_t * p_aout )
                             kAudioDevicePropertySupportsMixing, i_param_size, &b_mix );
         p_sys->b_changed_mixing = true;
     }
+
     if( err != noErr )
     {
         msg_Err( p_aout, "failed to set mixmode: [%4.4s]", (char *)&err );
@@ -644,19 +649,16 @@ static int OpenSPDIF( aout_instance_t * p_aout )
         msg_Err( p_aout, "could not get number of streams: [%4.4s]", (char *)&err );
         return false;
     }
+
     i_streams = i_param_size / sizeof( AudioStreamID );
     p_streams = (AudioStreamID *)malloc( i_param_size );
     if( p_streams == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
         return false;
-    }
+
     err = AudioDeviceGetProperty( p_sys->i_selected_dev, 0, FALSE,
                                     kAudioDevicePropertyStreams,
                                     &i_param_size, p_streams );
+
     if( err != noErr )
     {
         msg_Err( p_aout, "could not get number of streams: [%4.4s]", (char *)&err );
@@ -670,7 +672,7 @@ static int OpenSPDIF( aout_instance_t * p_aout )
         AudioStreamBasicDescription *p_format_list = NULL;
         int                         i_formats = 0, j = 0;
         bool                  b_digital = false;
+
         /* Retrieve all the stream formats supported by each output stream */
         err = AudioStreamGetPropertyInfo( p_streams[i], 0,
                                           kAudioStreamPropertyPhysicalFormats,
@@ -680,15 +682,12 @@ static int OpenSPDIF( aout_instance_t * p_aout )
             msg_Err( p_aout, "could not get number of streamformats: [%4.4s]", (char *)&err );
             continue;
         }
+
         i_formats = i_param_size / sizeof( AudioStreamBasicDescription );
         p_format_list = (AudioStreamBasicDescription *)malloc( i_param_size );
         if( p_format_list == NULL )
-        {
-            msg_Err( p_aout, "could not malloc the memory" );
             continue;
-        }
+
         err = AudioStreamGetProperty( p_streams[i], 0,
                                           kAudioStreamPropertyPhysicalFormats,
                                           &i_param_size, p_format_list );
@@ -709,7 +708,7 @@ static int OpenSPDIF( aout_instance_t * p_aout )
                 break;
             }
         }
+
         if( b_digital )
         {
             /* if this stream supports a digital (cac3) format, then go set it. */
@@ -720,7 +719,7 @@ static int OpenSPDIF( aout_instance_t * p_aout )
             p_sys->i_stream_id = p_streams[i];
             p_sys->i_stream_index = i;
 
-            if( p_sys->b_revert == false )
+            if( !p_sys->b_revert )
             {
                 /* Retrieve the original format of this stream first if not done so already */
                 i_param_size = sizeof( p_sys->sfmt_revert );
@@ -756,9 +755,9 @@ static int OpenSPDIF( aout_instance_t * p_aout )
                             i_backup_rate_format = j;
                     }
                 }
+
             }
+
             if( i_requested_rate_format >= 0 ) /* We prefer to output at the samplerate of the original audio */
                 p_sys->stream_format = p_format_list[i_requested_rate_format];
             else if( i_current_rate_format >= 0 ) /* If not possible, we will try to use the current samplerate of the device */
@@ -776,9 +775,9 @@ static int OpenSPDIF( aout_instance_t * p_aout )
 
     /* Set the format flags */
     if( p_sys->stream_format.mFormatFlags & kAudioFormatFlagIsBigEndian )
-        p_aout->output.output.i_format = VLC_FOURCC('s','p','d','b');
+        p_aout->output.output.i_format = VLC_CODEC_SPDIFB;
     else
-        p_aout->output.output.i_format = VLC_FOURCC('s','p','d','i');
+        p_aout->output.output.i_format = VLC_CODEC_SPDIFL;
     p_aout->output.output.i_bytes_per_frame = AOUT_SPDIF_SIZE;
     p_aout->output.output.i_frame_length = A52_FRAME_NB;
     p_aout->output.i_nb_samples = p_aout->output.output.i_frame_length;
@@ -787,13 +786,13 @@ static int OpenSPDIF( aout_instance_t * p_aout )
     aout_VolumeNoneInit( p_aout );
 
     /* Add IOProc callback */
-    err = AudioDeviceAddIOProc( p_sys->i_selected_dev,
-                               (AudioDeviceIOProc)RenderCallbackSPDIF,
-                               (void *)p_aout );
-
+    err = AudioDeviceCreateIOProcID( p_sys->i_selected_dev,
+                                   (AudioDeviceIOProc)RenderCallbackSPDIF,
+                                   (void *)p_aout,
+                                   &p_sys->i_procID );
     if( err != noErr )
     {
-        msg_Err( p_aout, "AudioDeviceAddIOProc failed: [%4.4s]", (char *)&err );
+        msg_Err( p_aout, "AudioDeviceCreateIOProcID failed: [%4.4s]", (char *)&err );
         return false;
     }
 
@@ -801,18 +800,18 @@ static int OpenSPDIF( aout_instance_t * p_aout )
     p_sys->clock_diff = - (mtime_t)
         AudioConvertHostTimeToNanos( AudioGetCurrentHostTime() ) / 1000;
     p_sys->clock_diff += mdate();
+
     /* Start device */
-    err = AudioDeviceStart( p_sys->i_selected_dev, (AudioDeviceIOProc)RenderCallbackSPDIF );
+    err = AudioDeviceStart( p_sys->i_selected_dev, p_sys->i_procID );
     if( err != noErr )
     {
         msg_Err( p_aout, "AudioDeviceStart failed: [%4.4s]", (char *)&err );
 
-        err = AudioDeviceRemoveIOProc( p_sys->i_selected_dev,
-                                     (AudioDeviceIOProc)RenderCallbackSPDIF );
+        err = AudioDeviceDestroyIOProcID( p_sys->i_selected_dev,
+                                          p_sys->i_procID );
         if( err != noErr )
         {
-            msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]", (char *)&err );
+            msg_Err( p_aout, "AudioDeviceDestroyIOProcID failed: [%4.4s]", (char *)&err );
         }
         return false;
     }
@@ -830,32 +829,32 @@ static void Close( vlc_object_t * p_this )
     struct aout_sys_t   *p_sys = p_aout->output.p_sys;
     OSStatus            err = noErr;
     UInt32              i_param_size = 0;
+
     if( p_sys->au_unit )
     {
         verify_noerr( AudioOutputUnitStop( p_sys->au_unit ) );
         verify_noerr( AudioUnitUninitialize( p_sys->au_unit ) );
         verify_noerr( CloseComponent( p_sys->au_unit ) );
     }
+
     if( p_sys->b_digital )
     {
         /* Stop device */
         err = AudioDeviceStop( p_sys->i_selected_dev,
-                               (AudioDeviceIOProc)RenderCallbackSPDIF );
+                               p_sys->i_procID );
         if( err != noErr )
         {
             msg_Err( p_aout, "AudioDeviceStop failed: [%4.4s]", (char *)&err );
         }
 
         /* Remove IOProc callback */
-        err = AudioDeviceRemoveIOProc( p_sys->i_selected_dev,
-                                      (AudioDeviceIOProc)RenderCallbackSPDIF );
+        err = AudioDeviceDestroyIOProcID( p_sys->i_selected_dev,
+                                          p_sys->i_procID );
         if( err != noErr )
         {
-            msg_Err( p_aout, "AudioDeviceRemoveIOProc failed: [%4.4s]", (char *)&err );
+            msg_Err( p_aout, "AudioDeviceDestroyIOProcID failed: [%4.4s]", (char *)&err );
         }
+
         if( p_sys->b_revert )
         {
             AudioStreamChangeFormat( p_aout, p_sys->i_stream_id, p_sys->sfmt_revert );
@@ -871,7 +870,7 @@ static void Close( vlc_object_t * p_this )
 
             err = AudioDeviceGetProperty( p_sys->i_selected_dev, 0, FALSE, kAudioDevicePropertySupportsMixing,
                                         &i_param_size, &b_mix );
+
             if( !err && b_writeable )
             {
                 msg_Dbg( p_aout, "mixable is: %d", b_mix );
@@ -889,12 +888,12 @@ static void Close( vlc_object_t * p_this )
 
     err = AudioHardwareRemovePropertyListener( kAudioHardwarePropertyDevices,
                                                HardwareListener );
+
     if( err != noErr )
     {
         msg_Err( p_aout, "AudioHardwareRemovePropertyListener failed: [%4.4s]", (char *)&err );
     }
+
     if( p_sys->i_hog_pid == getpid() )
     {
         p_sys->i_hog_pid = -1;
@@ -903,7 +902,7 @@ static void Close( vlc_object_t * p_this )
                                          kAudioDevicePropertyHogMode, i_param_size, &p_sys->i_hog_pid );
         if( err != noErr ) msg_Err( p_aout, "Could not release hogmode: [%4.4s]", (char *)&err );
     }
+
     free( p_sys );
 }
 
@@ -912,6 +911,7 @@ static void Close( vlc_object_t * p_this )
  *****************************************************************************/
 static void Play( aout_instance_t * p_aout )
 {
+    VLC_UNUSED(p_aout);
 }
 
 
@@ -945,15 +945,12 @@ static void Probe( aout_instance_t * p_aout )
         goto error;
     }
 
-    msg_Dbg( p_aout, "system has [%ld] device(s)", p_sys->i_devices );
+    msg_Dbg( p_aout, "system has [%u] device(s)", p_sys->i_devices );
 
     /* Allocate DeviceID array */
     p_devices = (AudioDeviceID*)malloc( sizeof(AudioDeviceID) * p_sys->i_devices );
     if( p_devices == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
         goto error;
-    }
 
     /* Populate DeviceID array */
     err = AudioHardwareGetProperty( kAudioHardwarePropertyDevices,
@@ -974,11 +971,11 @@ static void Probe( aout_instance_t * p_aout )
         goto error;
     }
     p_sys->i_default_dev = devid_def;
+
     var_Create( p_aout, "audio-device", VLC_VAR_INTEGER|VLC_VAR_HASCHOICE );
-    text.psz_string = _("Audio Device");
+    text.psz_string = (char*)_("Audio Device");
     var_Change( p_aout, "audio-device", VLC_VAR_SETTEXT, &text, NULL );
+
     for( i = 0; i < p_sys->i_devices; i++ )
     {
         char *psz_name;
@@ -999,18 +996,20 @@ static void Probe( aout_instance_t * p_aout )
                     &i_param_size, psz_name);
         if( err ) goto error;
 
-        msg_Dbg( p_aout, "DevID: %#lx DevName: %s", p_devices[i], psz_name );
+        msg_Dbg( p_aout, "DevID: %u DevName: %s", p_devices[i], psz_name );
 
         if( !AudioDeviceHasOutput( p_devices[i]) )
         {
             msg_Dbg( p_aout, "this device is INPUT only. skipping..." );
+            free( psz_name );
             continue;
         }
 
         /* Add the menu entries */
         val.i_int = (int)p_devices[i];
-        text.psz_string = strdup( psz_name );
+        text.psz_string = psz_name;
         var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text );
+        text.psz_string = NULL;
         if( p_sys->i_default_dev == p_devices[i] )
         {
             /* The default device is the selected device normally */
@@ -1021,20 +1020,24 @@ static void Probe( aout_instance_t * p_aout )
         if( AudioDeviceSupportsDigital( p_aout, p_devices[i] ) )
         {
             val.i_int = (int)p_devices[i] | AOUT_VAR_SPDIF_FLAG;
-            asprintf( &text.psz_string, _("%s (Encoded Output)"), psz_name );
-            var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text );
-            if( p_sys->i_default_dev == p_devices[i] && config_GetInt( p_aout, "spdif" ) )
+            if( asprintf( &text.psz_string, _("%s (Encoded Output)"), psz_name ) != -1 )
             {
-                /* We selected to prefer SPDIF output if available
-                 * then this "dummy" entry should be selected */
-                var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
-                var_Set( p_aout, "audio-device", val );
+                var_Change( p_aout, "audio-device", VLC_VAR_ADDCHOICE, &val, &text );
+                free( text.psz_string );
+                if( p_sys->i_default_dev == p_devices[i]
+                 && var_InheritBool( p_aout, "spdif" ) )
+                {
+                    /* We selected to prefer SPDIF output if available
+                     * then this "dummy" entry should be selected */
+                    var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
+                    var_Set( p_aout, "audio-device", val );
+                }
             }
         }
+
         free( psz_name);
     }
+
     /* If a device is already "preselected", then use this device */
     var_Get( p_aout->p_libvlc, "macosx-audio-device", &val );
     if( val.i_int > 0 )
@@ -1042,7 +1045,7 @@ static void Probe( aout_instance_t * p_aout )
         var_Change( p_aout, "audio-device", VLC_VAR_SETDEFAULT, &val, NULL );
         var_Set( p_aout, "audio-device", val );
     }
+
     /* If we change the device we want to use, we should renegotiate the audio chain */
     var_AddCallback( p_aout, "audio-device", AudioDeviceCallback, NULL );
 
@@ -1057,7 +1060,7 @@ static void Probe( aout_instance_t * p_aout )
     return;
 
 error:
-    var_Destroy( p_aout, "audio-device" );
+    msg_Warn( p_aout, "audio device already in use" );
     free( p_devices );
     return;
 }
@@ -1069,10 +1072,10 @@ static int AudioDeviceHasOutput( AudioDeviceID i_dev_id )
 {
     UInt32            dataSize;
     Boolean            isWritable;
-    
+
     verify_noerr( AudioDeviceGetPropertyInfo( i_dev_id, 0, FALSE, kAudioDevicePropertyStreams, &dataSize, &isWritable) );
     if (dataSize == 0) return FALSE;
+
     return TRUE;
 }
 
@@ -1086,7 +1089,7 @@ static int AudioDeviceSupportsDigital( aout_instance_t *p_aout, AudioDeviceID i_
     AudioStreamID               *p_streams = NULL;
     int                         i = 0, i_streams = 0;
     bool                  b_return = false;
+
     /* Retrieve all the output streams */
     err = AudioDeviceGetPropertyInfo( i_dev_id, 0, FALSE,
                                       kAudioDevicePropertyStreams,
@@ -1096,19 +1099,16 @@ static int AudioDeviceSupportsDigital( aout_instance_t *p_aout, AudioDeviceID i_
         msg_Err( p_aout, "could not get number of streams: [%4.4s]", (char *)&err );
         return false;
     }
+
     i_streams = i_param_size / sizeof( AudioStreamID );
     p_streams = (AudioStreamID *)malloc( i_param_size );
     if( p_streams == NULL )
-    {
-        msg_Err( p_aout, "out of memory" );
         return VLC_ENOMEM;
-    }
+
     err = AudioDeviceGetProperty( i_dev_id, 0, FALSE,
                                     kAudioDevicePropertyStreams,
                                     &i_param_size, p_streams );
+
     if( err != noErr )
     {
         msg_Err( p_aout, "could not get number of streams: [%4.4s]", (char *)&err );
@@ -1120,7 +1120,7 @@ static int AudioDeviceSupportsDigital( aout_instance_t *p_aout, AudioDeviceID i_
         if( AudioStreamSupportsDigital( p_aout, p_streams[i] ) )
             b_return = true;
     }
+
     free( p_streams );
     return b_return;
 }
@@ -1135,7 +1135,7 @@ static int AudioStreamSupportsDigital( aout_instance_t *p_aout, AudioStreamID i_
     AudioStreamBasicDescription *p_format_list = NULL;
     int                         i = 0, i_formats = 0;
     bool                  b_return = false;
+
     /* Retrieve all the stream formats supported by each output stream */
     err = AudioStreamGetPropertyInfo( i_stream_id, 0,
                                       kAudioStreamPropertyPhysicalFormats,
@@ -1145,15 +1145,12 @@ static int AudioStreamSupportsDigital( aout_instance_t *p_aout, AudioStreamID i_
         msg_Err( p_aout, "could not get number of streamformats: [%4.4s]", (char *)&err );
         return false;
     }
+
     i_formats = i_param_size / sizeof( AudioStreamBasicDescription );
     p_format_list = (AudioStreamBasicDescription *)malloc( i_param_size );
     if( p_format_list == NULL )
-    {
-        msg_Err( p_aout, "could not malloc the memory" );
         return false;
-    }
+
     err = AudioStreamGetProperty( i_stream_id, 0,
                                       kAudioStreamPropertyPhysicalFormats,
                                       &i_param_size, p_format_list );
@@ -1168,14 +1165,14 @@ static int AudioStreamSupportsDigital( aout_instance_t *p_aout, AudioStreamID i_
     for( i = 0; i < i_formats; i++ )
     {
         msg_Dbg( p_aout, STREAM_FORMAT_MSG( "supported format: ", p_format_list[i] ) );
+
         if( p_format_list[i].mFormatID == 'IAC3' ||
                   p_format_list[i].mFormatID == kAudioFormat60958AC3 )
         {
             b_return = true;
         }
     }
+
     free( p_format_list );
     return b_return;
 }
@@ -1190,12 +1187,12 @@ static int AudioStreamChangeFormat( aout_instance_t *p_aout, AudioStreamID i_str
     int i;
 
     struct { vlc_mutex_t lock; vlc_cond_t cond; } w;
+
     msg_Dbg( p_aout, STREAM_FORMAT_MSG( "setting stream format: ", change_format ) );
 
     /* Condition because SetProperty is asynchronious */
-    vlc_cond_init( p_aout, &w.cond );
-    vlc_mutex_init( p_aout, &w.lock );
+    vlc_cond_init( &w.cond );
+    vlc_mutex_init( &w.lock );
     vlc_mutex_lock( &w.lock );
 
     /* Install the callback */
@@ -1249,7 +1246,7 @@ static int AudioStreamChangeFormat( aout_instance_t *p_aout, AudioStreamID i_str
         }
         /* We need to check again */
     }
+
     /* Removing the property listener */
     err = AudioStreamRemovePropertyListener( i_stream_id, 0,
                                             kAudioStreamPropertyPhysicalFormat,
@@ -1259,12 +1256,12 @@ static int AudioStreamChangeFormat( aout_instance_t *p_aout, AudioStreamID i_str
         msg_Err( p_aout, "AudioStreamRemovePropertyListener failed: [%4.4s]", (char *)&err );
         return false;
     }
+
     /* Destroy the lock and condition */
     vlc_mutex_unlock( &w.lock );
     vlc_mutex_destroy( &w.lock );
     vlc_cond_destroy( &w.cond );
+
     return true;
 }
 
@@ -1277,7 +1274,7 @@ static int AudioStreamChangeFormat( aout_instance_t *p_aout, AudioStreamID i_str
 static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
                                       AudioUnitRenderActionFlags *ioActionFlags,
                                       const AudioTimeStamp *inTimeStamp,
-                                      unsigned int inBusNummer,
+                                      unsigned int inBusNumber,
                                       unsigned int inNumberFrames,
                                       AudioBufferList *ioData )
 {
@@ -1288,6 +1285,10 @@ static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
     aout_instance_t * p_aout = (aout_instance_t *)_p_aout;
     struct aout_sys_t * p_sys = p_aout->output.p_sys;
 
+    VLC_UNUSED(ioActionFlags);
+    VLC_UNUSED(inBusNumber);
+    VLC_UNUSED(inNumberFrames);
+
     host_time.mFlags = kAudioTimeStampHostTimeValid;
     AudioDeviceTranslateTime( p_sys->i_selected_dev, inTimeStamp, &host_time );
 
@@ -1312,32 +1313,39 @@ static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
     if( p_sys->i_total_bytes > 0 )
     {
         i_mData_bytes = __MIN( p_sys->i_total_bytes - p_sys->i_read_bytes, ioData->mBuffers[0].mDataByteSize );
-        p_aout->p_libvlc->pf_memcpy( ioData->mBuffers[0].mData, &p_sys->p_remainder_buffer[p_sys->i_read_bytes], i_mData_bytes );
+        vlc_memcpy( ioData->mBuffers[0].mData,
+                    &p_sys->p_remainder_buffer[p_sys->i_read_bytes],
+                    i_mData_bytes );
         p_sys->i_read_bytes += i_mData_bytes;
         current_date += (mtime_t) ( (mtime_t) 1000000 / p_aout->output.output.i_rate ) *
                         ( i_mData_bytes / 4 / aout_FormatNbChannels( &p_aout->output.output )  ); // 4 is fl32 specific
+
         if( p_sys->i_read_bytes >= p_sys->i_total_bytes )
             p_sys->i_read_bytes = p_sys->i_total_bytes = 0;
     }
+
     while( i_mData_bytes < ioData->mBuffers[0].mDataByteSize )
     {
         /* We don't have enough data yet */
         aout_buffer_t * p_buffer;
         p_buffer = aout_OutputNextBuffer( p_aout, current_date , false );
+
         if( p_buffer != NULL )
         {
-            uint32_t i_second_mData_bytes = __MIN( p_buffer->i_nb_bytes, ioData->mBuffers[0].mDataByteSize - i_mData_bytes );
-            p_aout->p_libvlc->pf_memcpy( (uint8_t *)ioData->mBuffers[0].mData + i_mData_bytes, p_buffer->p_buffer, i_second_mData_bytes );
+            uint32_t i_second_mData_bytes = __MIN( p_buffer->i_buffer, ioData->mBuffers[0].mDataByteSize - i_mData_bytes );
+
+            vlc_memcpy( (uint8_t *)ioData->mBuffers[0].mData + i_mData_bytes,
+                        p_buffer->p_buffer, i_second_mData_bytes );
             i_mData_bytes += i_second_mData_bytes;
 
             if( i_mData_bytes >= ioData->mBuffers[0].mDataByteSize )
             {
-                p_sys->i_total_bytes = p_buffer->i_nb_bytes - i_second_mData_bytes;
-                p_aout->p_libvlc->pf_memcpy( p_sys->p_remainder_buffer, &p_buffer->p_buffer[i_second_mData_bytes], p_sys->i_total_bytes );
+                p_sys->i_total_bytes = p_buffer->i_buffer - i_second_mData_bytes;
+                vlc_memcpy( p_sys->p_remainder_buffer,
+                            &p_buffer->p_buffer[i_second_mData_bytes],
+                            p_sys->i_total_bytes );
+                aout_BufferFree( p_buffer );
+                break;
             }
             else
             {
@@ -1349,7 +1357,8 @@ static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
         }
         else
         {
-             p_aout->p_libvlc->pf_memset( (uint8_t *)ioData->mBuffers[0].mData +i_mData_bytes, 0, ioData->mBuffers[0].mDataByteSize - i_mData_bytes );
+             vlc_memset( (uint8_t *)ioData->mBuffers[0].mData +i_mData_bytes,
+                         0,ioData->mBuffers[0].mDataByteSize - i_mData_bytes );
              i_mData_bytes += ioData->mBuffers[0].mDataByteSize - i_mData_bytes;
         }
     }
@@ -1373,6 +1382,10 @@ static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice,
     aout_instance_t * p_aout = (aout_instance_t *)threadGlobals;
     struct aout_sys_t * p_sys = p_aout->output.p_sys;
 
+    VLC_UNUSED(inDevice);
+    VLC_UNUSED(inInputData);
+    VLC_UNUSED(inInputTime);
+
     /* Check for the difference between the Device clock and mdate */
     p_sys->clock_diff = - (mtime_t)
         AudioConvertHostTimeToNanos( inNow->mHostTime ) / 1000;
@@ -1387,17 +1400,16 @@ static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice,
 #define BUFFER outOutputData->mBuffers[p_sys->i_stream_index]
     if( p_buffer != NULL )
     {
-        if( (int)BUFFER.mDataByteSize != (int)p_buffer->i_nb_bytes)
-            msg_Warn( p_aout, "bytesize: %d nb_bytes: %d", (int)BUFFER.mDataByteSize, (int)p_buffer->i_nb_bytes );
+        if( (int)BUFFER.mDataByteSize != (int)p_buffer->i_buffer)
+            msg_Warn( p_aout, "bytesize: %d nb_bytes: %d", (int)BUFFER.mDataByteSize, (int)p_buffer->i_buffer );
+
         /* move data into output data buffer */
-        p_aout->p_libvlc->pf_memcpy( BUFFER.mData,
-                                  p_buffer->p_buffer, p_buffer->i_nb_bytes );
+        vlc_memcpy( BUFFER.mData, p_buffer->p_buffer, p_buffer->i_buffer );
         aout_BufferFree( p_buffer );
     }
     else
     {
-        p_aout->p_libvlc->pf_memset( BUFFER.mData, 0, BUFFER.mDataByteSize );
+        vlc_memset( BUFFER.mData, 0, BUFFER.mDataByteSize );
     }
 #undef BUFFER
 
@@ -1419,7 +1431,7 @@ static OSStatus HardwareListener( AudioHardwarePropertyID inPropertyID,
         {
             /* something changed in the list of devices */
             /* We trigger the audio-device's aout_ChannelsRestart callback */
-            var_Change( p_aout, "audio-device", VLC_VAR_TRIGGER_CALLBACKS, NULL, NULL );
+            var_TriggerCallback( p_aout, "audio-device" );
             var_Destroy( p_aout, "audio-device" );
         }
         break;
@@ -1438,7 +1450,10 @@ static OSStatus StreamListener( AudioStreamID inStream,
 {
     OSStatus err = noErr;
     struct { vlc_mutex_t lock; vlc_cond_t cond; } * w = inClientData;
+
+    VLC_UNUSED(inStream);
+    VLC_UNUSED(inChannel);
+
     switch( inPropertyID )
     {
         case kAudioStreamPropertyPhysicalFormat:
@@ -1461,7 +1476,7 @@ static int AudioDeviceCallback( vlc_object_t *p_this, const char *psz_variable,
 {
     aout_instance_t *p_aout = (aout_instance_t *)p_this;
     var_Set( p_aout->p_libvlc, "macosx-audio-device", new_val );
-    msg_Dbg( p_aout, "Set Device: %#x", new_val.i_int );
+    msg_Dbg( p_aout, "Set Device: %#"PRIx64, new_val.i_int );
     return aout_ChannelsRestart( p_this, psz_variable, old_val, new_val, param );
 }