From 11eb87b4367da54ee553beb76fa017260b3fa49d Mon Sep 17 00:00:00 2001 From: SarahW Date: Mon, 4 Apr 2016 11:44:40 +0100 Subject: [PATCH] Implemented ATAPI audio channel select. Based on patch from Battler. --- src/ide.c | 7 +++++++ src/sound.c | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/ide.c b/src/ide.c index f7af248..137ecde 100644 --- a/src/ide.c +++ b/src/ide.c @@ -538,6 +538,11 @@ static uint32_t ide_atapi_mode_sense(IDE *ide, uint32_t pos, uint8_t type) return pos; } +uint32_t atapi_get_cd_channel(int channel) +{ + return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 8 : 6] : (channel + 1); +} + uint32_t atapi_get_cd_volume(int channel) { return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 9 : 7] : 0xFF; @@ -732,6 +737,8 @@ void resetide(void) cur_ide[1] = 2; // ide_drives[1].type = IDE_CDROM; + + page_flags[GPMODE_CDROM_AUDIO_PAGE] &= ~PAGE_CHANGED; } int idetimes=0; diff --git a/src/sound.c b/src/sound.c index 639e736..346d5e4 100644 --- a/src/sound.c +++ b/src/sound.c @@ -112,14 +112,46 @@ static void sound_cd_thread(void *param) { int32_t atapi_vol_l = atapi_get_cd_volume(0); int32_t atapi_vol_r = atapi_get_cd_volume(1); + int channel_select[2]; + + channel_select[0] = atapi_get_cd_channel(0); + channel_select[1] = atapi_get_cd_channel(1); for (c = 0; c < CD_BUFLEN*2; c += 2) { - cd_buffer[c] = ((int32_t)cd_buffer[c] * cd_vol_l) / 65535; - cd_buffer[c] = ((int32_t)cd_buffer[c] * atapi_vol_l) / 255; - cd_buffer[c+1] = ((int32_t)cd_buffer[c+1] * cd_vol_r) / 65535; + int32_t cd_buffer_temp[2] = {0, 0}; + + /*First, adjust input from drive according to ATAPI volume.*/ + cd_buffer[c] = ((int32_t)cd_buffer[c] * atapi_vol_l) / 255; cd_buffer[c+1] = ((int32_t)cd_buffer[c+1] * atapi_vol_r) / 255; + + /*Apply ATAPI channel select*/ + if (channel_select[0] & 1) + cd_buffer_temp[0] += cd_buffer[c]; + if (channel_select[0] & 2) + cd_buffer_temp[1] += cd_buffer[c]; + if (channel_select[1] & 1) + cd_buffer_temp[0] += cd_buffer[c+1]; + if (channel_select[1] & 2) + cd_buffer_temp[1] += cd_buffer[c+1]; + + /*Apply sound card CD volume*/ + cd_buffer_temp[0] = (cd_buffer_temp[0] * (int)cd_vol_l) / 65535; + cd_buffer_temp[1] = (cd_buffer_temp[1] * (int)cd_vol_r) / 65535; + + if (cd_buffer_temp[0] > 32767) + cd_buffer_temp[0] = 32767; + if (cd_buffer_temp[0] < -32768) + cd_buffer_temp[0] = -32768; + if (cd_buffer_temp[1] > 32767) + cd_buffer_temp[1] = 32767; + if (cd_buffer_temp[1] < -32768) + cd_buffer_temp[1] = -32768; + + cd_buffer[c] = cd_buffer_temp[0]; + cd_buffer[c+1] = cd_buffer_temp[1]; } + givealbuffer_cd(cd_buffer); } }