X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fbeos%2FAudioOutput.cpp;h=0f2300ead756e69b1fb84903839c94ceac8cfa4b;hb=c809e98f5465bcf72dc80c864ce9e5dbbd679a11;hp=1c62e8908ca7720d22900b15ace1d58cacfb609b;hpb=e0ac4474b5f83dc96a549436bf28697528a86479;p=vlc diff --git a/modules/gui/beos/AudioOutput.cpp b/modules/gui/beos/AudioOutput.cpp index 1c62e8908c..0f2300ead7 100644 --- a/modules/gui/beos/AudioOutput.cpp +++ b/modules/gui/beos/AudioOutput.cpp @@ -1,8 +1,8 @@ /***************************************************************************** * AudioOutput.cpp: BeOS audio output ***************************************************************************** - * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: AudioOutput.cpp,v 1.18 2002/11/27 06:27:52 titer Exp $ + * Copyright (C) 1999, 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -12,7 +12,7 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -20,7 +20,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -34,12 +34,13 @@ #include #include -#include -#include -#include -#define FRAME_SIZE 2048 -#define BUFFER_SIZE 16384 +#include +#include +extern "C" +{ + #include +} /***************************************************************************** * aout_sys_t: BeOS audio output method descriptor @@ -47,74 +48,87 @@ typedef struct aout_sys_t { - BSoundPlayer *p_player; - + BSoundPlayer * p_player; + mtime_t latency; + } aout_sys_t; /***************************************************************************** * Local prototypes. *****************************************************************************/ -static void Play ( void *p_aout, void *p_buffer, size_t size, - const media_raw_audio_format &format ); -static void DoNothing ( aout_instance_t *p_aout ); +static void Play ( void * p_aout, void * p_buffer, size_t size, + const media_raw_audio_format & format ); +static void DoNothing ( aout_instance_t * p_aout ); /***************************************************************************** * OpenAudio *****************************************************************************/ int E_(OpenAudio) ( vlc_object_t * p_this ) { - int i_nb_channels; - aout_instance_t *p_aout = (aout_instance_t*) p_this; - p_aout->output.p_sys = (aout_sys_t *) malloc( sizeof( aout_sys_t ) ); - - aout_sys_t *p_sys = p_aout->output.p_sys; + aout_instance_t * p_aout = (aout_instance_t*) p_this; + p_aout->output.p_sys = (aout_sys_t*) malloc( sizeof( aout_sys_t ) ); + if( p_aout->output.p_sys == NULL ) + { + msg_Err( p_aout, "out of memory" ); + return -1; + } + aout_sys_t * p_sys = p_aout->output.p_sys; aout_VolumeSoftInit( p_aout ); - - media_raw_audio_format *p_format; - p_format = (media_raw_audio_format*) - malloc( sizeof( media_raw_audio_format ) ); - - p_format->frame_rate = p_aout->output.output.i_rate; - i_nb_channels = aout_FormatNbChannels( &p_aout->output.output ); - if ( i_nb_channels > 2 ) + int i_nb_channels = aout_FormatNbChannels( &p_aout->output.output ); + /* BSoundPlayer does not support more than 2 channels AFAIK */ + if( i_nb_channels > 2 ) { - /* BSoundPlayer does not support more than 2 channels AFAIK */ i_nb_channels = 2; p_aout->output.output.i_physical_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; } - p_format->channel_count = i_nb_channels; + media_raw_audio_format * p_format; + p_format = (media_raw_audio_format*) + malloc( sizeof( media_raw_audio_format ) ); + + p_format->channel_count = i_nb_channels; + p_format->frame_rate = p_aout->output.output.i_rate; p_format->format = media_raw_audio_format::B_AUDIO_FLOAT; #ifdef WORDS_BIGENDIAN p_format->byte_order = B_MEDIA_BIG_ENDIAN; #else p_format->byte_order = B_MEDIA_LITTLE_ENDIAN; #endif - p_aout->output.output.i_format = VLC_FOURCC('f','l','3','2'); + p_format->buffer_size = 8192; - p_format->buffer_size = BUFFER_SIZE; - p_aout->output.i_nb_samples = FRAME_SIZE; + p_aout->output.output.i_format = VLC_FOURCC('f','l','3','2'); + p_aout->output.i_nb_samples = 2048 / i_nb_channels; p_aout->output.pf_play = DoNothing; - - p_sys->p_player = new BSoundPlayer( p_format, "player", - Play, NULL, p_aout ); + + p_sys->p_player = new BSoundPlayer( p_format, "player", Play, NULL, p_aout ); + if( p_sys->p_player->InitCheck() != B_OK ) + { + msg_Err( p_aout, "BSoundPlayer InitCheck failed" ); + delete p_sys->p_player; + free( p_sys ); + return -1; + } + + /* Start playing */ + p_sys->latency = p_sys->p_player->Latency(); p_sys->p_player->Start(); p_sys->p_player->SetHasData( true ); - + return 0; } /***************************************************************************** * CloseAudio *****************************************************************************/ -void E_(CloseAudio) ( vlc_object_t *p_this ) +void E_(CloseAudio) ( vlc_object_t * p_this ) { aout_instance_t * p_aout = (aout_instance_t *) p_this; aout_sys_t * p_sys = (aout_sys_t *) p_aout->output.p_sys; - + + /* Clean up */ p_sys->p_player->Stop(); delete p_sys->p_player; free( p_sys ); @@ -123,29 +137,39 @@ void E_(CloseAudio) ( vlc_object_t *p_this ) /***************************************************************************** * Play *****************************************************************************/ -static void Play( void *aout, void *p_buffer, size_t i_size, +static void Play( void * _p_aout, void * _p_buffer, size_t i_size, const media_raw_audio_format &format ) { + aout_instance_t * p_aout = (aout_instance_t*) _p_aout; + float * p_buffer = (float*) _p_buffer; + aout_sys_t * p_sys = (aout_sys_t*) p_aout->output.p_sys; aout_buffer_t * p_aout_buffer; - aout_instance_t *p_aout = (aout_instance_t*) aout; - vlc_mutex_lock( &p_aout->output_fifo_lock ); - p_aout_buffer = aout_FifoPop( p_aout, &p_aout->output.fifo ); - vlc_mutex_unlock( &p_aout->output_fifo_lock ); + p_aout_buffer = aout_OutputNextBuffer( p_aout, + mdate() + p_sys->latency, + VLC_FALSE ); if( p_aout_buffer != NULL ) { - memcpy( (float*)p_buffer, - p_aout_buffer->p_buffer, - MIN( BUFFER_SIZE, p_aout_buffer->i_nb_bytes ) ); - aout_BufferFree( p_aout_buffer ); + p_aout->p_libvlc->pf_memcpy( p_buffer, p_aout_buffer->p_buffer, + MIN( i_size, p_aout_buffer->i_nb_bytes ) ); + if( p_aout_buffer->i_nb_bytes < i_size ) + { + p_aout->p_libvlc->pf_memset( p_buffer + p_aout_buffer->i_nb_bytes, + 0, i_size - p_aout_buffer->i_nb_bytes ); + } + aout_BufferFree( p_aout_buffer ); + } + else + { + p_aout->p_libvlc->pf_memset( p_buffer, 0, i_size ); } } /***************************************************************************** - * DoNothing + * DoNothing *****************************************************************************/ -static void DoNothing( aout_instance_t *p_aout) +static void DoNothing( aout_instance_t *p_aout ) { return; }