mirror of https://github.com/mgba-emu/mgba.git
Start audio channel 3
This commit is contained in:
parent
cfb0115c0e
commit
cc8eeb4353
|
@ -33,6 +33,8 @@ void GBAAudioInit(struct GBAAudio* audio) {
|
||||||
audio->ch2.envelope.nextStep = INT_MAX;
|
audio->ch2.envelope.nextStep = INT_MAX;
|
||||||
audio->ch2.control.nextStep = 0;
|
audio->ch2.control.nextStep = 0;
|
||||||
audio->ch2.sample = 0;
|
audio->ch2.sample = 0;
|
||||||
|
audio->ch3.bank.packed = 0;
|
||||||
|
audio->ch3.sample = 0;
|
||||||
audio->ch4.sample = 0;
|
audio->ch4.sample = 0;
|
||||||
audio->ch4.envelope.nextStep = INT_MAX;
|
audio->ch4.envelope.nextStep = INT_MAX;
|
||||||
audio->eventDiff = 0;
|
audio->eventDiff = 0;
|
||||||
|
@ -281,7 +283,7 @@ void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value) {
|
void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value) {
|
||||||
GBALog(audio->p, GBA_LOG_STUB, "Audio unimplemented");
|
audio->ch3.wavedata[address | (!audio->ch3.bank.bank * 4)] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value) {
|
void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value) {
|
||||||
|
@ -390,7 +392,47 @@ static int32_t _updateChannel2(struct GBAAudioChannel2* ch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t _updateChannel3(struct GBAAudioChannel3* ch) {
|
static int32_t _updateChannel3(struct GBAAudioChannel3* ch) {
|
||||||
return INT_MAX / 4;
|
int i;
|
||||||
|
int start;
|
||||||
|
int end;
|
||||||
|
int volume;
|
||||||
|
switch (ch->wave.volume) {
|
||||||
|
case 0:
|
||||||
|
volume = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
volume = 4;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
volume = 2;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
volume = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
volume = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ch->bank.size) {
|
||||||
|
start = 7;
|
||||||
|
end = 0;
|
||||||
|
} else if (ch->bank.bank) {
|
||||||
|
start = 7;
|
||||||
|
end = 4;
|
||||||
|
} else {
|
||||||
|
start = 3;
|
||||||
|
end = 0;
|
||||||
|
}
|
||||||
|
uint32_t bitsCarry = ch->wavedata[end] & 0xF0000000;
|
||||||
|
uint32_t bits;
|
||||||
|
for (i = start; i >= end; --i) {
|
||||||
|
bits = ch->wavedata[i] & 0xF0000000;
|
||||||
|
ch->wavedata[i] <<= 4;
|
||||||
|
ch->wavedata[i] |= bitsCarry >> 28;
|
||||||
|
bitsCarry = bits;
|
||||||
|
}
|
||||||
|
ch->sample = ((bitsCarry >> 26) - 0x20) * volume;
|
||||||
|
return 16 * (2048 - ch->control.rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t _updateChannel4(struct GBAAudioChannel4* ch) {
|
static int32_t _updateChannel4(struct GBAAudioChannel4* ch) {
|
||||||
|
@ -426,6 +468,14 @@ static void _sample(struct GBAAudio* audio) {
|
||||||
sampleRight += audio->ch2.sample >> psgShift;
|
sampleRight += audio->ch2.sample >> psgShift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (audio->ch3Left) {
|
||||||
|
sampleLeft += audio->ch3.sample >> psgShift;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (audio->ch3Right) {
|
||||||
|
sampleRight += audio->ch3.sample >> psgShift;
|
||||||
|
}
|
||||||
|
|
||||||
if (audio->ch4Left) {
|
if (audio->ch4Left) {
|
||||||
sampleLeft += audio->ch4.sample >> psgShift;
|
sampleLeft += audio->ch4.sample >> psgShift;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ struct GBAAudioChannel3 {
|
||||||
unsigned : 5;
|
unsigned : 5;
|
||||||
unsigned size : 1;
|
unsigned size : 1;
|
||||||
unsigned bank : 1;
|
unsigned bank : 1;
|
||||||
unsigned disable : 1;
|
unsigned enable : 1;
|
||||||
unsigned : 7;
|
unsigned : 7;
|
||||||
};
|
};
|
||||||
uint16_t packed;
|
uint16_t packed;
|
||||||
|
@ -80,8 +80,6 @@ struct GBAAudioChannel3 {
|
||||||
unsigned length : 8;
|
unsigned length : 8;
|
||||||
unsigned : 5;
|
unsigned : 5;
|
||||||
unsigned volume : 3;
|
unsigned volume : 3;
|
||||||
unsigned disable : 1;
|
|
||||||
unsigned : 7;
|
|
||||||
};
|
};
|
||||||
uint16_t packed;
|
uint16_t packed;
|
||||||
} wave;
|
} wave;
|
||||||
|
@ -95,6 +93,9 @@ struct GBAAudioChannel3 {
|
||||||
};
|
};
|
||||||
uint16_t packed;
|
uint16_t packed;
|
||||||
} control;
|
} control;
|
||||||
|
|
||||||
|
uint32_t wavedata[8];
|
||||||
|
int8_t sample;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GBAAudioChannel4 {
|
struct GBAAudioChannel4 {
|
||||||
|
|
Loading…
Reference in New Issue