X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fbeos%2FAudioOutput.cpp;h=f68b2062791a1c880f0968214cac26601eef1b0e;hb=f485214f09dd284cbb85674e937fbbb0a6032a2e;hp=cb5883103c46c85c0a0847c96c7c3d83d050ad61;hpb=d068701b3be13a67de51be02e77d2960fe1771db;p=vlc diff --git a/modules/gui/beos/AudioOutput.cpp b/modules/gui/beos/AudioOutput.cpp index cb5883103c..f68b206279 100644 --- a/modules/gui/beos/AudioOutput.cpp +++ b/modules/gui/beos/AudioOutput.cpp @@ -1,17 +1,18 @@ /***************************************************************************** - * aout.cpp: BeOS audio output + * AudioOutput.cpp: BeOS audio output ***************************************************************************** - * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: AudioOutput.cpp,v 1.4 2002/08/19 21:54:37 massiot Exp $ + * Copyright (C) 1999, 2000, 2001 the VideoLAN team + * $Id$ * * Authors: Jean-Marc Dressler * Samuel Hocevar + * Eric Petit * * 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 * 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 @@ -19,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. *****************************************************************************/ /***************************************************************************** @@ -27,164 +28,148 @@ *****************************************************************************/ #include #include /* malloc(), free() */ -#include -#include -#include -#include -#include -#include -#include #include #include +#include +#include + + #include #include -#include "aout_internal.h" +extern "C" +{ + #include +} /***************************************************************************** * aout_sys_t: BeOS audio output method descriptor - ***************************************************************************** - * This structure is part of the audio output thread descriptor. - * It describes some BeOS specific variables. *****************************************************************************/ -struct aout_sys_t + +typedef struct aout_sys_t { - BPushGameSound * p_sound; - gs_audio_format * p_format; - void * p_buffer; - int i_buffer_size; - int i_buffer_pos; - mtime_t clock_diff; + BSoundPlayer * p_player; + mtime_t latency; -}; +} aout_sys_t; /***************************************************************************** * Local prototypes. *****************************************************************************/ -static int SetFormat ( aout_instance_t * ); -//static int GetBufInfo ( aout_instance_t *, int ); -static void Play ( aout_instance_t * ); +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: opens a BPushGameSound + * OpenAudio *****************************************************************************/ int E_(OpenAudio) ( vlc_object_t * p_this ) -{ - - aout_instance_t * p_aout = (aout_instance_t *)p_this; - struct aout_sys_t * p_sys; - - /* Allocate instance */ - p_sys = p_aout->output.p_sys = (aout_sys_t *)malloc( sizeof( struct aout_sys_t ) ); - memset( p_sys, 0, sizeof( struct aout_sys_t ) ); +{ + 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 ); + return -1; } - p_aout->output.pf_setformat = SetFormat; - p_sys->p_format = (gs_audio_format *)malloc( sizeof( struct gs_audio_format)); - SetFormat(p_aout); - /* Allocate BPushGameSound */ - p_sys->p_sound = new BPushGameSound( 8192, - p_sys->p_format, - 2, NULL ); - if( p_sys->p_sound == NULL ) + aout_sys_t * p_sys = p_aout->output.p_sys; + + aout_VolumeSoftInit( p_aout ); + + int i_nb_channels = aout_FormatNbChannels( &p_aout->output.output ); + /* BSoundPlayer does not support more than 2 channels AFAIK */ + if( i_nb_channels > 2 ) { - free( p_sys->p_format ); - free( p_sys ); - msg_Err( p_aout, "cannot allocate BPushGameSound" ); - return( 1 ); + i_nb_channels = 2; + p_aout->output.output.i_physical_channels + = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; } - if( p_sys->p_sound->InitCheck() != B_OK ) + 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_format->buffer_size = 8192; + + 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 ); + if( p_sys->p_player->InitCheck() != B_OK ) { - free( p_sys->p_format ); + msg_Err( p_aout, "BSoundPlayer InitCheck failed" ); + delete p_sys->p_player; free( p_sys ); - msg_Err( p_aout, "cannot initialize BPushGameSound" ); - return( 1 ); + return -1; } - p_sys->p_sound->StartPlaying( ); - - p_sys->p_sound->LockForCyclic( &p_sys->p_buffer, - (size_t *)&p_sys->i_buffer_size ); + /* Start playing */ + p_sys->latency = p_sys->p_player->Latency(); + p_sys->p_player->Start(); + p_sys->p_player->SetHasData( true ); - p_aout->output.pf_setformat = SetFormat; - p_aout->output.pf_play = Play; - return( 0 ); + return 0; } /***************************************************************************** - * SetFormat: sets the dsp output format + * CloseAudio *****************************************************************************/ -static int SetFormat( aout_instance_t *p_aout ) +void E_(CloseAudio) ( vlc_object_t * p_this ) { - /* Initialize some variables */ - p_aout->output.p_sys->p_format->frame_rate = p_aout->output.output.i_rate; - p_aout->output.p_sys->p_format->channel_count = p_aout->output.output.i_channels; - p_aout->output.p_sys->p_format->format = gs_audio_format::B_GS_S16; - p_aout->output.p_sys->p_format->byte_order = B_MEDIA_LITTLE_ENDIAN; - p_aout->output.p_sys->p_format->buffer_size = 4*8192; - p_aout->output.p_sys->i_buffer_pos = 0; - msg_Err( p_aout, "Rate: %d, Channels: %d", p_aout->output.output.i_rate, p_aout->output.output.i_channels); - -// p_aout->output.pf_getbufinfo = GetBufInfo; - return( 0 ); + 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 ); } /***************************************************************************** - * Play: plays a sound samples buffer - ***************************************************************************** - * This function writes a buffer of i_length bytes in the dsp + * Play *****************************************************************************/ -static void Play( aout_instance_t *p_aout ) +static void Play( void * _p_aout, void * _p_buffer, size_t i_size, + const media_raw_audio_format &format ) { - aout_buffer_t * p_buffer = aout_FifoPop( p_aout, &p_aout->output.fifo ); - int i_newbuf_pos; + 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; - if( (i_newbuf_pos = p_aout->output.p_sys->i_buffer_pos + p_buffer->i_size) - > p_aout->output.p_sys->i_buffer_size ) - { - p_aout->p_vlc->pf_memcpy( (void *)((int)p_aout->output.p_sys->p_buffer - + p_aout->output.p_sys->i_buffer_pos), - p_buffer->p_buffer, - p_aout->output.p_sys->i_buffer_size - p_aout->output.p_sys->i_buffer_pos ); - - p_aout->p_vlc->pf_memcpy( (void *)((int)p_aout->output.p_sys->p_buffer), - p_buffer->p_buffer + p_aout->output.p_sys->i_buffer_size - p_aout->output.p_sys->i_buffer_pos, - p_buffer->i_size - ( p_aout->output.p_sys->i_buffer_size - - p_aout->output.p_sys->i_buffer_pos ) ); - - p_aout->output.p_sys->i_buffer_pos = i_newbuf_pos - p_aout->output.p_sys->i_buffer_size; + p_aout_buffer = aout_OutputNextBuffer( p_aout, + mdate() + p_sys->latency, + VLC_FALSE ); + if( p_aout_buffer != NULL ) + { + 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_vlc->pf_memcpy( (void *)((int)p_aout->output.p_sys->p_buffer + p_aout->output.p_sys->i_buffer_pos), - p_buffer->p_buffer, p_buffer->i_size ); - - p_aout->output.p_sys->i_buffer_pos = i_newbuf_pos; + p_aout->p_libvlc->pf_memset( p_buffer, 0, i_size ); } } /***************************************************************************** - * CloseAudio: closes the dsp audio device - *****************************************************************************/ -void E_(CloseAudio) ( vlc_object_t *p_this ) -{ - aout_instance_t * p_aout = (aout_instance_t *)p_this; - - p_aout->output.p_sys->p_sound->UnlockCyclic(); - p_aout->output.p_sys->p_sound->StopPlaying( ); - delete p_aout->output.p_sys->p_sound; - free( p_aout->output.p_sys->p_format ); - free( p_aout->output.p_sys ); -} - -/***************************************************************************** - * SDLCallback: what to do once SDL has played sound samples + * DoNothing *****************************************************************************/ -static void BeOSCallback( void * _p_aout, byte_t * p_stream, int i_len ) +static void DoNothing( aout_instance_t *p_aout ) { + return; }