Skip to content

Commit

Permalink
Enable audio frag (I/O 0x04EC).
Browse files Browse the repository at this point in the history
  • Loading branch information
bcc2528 authored Jan 4, 2025
1 parent ca69510 commit 9b96e40
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/towns/sound/sound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ void TownsSound::State::Reset(void)
void TownsSound::State::ResetVariables(void)
{
muteFlag=0;
audioFlag=0;
addrLatch[0]=0;
addrLatch[1]=0;
}
Expand Down Expand Up @@ -104,6 +105,9 @@ void TownsSound::SetCDROMPointer(class TownsCDROM *cdrom)
break;
case TOWNSIO_SOUND_PCM_INT:// 0x4EB, // [2] pp.19,
break;
case TOWNSIO_SOUND_AUDIO:// 0x4EC, // [2] pp.18,
state.audioFlag=data&0xff;
break;
case TOWNSIO_SOUND_PCM_ENV:// 0x4F0, // [2] pp.19,
state.rf5c68.WriteRegister(RF5C68::REG_ENV,data,townsPtr->state.townsTime);
ProcessRecordPCMWrite(RF5C68::REG_ENV,data);
Expand Down Expand Up @@ -227,6 +231,9 @@ void TownsSound::ProcessRecordPCMWrite(unsigned int reg,unsigned char data)
data=state.rf5c68.state.IRQBank;
state.rf5c68.state.IRQBank=0;
break;
case TOWNSIO_SOUND_AUDIO:// 0x4EC, // [2] pp.18,
data=state.audioFlag;
break;
case TOWNSIO_SOUND_PCM_ENV:// 0x4F0, // [2] pp.19,
break;
case TOWNSIO_SOUND_PCM_PAN:// 0x4F1, // [2] pp.19,
Expand Down Expand Up @@ -320,6 +327,8 @@ std::vector <std::string> TownsSound::GetStatusText(void) const

text.push_back("MUTE_FLAG=0x");
text.back()+=cpputil::Ubtox(state.muteFlag);
text.push_back("AUDIO_FLAG=0x");
text.back()+=cpputil::Ubtox(state.audioFlag);
text.insert(text.end(),pcmText.begin(),pcmText.end());
text.insert(text.end(),fmText.begin(),fmText.end());

Expand Down Expand Up @@ -350,7 +359,7 @@ void TownsSound::ProcessSound(void)
memset(nextFMPCMWave.data(),0,nextFMPCMWave.size());

bool wavGenerated=false;
if(true==IsFMPlaying() && 0!=(state.muteFlag&2))
if(true==IsFMPlaying() && 0!=(state.muteFlag&2) && 0!=(state.audioFlag&64))
{
state.ym2612.MakeWaveForNSamples(nextFMPCMWave.data(),numSamplesPerWave,lastFMPCMWaveGenTime);
wavGenerated=true;
Expand All @@ -361,7 +370,7 @@ void TownsSound::ProcessSound(void)

// Brandish expects PCM interrupt even when muted.
// Therefore, PCM wave must be generated and played for making IRQ.
if(0!=(state.muteFlag&1))
if(0!=(state.muteFlag&1) && 0!=(state.audioFlag&64))
{
state.rf5c68.AddWaveForNumSamples(nextFMPCMWave.data(),numSamplesPerWave,WAVE_OUT_SAMPLING_RATE,lastFMPCMWaveGenTime);
}
Expand All @@ -387,7 +396,7 @@ void TownsSound::ProcessSound(void)
if(true==IsHighResPCMPlaying())
{
auto &highResPCM=townsPtr->highResPCM;
if(true==highResPCM.var.mute)
if(true==highResPCM.var.mute || 0==(state.audioFlag&64))
{
highResPCM.DropWaveForNumSamples(numSamplesPerWave,WAVE_OUT_SAMPLING_RATE);
}
Expand All @@ -397,7 +406,7 @@ void TownsSound::ProcessSound(void)
}
wavGenerated=true;
}
if(true==cdrom->CDDAIsPlaying())
if(true==cdrom->CDDAIsPlaying() && 0!=(state.audioFlag&64))
{
cdrom->AddWaveForNumSamples(nextFMPCMWave.data(),numSamplesPerWave,WAVE_OUT_SAMPLING_RATE);
wavGenerated=true;
Expand Down Expand Up @@ -796,6 +805,7 @@ void TownsSound::DeserializeRF5C68(const unsigned char *&data)
/* virtual */ void TownsSound::SpecificSerialize(std::vector <unsigned char> &data,std::string stateFName) const
{
PushUint32(data,state.muteFlag);
PushUint32(data,state.audioFlag);
PushUint32(data,state.addrLatch[0]);
PushUint32(data,state.addrLatch[1]);
SerializeYM2612(data);
Expand All @@ -804,6 +814,7 @@ void TownsSound::DeserializeRF5C68(const unsigned char *&data)
/* virtual */ bool TownsSound::SpecificDeserialize(const unsigned char *&data,std::string stateFName,uint32_t version)
{
state.muteFlag=ReadUint32(data);
state.audioFlag=ReadUint32(data);
state.addrLatch[0]=ReadUint32(data);
state.addrLatch[1]=ReadUint32(data);
DeserializeYM2612(data,version);
Expand Down
1 change: 1 addition & 0 deletions src/towns/sound/sound.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class TownsSound : public Device
public:
YM2612 ym2612;
unsigned int muteFlag;
unsigned int audioFlag;
unsigned int addrLatch[2];

RF5C68 rf5c68;
Expand Down
1 change: 1 addition & 0 deletions src/towns/towns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,7 @@ FMTownsCommon::FMTownsCommon() :
io.AddDevice(&sound,TOWNSIO_SOUND_INT_REASON);// 0x4E9, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_PCM_INT_MASK);// 0x4EA, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_PCM_INT);// 0x4EB, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_AUDIO);// 0x4EC, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_PCM_ENV);// 0x4F0, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_PCM_PAN);// 0x4F1, // [2] pp.19,
io.AddDevice(&sound,TOWNSIO_SOUND_PCM_FDL);// 0x4F2, // [2] pp.19,
Expand Down
1 change: 1 addition & 0 deletions src/towns/townsdef/townsdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ enum
TOWNSIO_SOUND_INT_REASON= 0x4E9, // [2] pp.19,
TOWNSIO_SOUND_PCM_INT_MASK= 0x4EA, // [2] pp.19,
TOWNSIO_SOUND_PCM_INT= 0x4EB, // [2] pp.19,
TOWNSIO_SOUND_AUDIO= 0x4EC, // [2] pp.19,
TOWNSIO_SOUND_PCM_ENV= 0x4F0, // [2] pp.19,
TOWNSIO_SOUND_PCM_PAN= 0x4F1, // [2] pp.19,
TOWNSIO_SOUND_PCM_FDL= 0x4F2, // [2] pp.19,
Expand Down
1 change: 1 addition & 0 deletions src/towns/townsdef/townsmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ std::map <unsigned int,std::string> FMTownsIOMap(void)
ioMap[TOWNSIO_SOUND_INT_REASON]="SOUND_INT_REASON";
ioMap[TOWNSIO_SOUND_PCM_INT_MASK]="SOUND_PCM_INT_MASK";
ioMap[TOWNSIO_SOUND_PCM_INT]="SOUND_PCM_INT";
ioMap[TOWNSIO_SOUND_AUDIO]="SOUND_AUDIO";
ioMap[TOWNSIO_SOUND_PCM_ENV]="SOUND_PCM_ENV";
ioMap[TOWNSIO_SOUND_PCM_PAN]="SOUND_PCM_PAN";
ioMap[TOWNSIO_SOUND_PCM_FDL]="SOUND_PCM_FDL";
Expand Down

0 comments on commit 9b96e40

Please sign in to comment.