예제 #1
0
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();
	}
}
예제 #3
0
파일: sound.c 프로젝트: Oibaf66/fbzx-wii
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;
	}
}