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); }
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; }