void start_sound() { while(read_sound_int(&SOUNDSTATUS->mode) != MODE_PLAY) { memset4((void*)RING_BUF, 0, SAMPLES_TO_BYTES(RING_BUFFER_SAMPLES+1)); memset4((void*)RING_BUF+STEREO_OFFSET, 0, SAMPLES_TO_BYTES(RING_BUFFER_SAMPLES+1)); do_sound_command(CMD_SET_MODE(MODE_PLAY)); } }
void SSRunMixer(void) { int bytes_copied; int bytestogo; int c; int i; int pos = read_sound_int(&SOUNDSTATUS->samplepos); memset(tmp_sound_buffer, 0, sizeof(tmp_sound_buffer)); const int len = 2*SAMPLES_TO_BYTES(AUDIO_SIZE); // get data for all channels and add it to the mix for(c=0;c<SS_NUM_CHANNELS;c++) { if (channel[c].head==channel[c].tail) continue; bytestogo = len; mix_pos = 0; while(bytestogo > 0) { bytes_copied = AddBuffer(&channel[c], bytestogo); bytestogo -= bytes_copied; if (channel[c].head==channel[c].tail) { // ran out of chunks before buffer full // clear remaining portion of mixbuffer if (bytestogo) { memset(&mixbuffer[mix_pos], 0, bytestogo); } break; } } MixAudio(tmp_sound_buffer, mixbuffer, len, channel[c].volume); } // tell any callbacks that had a chunk finish, that their chunk finished for(c=0;c<SS_NUM_CHANNELS;c++) { if (channel[c].FinishedCB) { for(i=0;i<channel[c].nFinishedChunks;i++) { //stat("Telling channel %d's handler that chunk %d finished", c, channel[c].FinishedChunkUserdata[i]); (*channel[c].FinishedCB)(c, channel[c].FinishedChunkUserdata[i]); } } channel[c].nFinishedChunks = 0; } memcpy4s(RING_BUF + pos, tmp_sound_buffer, SAMPLES_TO_BYTES(AUDIO_SIZE)); }
static void wait_sound_command(int n) { while(read_sound_int(&SOUNDSTATUS->cmdstatus)!=n); }
void stop_sound() { while(read_sound_int(&SOUNDSTATUS->mode) != MODE_PAUSE) do_sound_command(CMD_SET_MODE(MODE_PAUSE)); }