Example #1
0
void *sound_thread(void *data)
{
	fd_set fdset;
	struct timeval timeout;

    while(option_sound_enable)
    {
    	FD_ZERO(&fdset);
    	FD_SET(sound_fd, &fdset);
    	timeout.tv_sec = 10;
    	timeout.tv_usec = 0;

		if ( select(sound_fd+1, NULL, &fdset, NULL, &timeout) <= 0 ) {
            option_sound_enable = 0;
        } else if(sound_play) {
            qsound_update();
        } else {
            usleep(10000);
        }
    }

    pthread_exit(0);
}
Example #2
0
int32 qsf_gen(qsf_synth_t *s, int16 *buffer, uint32 samples)
{	
	int16 output[44100/30], output2[44100/30];
	int16 *stereo[2];
	int16 *outp = buffer;
	int32 i, opos, tickinc, loops;

	// our largest possible step is samples_per_tick or samples, whichever is smaller
	if (s->samples_to_next_tick > samples)
	{
		tickinc = samples;
	}
	else
	{
		tickinc = s->samples_to_next_tick;
	}

	loops = samples / tickinc;
	opos = 0;

	for (i = 0; i < loops; i++)
	{
		z80_execute(s->z80, (8000000/44100)*tickinc);
		stereo[0] = &output[opos];
		stereo[1] = &output2[opos];
		qsound_update(s->qs, 0, stereo, tickinc);

		opos += tickinc;
		s->samples_to_next_tick -= tickinc;

		if (s->samples_to_next_tick <= 0)
		{
			timer_tick(s);
			s->samples_to_next_tick = samples_per_tick;
		}
	}

	// are there "leftovers"?
	if (opos < samples)
	{
		z80_execute(s->z80, (8000000/44100)*(samples-opos));
		stereo[0] = &output[opos];
		stereo[1] = &output2[opos];
		qsound_update(s->qs, 0, stereo, (samples-opos));

		s->samples_to_next_tick -= (samples-opos);

		if (s->samples_to_next_tick <= 0)
		{
			timer_tick(s);
			s->samples_to_next_tick = samples_per_tick;
		}
	}

	for (i = 0; i < samples; i++)
	{
		*outp++ = output[i];
		*outp++ = output2[i];
	}

	return AO_SUCCESS;
}