TIA audio sampled every colour clock

sum of samples is averaged and output twice per scanline

this fixes issues with ROMs that change the volume of the audio multiple
times per scanline. for example, the experimental ROM in the following
thread now works correctly

https://forums.atariage.com/topic/370460-8-bit-digital-audio-from-2600/

note that the ROM does not initialise the machine cleanly and so running
the emulator with developer options (random memory etc.) can cause
incorrect audio
This commit is contained in:
JetSetIlly 2024-08-06 21:33:24 +01:00
parent 56e6bd69bc
commit eff87589ec
2 changed files with 20 additions and 2 deletions

View File

@ -47,6 +47,9 @@ void Audio::reset()
{
myCounter = 0;
mySampleIndex = 0;
sumChannel0 = 0;
sumChannel1 = 0;
sumCt = 0;
myChannel0.reset();
myChannel1.reset();
@ -64,8 +67,13 @@ void Audio::setAudioQueue(const shared_ptr<AudioQueue>& queue)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Audio::phase1()
{
const uInt8 sample0 = myChannel0.phase1();
const uInt8 sample1 = myChannel1.phase1();
// calculate average of all recent volume samples. the average for each
// channel is mixed to create a single audible value
const uInt8 sample0 = (uInt8)(sumChannel0/sumCt);
const uInt8 sample1 = (uInt8)(sumChannel1/sumCt);
sumChannel0 = 0;
sumChannel1 = 0;
sumCt = 0;
addSample(sample0, sample1);
#ifdef GUI_SUPPORT

View File

@ -68,6 +68,10 @@ class Audio : public Serializable
AudioChannel myChannel0;
AudioChannel myChannel1;
uInt32 sumChannel0;
uInt32 sumChannel1;
uInt32 sumCt;
std::array<Int16, 0x1e + 1> myMixingTableSum;
std::array<Int16, 0x0f + 1> myMixingTableIndividual;
@ -92,6 +96,12 @@ class Audio : public Serializable
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Audio::tick()
{
// volume for each channel is sampled every color clock. the average of
// these samples will be taken twice a scanline in the phase1() function
sumChannel0 += (uInt32)myChannel0.phase1();
sumChannel1 += (uInt32)myChannel1.phase1();
sumCt++;
switch (myCounter) {
case 9:
case 81: