From: Fredrick M. <fr...@us...> - 2007-02-10 00:55:07
|
Update of /cvsroot/fuse-emulator/fuse/sound In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv21629/sound Modified Files: coreaudiosound.c sdlsound.c Log Message: Make sound fifo two frames in size rather than a multiple of the sound fragment size, make sound callbacks run after some sound is available, calculate SDL fragment size based on machine speed and output frequency. Index: sdlsound.c =================================================================== RCS file: /cvsroot/fuse-emulator/fuse/sound/sdlsound.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** sdlsound.c 22 Dec 2006 10:55:46 -0000 1.18 --- sdlsound.c 10 Feb 2007 00:53:28 -0000 1.19 *************** *** 29,32 **** --- 29,33 ---- #include <errno.h> #include <fcntl.h> + #include <math.h> #include <string.h> #include <stdlib.h> *************** *** 42,58 **** #include "ui/ui.h" - /* using (7) 32 byte frags for 8kHz, scale up for higher */ - #define BASE_SOUND_FRAG_PWR 7 - static void sdlwrite( void *userdata, Uint8 *stream, int len ); sfifo_t sound_fifo; int sound_lowlevel_init( const char *device, int *freqptr, int *stereoptr ) { SDL_AudioSpec requested, received; - int frag; int error; /* I'd rather just use setenv, but Windows doesn't have it */ --- 43,63 ---- #include "ui/ui.h" static void sdlwrite( void *userdata, Uint8 *stream, int len ); sfifo_t sound_fifo; + /* Number of Spectrum frames audio latency to use */ + #define NUM_FRAMES 2 + + /* Records sound writer status information */ + static int audio_output_started; + int sound_lowlevel_init( const char *device, int *freqptr, int *stereoptr ) { SDL_AudioSpec requested, received; int error; + float hz; + int sound_framesiz; /* I'd rather just use setenv, but Windows doesn't have it */ *************** *** 81,93 **** requested.callback = sdlwrite; ! frag = BASE_SOUND_FRAG_PWR; ! if (*freqptr > 8250) ! frag++; ! if (*freqptr > 16500) ! frag++; ! if (*freqptr > 33000) ! frag++; ! ! requested.samples = 1 << frag; if ( SDL_OpenAudio( &requested, &received ) < 0 ) { --- 86,93 ---- requested.callback = sdlwrite; ! hz = (float)machine_current->timings.processor_speed / ! machine_current->timings.tstates_per_frame; ! sound_framesiz = *freqptr / hz; ! requested.samples = pow(2.0, floor(log2(sound_framesiz))); if ( SDL_OpenAudio( &requested, &received ) < 0 ) { *************** *** 107,119 **** requested.freq = *freqptr; ! frag = BASE_SOUND_FRAG_PWR; ! if (*freqptr > 8250) ! frag++; ! if (*freqptr > 16500) ! frag++; ! if (*freqptr > 33000) ! frag++; ! ! requested.samples = 1 << frag; if( SDL_OpenAudio( &requested, NULL ) < 0 ) { --- 107,114 ---- requested.freq = *freqptr; ! hz = (float)machine_current->timings.processor_speed / ! machine_current->timings.tstates_per_frame; ! sound_framesiz = *freqptr / hz; ! requested.samples = pow(2.0, floor(log2(sound_framesiz))); if( SDL_OpenAudio( &requested, NULL ) < 0 ) { *************** *** 123,137 **** return 1; } - - /* Convert from 16-bit stereo samples to bytes plus some headroom */ - frag = 1 << (frag+3); - } else { - *freqptr = received.freq; *stereoptr = received.channels == 1 ? 0 : 1; - frag = received.size; } ! if( ( error = sfifo_init( &sound_fifo, 2 * frag + 1 ) ) ) { ui_error( UI_ERROR_ERROR, "Problem initialising sound fifo: %s", strerror ( error ) ); --- 118,133 ---- return 1; } } else { *stereoptr = received.channels == 1 ? 0 : 1; } ! hz = (float)machine_current->timings.processor_speed / ! machine_current->timings.tstates_per_frame; ! sound_framesiz = *freqptr / hz; ! sound_framesiz <<= 1; ! ! if( ( error = sfifo_init( &sound_fifo, NUM_FRAMES ! * received.channels ! * sound_framesiz + 1 ) ) ) { ui_error( UI_ERROR_ERROR, "Problem initialising sound fifo: %s", strerror ( error ) ); *************** *** 139,143 **** } ! SDL_PauseAudio( 0 ); return 0; --- 135,140 ---- } ! /* wait to run sound until we have some sound to play */ ! audio_output_started = 0; return 0; *************** *** 178,181 **** --- 175,183 ---- strerror( i ) ); } + + if( !audio_output_started ) { + SDL_PauseAudio( 0 ); + audio_output_started = 1; + } } Index: coreaudiosound.c =================================================================== RCS file: /cvsroot/fuse-emulator/fuse/sound/coreaudiosound.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** coreaudiosound.c 22 Dec 2006 11:33:53 -0000 1.2 --- coreaudiosound.c 10 Feb 2007 00:53:28 -0000 1.3 *************** *** 29,32 **** --- 29,33 ---- #include <AudioUnit/AudioUnit.h> + #include "settings.h" #include "sfifo.h" #include "sound.h" *************** *** 35,38 **** --- 36,42 ---- sfifo_t sound_fifo; + /* Number of Spectrum frames audio latency to use */ + #define NUM_FRAMES 2 + static OSStatus coreaudiowrite( void *inRefCon, *************** *** 50,53 **** --- 54,60 ---- static AudioUnit gOutputUnit; + /* Records sound writer status information */ + static int audio_output_started; + int sound_lowlevel_init( const char *dev, int *freqptr, int *stereoptr ) *************** *** 59,62 **** --- 66,71 ---- kAudioDevicePropertyBufferSize */ int error; + float hz; + int sound_framesiz; /* get the default output device for the HAL */ *************** *** 159,164 **** } ! if( ( error = sfifo_init( &sound_fifo, 2 * deviceFormat.mChannelsPerFrame ! * deviceBufferSize + 1 ) ) ) { ui_error( UI_ERROR_ERROR, "Problem initialising sound fifo: %s", strerror ( error ) ); --- 168,179 ---- } ! hz = (float)machine_current->timings.processor_speed / ! machine_current->timings.tstates_per_frame; ! sound_framesiz = deviceFormat.mSampleRate / hz; ! ! if( ( error = sfifo_init( &sound_fifo, NUM_FRAMES ! * deviceFormat.mBytesPerFrame ! * deviceFormat.mChannelsPerFrame ! * sound_framesiz + 1 ) ) ) { ui_error( UI_ERROR_ERROR, "Problem initialising sound fifo: %s", strerror ( error ) ); *************** *** 166,177 **** } ! /* Start the rendering ! The DefaultOutputUnit will do any format conversions to the format of the ! default device */ ! err = AudioOutputUnitStart( gOutputUnit ); ! if( err ) { ! ui_error( UI_ERROR_ERROR, "AudioOutputUnitStart=%ld", err ); ! return 1; ! } return 0; --- 181,186 ---- } ! /* wait to run sound until we have some sound to play */ ! audio_output_started = 0; return 0; *************** *** 183,187 **** OSStatus err; ! verify_noerr( AudioOutputUnitStop( gOutputUnit ) ); err = AudioUnitUninitialize( gOutputUnit ); --- 192,197 ---- OSStatus err; ! if( audio_output_started ) ! verify_noerr( AudioOutputUnitStop( gOutputUnit ) ); err = AudioUnitUninitialize( gOutputUnit ); *************** *** 219,222 **** --- 229,245 ---- strerror( i ) ); } + + if( !audio_output_started ) { + /* Start the rendering + The DefaultOutputUnit will do any format conversions to the format of the + default device */ + OSStatus err = AudioOutputUnitStart( gOutputUnit ); + if( err ) { + ui_error( UI_ERROR_ERROR, "AudioOutputUnitStart=%ld", err ); + return; + } + + audio_output_started = 1; + } } |