]> git.sesse.net Git - vlc/commitdiff
* backport of auhal.c [11020] trough [11310] from trunk
authorDerk-Jan Hartman <hartman@videolan.org>
Sun, 5 Jun 2005 21:56:35 +0000 (21:56 +0000)
committerDerk-Jan Hartman <hartman@videolan.org>
Sun, 5 Jun 2005 21:56:35 +0000 (21:56 +0000)
* backport of [110311]

NEWS
README.MacOSX.rtf
configure.ac
modules/audio_output/auhal.c

diff --git a/NEWS b/NEWS
index a17ce095b7f2dace2106bee5370434a5e4ea57e0..fa53a5adf52b0dc01ef92679bc3dcf279e9f7fea 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,6 @@
 $Id$
 
-Changes between 0.8.1 and 0.8.2-test1:
+Changes between 0.8.1 and 0.8.2-test2:
 -----------------------------------------------------
 
 Core support:
@@ -105,6 +105,11 @@ Windows port:
 
 MacOS X port:
  * Many Tiger related fixes
+ * A new audio module that should work more reliable for analog audio output in various configurations.
+   - Supports multichannel discrete analog output
+   - Digital audio output requires you to change a preference setting because it
+     is not yet available in the new module
+   - Please read the README.MacOSX.rtf file for more information.
 
 BeOS port:
  * Support for single-buffered overlay
@@ -116,7 +121,7 @@ Pocket PC port:
 
 Mozilla Plugin:
  * Javascript fixes
- * Mozilla plugin for MacOS X is back
+ * Mozilla plugin for MacOS X is back (not yet distributed)
 
 IE Plugin:
  * Brand new Internet Explorer ActiveX plugin
@@ -133,6 +138,7 @@ Translations:
  * Tagalog
  * Bengali
 
+
 Changes between 0.8.0 and 0.8.1:
 -----------------------------------------------------
 
index 858022609694b73936cb67731622caa9455ff769..0c621a6182c34dfb002a2cbb0e99f5f6d468419f 100644 (file)
@@ -2,7 +2,7 @@
 {\fonttbl\f0\fswiss\fcharset77 Helvetica;\f1\fswiss\fcharset77 Helvetica-Bold;\f2\fmodern\fcharset77 Courier;
 }
 {\colortbl;\red255\green255\blue255;}
-\vieww17160\viewh15400\viewkind0
+\vieww9000\viewh9000\viewkind0
 \pard\tx1440\tx2880\tx4320\tx5760\tx7200\qc
 
 \f0\fs48 \cf0 VLC media player, version 0.8\
@@ -15,7 +15,7 @@ Mac OS X-specific information
 \cf0 Welcome to the VLC media player! VLC media player is a multi-purpose multimedia tool. It can play DVDs, VCDs or read a stream from the network. It plays DivX/MPEG-4 files (and many other files) and is unaffected by the dreaded .avi bug which can cause choppy sound when playing DivX in QuickTime Player. You can also stream content to the network or a file.\
 For a full list of features visit: \ul http://www.videolan.org/vlc/features.html\ulnone \
 \
-VLC media player was originally developed for GNU/Linux systems, but has been ported to numerous operating systems, including Mac OS X and Win32. Though there probably are bugs, we are always working hard to improve VLC media player and if you think you can help us in any way, please drop us a line: \ul http://www.videolan.org/support/lists.html\
+VLC media player was originally developed for GNU/Linux systems, but has been ported to numerous operating systems, including Mac OS X and Win32. Though there probably are bugs, we are always working hard to improve VLC media player and if you think you can help us in any way, please drop us a line: \ul http://www.videolan.org/support/lists.html \ulnone  or\ul \
 http://forum.videolan.org/\ulnone \
 \
 The following frequently asked questions are answered below :\
@@ -33,7 +33,12 @@ The following frequently asked questions are answered below :\
 11. How do i get fullscreen video on my other monitor ?\
 12. Multiple sound-devices and multi-channel sound?
 \f0\b0 \ulnone \
-\
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qj
+
+\f1\b \cf0 \ul \ulc0 13. I have a problem or a feature request \
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qj
+
+\f0\b0 \cf0 \ulnone \
 \
 
 \f1\b \ul 1. How do I install ?
@@ -98,13 +103,12 @@ Simply drag VLC from the place where you had installed it, to the Trash.\
 
 \f1\b \ul 9. Support for files with subtitles.\
 
-\f0\b0 \ulnone - VLC will autodected subtitle files when they are in the same directory as your movie and contain the movie name.\
-- DVD and autodectected subtitles  can be enabled trough the Controls->Subtitles menu-item.\
+\f0\b0 \ulnone - VLC will autodetect subtitle files when they are in the same directory as your movie and contain the movie's filename.\
+- DVD and autodetected subtitles  can be enabled trough the Video -> Subtitles Track menu-item.\
 - Only Vobsub, MicroDVD, SubRIP, SSA1-4. SAMI and vplayer subtitle files are supported at the moment.\
 - You cannot change anything about DVD and Vobsub subtitles.\
 - You can add any subtitle files to a video file via the Open.. dialog.\
-- A text-encoding and fontsize is automatically chosen, but for some people this can be incorrect. You can change these by using the Open File menu entry and setting the subtitle options when you open a movie.\
-- Text subtitles are by default centered. If you want them to be aligned left or right you can change this in Preferences -> Modules ->  decoder -> subsdec\
+- A text-encoding and fontsize is automatically chosen, but for some people this can be incorrect. You can change these by using the Open File menu entry and setting the subtitle settngs when you open a movie.\
 - For Arabic, Hebrew and Japanese etc, you need to select a font compatible with these languages. You can change the default font in Preferences -> Modules ->  text-renderer -> freetype\
 - You cannot change the font color or the thickness of the outlines.\
 \
@@ -118,21 +122,25 @@ Hold your mouse still on top of an option for just over a second and a ToolTip w
 
 \f1\b \ul 11. How do I get fullscreen video on my other monitor ? 
 \f0\b0 \ulnone \
-If you want to use your second screen for fullscreen playback, then look at the Video->Screen menuitem. You can set this option permanently by going into the Preferences and choosing Modules -> video output -> macosx -> video device (You will need to choose "Show Advanced options" first).\
+If you want to use your second screen for fullscreen playback, then look at the Video->Video Device menuitem. You can set this option permanently by going into the Preferences and choosing Interface -> General -> macosx -> video device (You will need to choose "Show Advanced options" first).\
 \
 \
 
 \f1\b \ul 12. Multiple sound-devices and multi-channel sound? \
 
 \f0\b0 \ulnone Look at the Audio->Device menuitem. You can set this option permanently by going into the Preferences and choosing Modules -> audio output -> coreaudio -> audio device (You will need to choose "Show Advanced options" first).\
-- AC3 over SPDIF with M-Audio Sonica Theater does not work. This is most likely a driver bug which has been reported to M-Audio.\
-- VLC is known to have lots of problems on G5's. Try going into the preferences -> Modules -> audio output -> coreaudio. Now change the device value from 0 to 1. Choose Save and Quit and restart VLC.\
-- Many problems might still exist. Multiple channel audio support is pretty new on Mac OS X and there are many bugs in the system software, the device drivers and probably in VLC media player as well.\
-- Someone with CoreAudio knowledge is very much invited to assist is in fixing all the bugs that linger in this area.\
+- You should change your speakerlayout in the Audio Midi Setup utility. The program is located in /Applications/Utilities.\
+Select your audio device in "Properties For:", then click the "Configure Speakers" button. Choose "Multichannel". Even if these settings are correct, you should change them and click "Apply", then change them back and again click "Apply". This is important, otherwise VLC cannot reliably detect which speakers are connected.\
+- We are in a transitional phase for our Mac OS X audio system. Therefore it is currently not possible to use Digital audio without changing a Preferences setting. The setting is in Audio->Output modules. Change this from default to "CoreAudio output". This is the module that was also used in previous versions of VLC. It has several issues with Analog audio, but it also supports Digital audio, which the new module does not yet support. You should ONLY use this module for Digital output.\
 \
 \
-Thanks for reading this file. For additional information and support, please see: \ul http://www.videolan.org/support\ulnone \
+\pard\tx1440\tx2880\tx4320\tx5760\tx7200\qj
+
+\f1\b \cf0 \ul \ulc0 13. I have a problem or a feature request \
+
+\f0\b0 \ulnone Your first stop is \ul http://www.videolan.org/doc\ulnone . The documentation on this page can usually help you with your problems. If you cannot find an aswer there then please visit \ul http://forum.videolan.org.\ulnone  Use the Search function there and see if someone else might have already answered your question or run into your problem. Feature requests can also be made in the Request forum.\
+\
+For additional information and support, please see: \ul http://www.videolan.org/support\ulnone \
 -- \
-Christophe Massiot  and\
 Derk-Jan Hartman for the VideoLAN team.\
 $Id$}
\ No newline at end of file
index e7ab5a47d0e49d977df498bdc0a88e1c678283e0..735b2258a54947a7ce1700b831f6651e607a34e2 100644 (file)
@@ -3381,13 +3381,7 @@ if test "${enable_coreaudio}" != "no" &&
 then
   AC_CHECK_HEADERS(CoreAudio/CoreAudio.h, 
     [ VLC_ADD_BUILTINS([coreaudio auhal])
-      VLC_ADD_LDFLAGS([coreaudio auhal],[-framework CoreAudio -framework AudioUnit])
-      AC_MSG_CHECKING(for kAudioConverterPrimeMethod in AudioToolbox/AudioConverter.h)
-      AC_EGREP_HEADER(kAudioConverterPrimeMethod,AudioToolbox/AudioConverter.h,[
-        AC_MSG_RESULT(yes)
-        VLC_ADD_PLUGINS([coreaudio_resampler])
-        VLC_ADD_LDFLAGS([coreaudio_resampler auhal],[-framework AudioToolbox])
-      ],[ AC_MSG_RESULT(no) ])
+      VLC_ADD_LDFLAGS([coreaudio auhal],[-framework CoreAudio -framework AudioUnit -framework AudioToolbox])
     ], [ AC_MSG_ERROR([cannot find CoreAudio headers]) ])
 fi
 
index faa994dcf064921f41bf7712cdfd417413950655..bb446e47f36f5158407f3bd8cbdc94241cd726fb 100644 (file)
@@ -46,6 +46,7 @@
     sfm.mFramesPerPacket, sfm.mBytesPerFrame, \
     sfm.mChannelsPerFrame, sfm.mBitsPerChannel
 
+#define BUFSIZE 0xffffff
 
 /*****************************************************************************
  * aout_sys_t: private audio output method descriptor
@@ -63,6 +64,12 @@ struct aout_sys_t
     Component                   au_component;   /* The Audiocomponent we use */
     AudioUnit                   au_unit;        /* The AudioUnit we use */
     mtime_t                     clock_diff;
+    uint8_t                      p_remainder_buffer[BUFSIZE];
+    uint32_t                    i_read_bytes;
+    uint32_t                    i_total_bytes;
+    audio_date_t                end_date_t;
+    
+    
 };
 
 /*****************************************************************************
@@ -73,7 +80,7 @@ static void     Close                   ( vlc_object_t * );
 
 static void     Play                    ( aout_instance_t *);
 
-static int      DevicesList             ( aout_instance_t * );
+static int      Probe                   ( aout_instance_t * );
 static int      DeviceDigitalMode       ( aout_instance_t *, AudioDeviceID );
 static int      DigitalInit             ( aout_instance_t * );
 
@@ -92,7 +99,7 @@ static OSStatus HardwareListener        ( AudioHardwarePropertyID, void *);
 vlc_module_begin();
     set_shortname( "auhal" );
     set_description( _("HAL AudioUnit output") );
-    set_capability( "audio output", 50 );
+    set_capability( "audio output", 101 );
     set_category( CAT_AUDIO );
     set_subcategory( SUBCAT_AUDIO_AOUT );
     set_callbacks( Open, Close );
@@ -131,10 +138,10 @@ static int Open( vlc_object_t * p_this )
     /* Build a list of devices */
     if( var_Type( p_aout, "audio-device" ) == 0 )
     {
-        DevicesList( p_aout );
-        /*if( DevicesList( p_aout ) != VLC_SUCCESS );
+        Probe( p_aout );
+        /*if( Probe( p_aout ) != VLC_SUCCESS );
         {
-            msg_Err( p_aout, "DevicesList failed" );
+            msg_Err( p_aout, "Probe failed" );
             free( p_sys );
             return VLC_EGENERIC;
         }*/
@@ -254,7 +261,7 @@ static int Open( vlc_object_t * p_this )
                                 &i_param_size,
                                 layout ));
     }
-    
+
     msg_Dbg( p_aout, "Layout of AUHAL has %d channels" , (int)layout->mNumberChannelDescriptions );
     
     p_aout->output.output.i_physical_channels = 0;
@@ -293,7 +300,37 @@ static int Open( vlc_object_t * p_this )
                 continue;
             default:
                 msg_Warn( p_aout, "Unrecognized channel form provided by driver: %d", (int)layout->mChannelDescriptions[i].mChannelLabel );
-                p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+                switch( layout->mNumberChannelDescriptions )
+                {
+                    /* We make assumptions based on number of channels here.
+                     * Unfortunatly Apple has provided no 100% method to retrieve the speaker configuration */
+                    case 1:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_CENTER;
+                        break;
+                    case 4:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
+                                                                    AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
+                        break;
+                    case 6:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
+                                                                    AOUT_CHAN_CENTER | AOUT_CHAN_LFE |
+                                                                    AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
+                        break;
+                    case 7:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
+                                                                    AOUT_CHAN_CENTER | AOUT_CHAN_LFE |
+                                                                    AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT | AOUT_CHAN_REARCENTER;
+                        break;
+                    case 8:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
+                                                                    AOUT_CHAN_CENTER | AOUT_CHAN_LFE |
+                                                                    AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT |
+                                                                    AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
+                        break;
+                    case 2:
+                    default:
+                        p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
+                }
                 break;
         }
     }
@@ -301,6 +338,63 @@ static int Open( vlc_object_t * p_this )
 
     msg_Dbg( p_aout, "defined %d physical channels for vlc core", aout_FormatNbChannels( &p_aout->output.output ) );
     msg_Dbg( p_aout, "%s", aout_FormatPrintChannels( &p_aout->output.output ));
+    
+    AudioChannelLayout new_layout;
+    memset (&new_layout, 0, sizeof(new_layout));
+    switch( aout_FormatNbChannels( &p_aout->output.output ) )
+    {
+        case 1:
+            new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
+            break;
+        case 2:
+            new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
+            break;
+        case 3:
+            if( p_aout->output.output.i_physical_channels & AOUT_CHAN_CENTER )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_7; // L R C
+            }
+            else if( p_aout->output.output.i_physical_channels & AOUT_CHAN_LFE )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_4; // L R LFE
+            }
+            break;
+        case 4:
+            if( p_aout->output.output.i_physical_channels & ( AOUT_CHAN_CENTER | AOUT_CHAN_LFE ) )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_10; // L R C LFE
+            }
+            else if( p_aout->output.output.i_physical_channels & ( AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT ) )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_3; // L R Ls Rs
+            }
+            else if( p_aout->output.output.i_physical_channels & ( AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER ) )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_3; // L R C Cs
+            }
+            break;
+        case 5:
+            if( p_aout->output.output.i_physical_channels & ( AOUT_CHAN_CENTER ) )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_19; // L R Ls Rs C
+            }
+            else if( p_aout->output.output.i_physical_channels & ( AOUT_CHAN_LFE ) )
+            {
+                new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_18; // L R Ls Rs LFE
+            }
+            break;
+        case 6:
+            new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_DVD_20; // L R Ls Rs C LFE
+            break;
+        case 7:
+            /* FIXME: This is incorrect. VLC uses the internal ordering: L R Lm Rm Lr Rr C LFE but this is wrong */
+            new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_6_1_A; // L R C LFE Ls Rs Cs
+            break;
+        case 8:
+            /* FIXME: This is incorrect. VLC uses the internal ordering: L R Lm Rm Lr Rr C LFE but this is wrong */
+            new_layout.mChannelLayoutTag = kAudioChannelLayoutTag_MPEG_7_1_A; // L R C LFE Ls Rs Lc Rc
+            break;
+    }
 
     /* Set up the format to be used */
     DeviceFormat.mSampleRate = p_aout->output.output.i_rate;
@@ -314,9 +408,9 @@ static int Open( vlc_object_t * p_this )
     
     /* Calculate framesizes and stuff */
     aout_FormatPrepare( &p_aout->output.output );
-    DeviceFormat.mBytesPerFrame = p_aout->output.output.i_bytes_per_frame;
-    DeviceFormat.mFramesPerPacket = p_aout->output.output.i_frame_length;
-    DeviceFormat.mBytesPerPacket = p_aout->output.output.i_bytes_per_frame * p_aout->output.output.i_frame_length;
+    DeviceFormat.mFramesPerPacket = 1;
+    DeviceFormat.mBytesPerFrame = DeviceFormat.mBitsPerChannel * DeviceFormat.mChannelsPerFrame / 8;
+    DeviceFormat.mBytesPerPacket = DeviceFormat.mBytesPerFrame * DeviceFormat.mFramesPerPacket;
  
     i_param_size = sizeof(AudioStreamBasicDescription);
     /* Set desired format (Use CAStreamBasicDescription )*/
@@ -338,14 +432,17 @@ static int Open( vlc_object_t * p_this )
                                    &i_param_size ));
                                    
     msg_Dbg( p_aout, STREAM_FORMAT_MSG( "the actual set AU format is " , DeviceFormat ) );
-    
-    p_aout->output.i_nb_samples = 69 * p_aout->output.output.i_frame_length;
+
+    p_aout->output.i_nb_samples = 2048;
     aout_VolumeSoftInit( p_aout );
 
     /* Let's pray for the following operation to be atomic... */
     p_sys->clock_diff = - (mtime_t)
         AudioConvertHostTimeToNanos( AudioGetCurrentHostTime() ) / 1000; 
     p_sys->clock_diff += mdate();
+    
+    p_sys->i_read_bytes = 0;
+    p_sys->i_total_bytes = 0;
 
     /* set the IOproc callback */
     AURenderCallbackStruct input;
@@ -356,12 +453,20 @@ static int Open( vlc_object_t * p_this )
                             kAudioUnitProperty_SetRenderCallback,
                             kAudioUnitScope_Input,
                             0, &input, sizeof( input ) ) );
+
+    input.inputProc = (AURenderCallback) RenderCallbackAnalog;
+    input.inputProcRefCon = p_aout;
+    
+    /* Set the new_layout as the layout VLC feeds to the AU unit */
+    verify_noerr( AudioUnitSetProperty( p_sys->au_unit,
+                            kAudioUnitProperty_AudioChannelLayout,
+                            kAudioUnitScope_Input,
+                            0, &new_layout, sizeof(new_layout) ) );
     
     /* AU initiliaze */
     verify_noerr( AudioUnitInitialize(p_sys->au_unit) );
 
     verify_noerr( AudioOutputUnitStart(p_sys->au_unit) );
-
     return( VLC_SUCCESS );
 }
 
@@ -391,9 +496,9 @@ static void Play( aout_instance_t * p_aout )
 
 
 /*****************************************************************************
- * DevicesList
+ * Probe
  *****************************************************************************/
-static int DevicesList( aout_instance_t * p_aout )
+static int Probe( aout_instance_t * p_aout )
 {
     OSStatus            err = noErr;
     UInt32              i, i_param_size;
@@ -492,7 +597,7 @@ static int DevicesList( aout_instance_t * p_aout )
     var_AddCallback( p_aout, "audio-device", aout_ChannelsRestart, NULL );
     
     /* attach a Listener so that we are notified of a change in the Device setup */
-    /*err = AudioHardwareAddPropertyListener( kAudioHardwarePropertyDevices,
+    /* err = AudioHardwareAddPropertyListener( kAudioHardwarePropertyDevices,
                                             HardwareListener, 
                                             (void *)p_aout );
     if( err )
@@ -566,6 +671,8 @@ static int DeviceDigitalMode( aout_instance_t *p_aout, AudioDeviceID i_dev_id )
 /*****************************************************************************
  * RenderCallbackAnalog: This function is called everytime the AudioUnit wants
  * us to provide some more audio data.
+ * Don't print anything during normal playback, calling blocking function from
+ * this callback is not allowed.
  *****************************************************************************/
 static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
                                       AudioUnitRenderActionFlags *ioActionFlags,
@@ -574,78 +681,76 @@ static OSStatus RenderCallbackAnalog( vlc_object_t *_p_aout,
                                       unsigned int inNumberFrames,
                                       AudioBufferList *ioData )
 {
-    aout_buffer_t * p_buffer;
     AudioTimeStamp  host_time;
-    mtime_t         current_date;
+    mtime_t         current_date = 0;
+    uint32_t        i_mData_bytes = 0;    
 
     aout_instance_t * p_aout = (aout_instance_t *)_p_aout;
     struct aout_sys_t * p_sys = p_aout->output.p_sys;
-msg_Dbg( p_aout, "start audio packet");
-msg_Dbg( p_aout, "inbusnummer: %d",inBusNummer );
-msg_Dbg( p_aout, "inNumberFrames: %d", inNumberFrames);
 
     host_time.mFlags = kAudioTimeStampHostTimeValid;
     AudioDeviceTranslateTime( p_sys->i_selected_dev, inTimeStamp, &host_time );
 
-
     p_sys->clock_diff = - (mtime_t)
         AudioConvertHostTimeToNanos( AudioGetCurrentHostTime() ) / 1000; 
     p_sys->clock_diff += mdate();
 
+    current_date = p_sys->clock_diff +
+                   AudioConvertHostTimeToNanos( host_time.mHostTime ) / 1000;
 
-    current_date = (mtime_t) p_sys->clock_diff + mdate() + 
-                     (mtime_t) ( 1000000 * 1 );
-
-#define B_SPDI (p_aout->output.output.i_format == VLC_FOURCC('s','p','d','i'))
-    p_buffer = aout_OutputNextBuffer( p_aout, current_date, VLC_FALSE );
-#undef B_SPDI
+    if( ioData == NULL && ioData->mNumberBuffers < 1 )
+    {
+        msg_Err( p_aout, "no iodata or buffers");
+        return 0;
+    }
+    if( ioData->mNumberBuffers > 1 )
+        msg_Err( p_aout, "well this is weird. seems like there is more than one buffer..." );
 
-msg_Dbg( p_aout, "start audio packet BADABOEM");
 
-    if( p_buffer != NULL )
+    if( p_sys->i_total_bytes > 0 )
     {
-        if( ioData != NULL && ioData->mNumberBuffers > 0 )
-        {
-            if( p_buffer->i_nb_bytes*8 != ioData->mBuffers[0].mDataByteSize )
-            {
-                msg_Dbg( p_aout, "byte sizes don't match %d:%d", p_buffer->i_nb_bytes*8, ioData->mBuffers[0].mDataByteSize);
-            }
-            else
-            {
-                unsigned int i;
-                /* move data into output data buffer */
-                msg_Dbg( p_aout, "#buffers: %d", (int)ioData->mNumberBuffers );
-                for( i = 0; i < ioData->mNumberBuffers; i++ )
-                {
-                    p_aout->p_vlc->pf_memcpy( ioData->mBuffers[i].mData,
-                                      p_buffer->p_buffer, ioData->mBuffers[i].mDataByteSize );
-                }
-                msg_Dbg( p_aout, "yeah first:" );
-                aout_BufferFree( p_buffer );
-                msg_Dbg( p_aout, "yeah" );
-            }
-        }
-        else msg_Dbg( p_aout, "no iodata or buffers");
+        i_mData_bytes = __MIN( p_sys->i_total_bytes - p_sys->i_read_bytes, ioData->mBuffers[0].mDataByteSize );
+        p_aout->p_vlc->pf_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;
     }
-    else
+    
+    while( i_mData_bytes < ioData->mBuffers[0].mDataByteSize )
     {
-        msg_Dbg( p_aout, "aout_OutputNextBuffer failed" ); 
-        if( p_aout->output.output.i_format == VLC_FOURCC('f','l','3','2') )
+        /* We don't have enough data yet */
+        aout_buffer_t * p_buffer;
+        p_buffer = aout_OutputNextBuffer( p_aout, current_date , VLC_FALSE );
+        
+        if( p_buffer != NULL )
         {
-            UInt32 i;
-            float * p = (float *)ioData->mBuffers[0].mData;
+            uint32_t i_second_mData_bytes = __MIN( p_buffer->i_nb_bytes, ioData->mBuffers[0].mDataByteSize - i_mData_bytes );
+            
+            p_aout->p_vlc->pf_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;
 
-            for( i = 0; i < ioData->mBuffers[0].mDataByteSize; i++ )
+            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_vlc->pf_memcpy( p_sys->p_remainder_buffer, &p_buffer->p_buffer[i_second_mData_bytes], p_sys->i_total_bytes );
+            }
+            else
             {
-                *p++ = 0.0;
+                // update current_date
+                current_date += (mtime_t) ( (mtime_t) 1000000 / p_aout->output.output.i_rate ) *
+                                ( i_second_mData_bytes / 4 / aout_FormatNbChannels( &p_aout->output.output )  ); // 4 is fl32 specific
             }
+            aout_BufferFree( p_buffer );
         }
         else
         {
-            p_aout->p_vlc->pf_memset( ioData->mBuffers[0].mData, 0, ioData->mBuffers[0].mDataByteSize );
+             p_aout->p_vlc->pf_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;
         }
     }
-msg_Dbg( p_aout, "eof audio packet");
     return( noErr );     
 }