static void ogg_add_callback(int voice) { if (!ogg_thread_running) { ASND_StopVoice(0); return; } if (private_ogg.flag & 128) return; // Ogg is paused if (private_ogg.pcm_indx >= READ_SAMPLES) { if (ASND_AddVoice(0, (void *) private_ogg.pcmout[private_ogg.pcmout_pos], private_ogg.pcm_indx << 1) == 0) { private_ogg.pcmout_pos ^= 1; private_ogg.pcm_indx = 0; private_ogg.flag = 0; LWP_ThreadSignal(oggplayer_queue); } } else { if (private_ogg.flag & 64) { private_ogg.flag &= ~64; LWP_ThreadSignal(oggplayer_queue); } } }
extern "C" void SoundCallback(s32 voice) { SoundDecoder * decoder = SoundHandler::Instance()->Decoder(voice); if(!decoder) return; if(decoder->IsBufferReady()) { if(ASND_AddVoice(voice, decoder->GetBuffer(), decoder->GetBufferSize()) == SND_OK) { decoder->LoadNext(); SoundHandler::Instance()->ThreadSignal(); } } else if(decoder->IsEOF()) { ASND_StopVoice(voice); //if(voice == 0) //MusicPlayer::Instance()->SetPlaybackFinished(true); //see if next music must be played } else { SoundHandler::Instance()->ThreadSignal(); } }
void sound_play() { #if defined(D_SOUND_OSS) || defined(D_SOUND_ALSA) || defined(D_SOUND_PULSE) static int retval,retval2; #endif ordenador.current_buffer=sound[0]; //remove_dc(ordenador.current_buffer,ordenador.buffer_len); switch(sound_type) { case SOUND_NO: // no sound usleep(75000); // wait 1/20 second return; break; case SOUND_SDL: // SDL if (!started_sound_sdl) { SDL_PauseAudio(0); ordenador.current_buffer = sound[0]; buffer0_occupied=1; started_sound_sdl = 1; buffer_reading=0; } //Double buffer while ((buffer0_occupied)&&(buffer1_occupied)){usleep(1000);}; //Wait for one buffer to be free if (!buffer0_occupied) //Buffer 0 is now free {buffer0_occupied=1; ordenador.current_buffer = sound[0]; } else //Buffer 1 is now free {buffer1_occupied=1; ordenador.current_buffer = sound[1]; } return; break; #ifdef D_SOUND_OSS case SOUND_OSS: // OSS retval=write(audio_fd,ordenador.current_buffer,ordenador.buffer_len*ordenador.increment); return; break; #endif #ifdef D_SOUND_ALSA case SOUND_ALSA: // ALSA if (started_sound==0) { snd_pcm_prepare (_soundDevice); started_sound=1; } retval=snd_pcm_writei(_soundDevice,sound[0],ordenador.buffer_len); if (retval<0) { retval=snd_pcm_prepare(_soundDevice); } return; break; #endif #ifdef D_SOUND_PULSE case SOUND_PULSEAUDIO: // PulseAudio // Remove the DC component to avoid losing the sound when multiplexing with other sources sound_remove_dc(ordenador.current_buffer,ordenador.buffer_len); retval=pa_simple_write(pulse_s,sound[0],ordenador.buffer_len,&retval2); return; break; #endif #ifdef GEKKO case SOUND_ASND: // ASND if (!started_sound_asnd) { ASND_SetVoice(1,VOICE_STEREO_16BIT_BE,ordenador.freq,0,sound[0],ordenador.buffer_len*ordenador.increment, 255, 255, callback); started_sound_asnd = 1; } //Double buffer while (!ASND_TestVoiceBufferReady(1)){}; //Wait for one buffer to be free if (!ASND_TestPointer (1, sound[0])) {ASND_AddVoice(1,sound[0],ordenador.buffer_len*ordenador.increment); ordenador.current_buffer = sound[0]; } else {ASND_AddVoice(1,sound[1],ordenador.buffer_len*ordenador.increment); ordenador.current_buffer = sound[1]; } return; break; #endif default: break; } }