void S9xMSU1PostLoadState(void) { if (DataOpen()) { REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0); } if (MSU1.MSU1_STATUS & AudioPlaying) { if (AudioOpen()) { REVERT_STREAM(audioStream, 4, 0); READ_STREAM((char *)&audioLoopPos, 4, audioStream); audioLoopPos = GET_LE32(&audioLoopPos); audioLoopPos <<= 2; audioLoopPos += 8; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); MSU1.MSU1_STATUS |= AudioError; } } bufPos = 0; bufBegin = 0; bufEnd = 0; partial_frames = 0; }
void S9xMSU1PostLoadState(void) { if (DataOpen()) { REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0); } if (MSU1.MSU1_STATUS & AudioPlaying) { uint32 savedPosition = MSU1.MSU1_AUDIO_POS; if (AudioOpen()) { REVERT_STREAM(audioStream, 4, 0); READ_STREAM((char *)&audioLoopPos, 4, audioStream); audioLoopPos = GET_LE32(&audioLoopPos); audioLoopPos <<= 2; audioLoopPos += 8; MSU1.MSU1_AUDIO_POS = savedPosition; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); MSU1.MSU1_STATUS |= AudioError; } } if (msu_resampler) msu_resampler->clear(); partial_frames = 0; }
void S9xMSU1Generate(size_t sample_count) { partial_frames += 4410 * (sample_count / 2); while ((bufPos < (bufEnd - 2)) && partial_frames >= 3204) { if (MSU1.MSU1_STATUS & AudioPlaying && audioStream) { int32 sample; int16* left = (int16*)&sample; int16* right = left + 1; int bytes_read = READ_STREAM((char *)&sample, 4, audioStream); if (bytes_read == 4) { *left = ((int32)(int16)GET_LE16(left) * MSU1.MSU1_VOLUME / 255); *right = ((int32)(int16)GET_LE16(right) * MSU1.MSU1_VOLUME / 255); *(bufPos++) = *left; *(bufPos++) = *right; MSU1.MSU1_AUDIO_POS += 4; partial_frames -= 3204; } else if (bytes_read >= 0) { if (MSU1.MSU1_STATUS & AudioRepeating) { MSU1.MSU1_AUDIO_POS = audioLoopPos; REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); REVERT_STREAM(audioStream, 8, 0); } } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); } } else { MSU1.MSU1_STATUS &= ~(AudioPlaying | AudioRepeating); partial_frames -= 3204; *(bufPos++) = 0; *(bufPos++) = 0; } } }
void S9xMSU1WritePort(uint8 port, uint8 byte) { switch (port) { case 0: MSU1.MSU1_DATA_SEEK &= 0xFFFFFF00; MSU1.MSU1_DATA_SEEK |= byte << 0; break; case 1: MSU1.MSU1_DATA_SEEK &= 0xFFFF00FF; MSU1.MSU1_DATA_SEEK |= byte << 8; break; case 2: MSU1.MSU1_DATA_SEEK &= 0xFF00FFFF; MSU1.MSU1_DATA_SEEK |= byte << 16; break; case 3: MSU1.MSU1_DATA_SEEK &= 0x00FFFFFF; MSU1.MSU1_DATA_SEEK |= byte << 24; MSU1.MSU1_DATA_POS = MSU1.MSU1_DATA_SEEK; if (dataStream) { REVERT_STREAM(dataStream, MSU1.MSU1_DATA_POS, 0); } break; case 4: MSU1.MSU1_TRACK_SEEK &= 0xFF00; MSU1.MSU1_TRACK_SEEK |= byte; break; case 5: MSU1.MSU1_TRACK_SEEK &= 0x00FF; MSU1.MSU1_TRACK_SEEK |= (byte << 8); MSU1.MSU1_CURRENT_TRACK = MSU1.MSU1_TRACK_SEEK; MSU1.MSU1_STATUS &= ~AudioPlaying; MSU1.MSU1_STATUS &= ~AudioRepeating; if (AudioOpen()) { if (MSU1.MSU1_CURRENT_TRACK == MSU1.MSU1_RESUME_TRACK) { MSU1.MSU1_AUDIO_POS = MSU1.MSU1_RESUME_POS; MSU1.MSU1_RESUME_POS = 0; MSU1.MSU1_RESUME_TRACK = ~0; } else { MSU1.MSU1_AUDIO_POS = 8; } REVERT_STREAM(audioStream, MSU1.MSU1_AUDIO_POS, 0); } break; case 6: MSU1.MSU1_VOLUME = byte; break; case 7: if (MSU1.MSU1_STATUS & (AudioBusy | AudioError)) break; MSU1.MSU1_STATUS = (MSU1.MSU1_STATUS & ~0x30) | ((byte & 0x03) << 4); if ((byte & (Play | Resume)) == Resume) { MSU1.MSU1_RESUME_TRACK = MSU1.MSU1_CURRENT_TRACK; MSU1.MSU1_RESUME_POS = MSU1.MSU1_AUDIO_POS; } break; } }