Пример #1
0
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));
    }
}
Пример #2
0
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));
}
Пример #3
0
static void wait_sound_command(int n)
{
    while(read_sound_int(&SOUNDSTATUS->cmdstatus)!=n);
}
Пример #4
0
void stop_sound()
{
    while(read_sound_int(&SOUNDSTATUS->mode) != MODE_PAUSE)
        do_sound_command(CMD_SET_MODE(MODE_PAUSE));
}