Current WIP CD-ROM changes.

This commit is contained in:
OBattler
2025-02-09 20:06:15 +01:00
parent f679b46b65
commit 74e0408201
17 changed files with 1201 additions and 736 deletions

View File

@@ -274,83 +274,89 @@ sound_cd_thread(UNUSED(void *param))
temp_buffer[0] = temp_buffer[1] = 0;
for (uint8_t i = 0; i < CDROM_NUM; i++) {
if ((cdrom[i].bus_type == CDROM_BUS_DISABLED) || (cdrom[i].cd_status == CD_STATUS_EMPTY))
/* Just in case the thread is in a loop when it gets terminated. */
if (!cdaudioon)
break;
if ((cdrom[i].bus_type == CDROM_BUS_DISABLED) ||
(cdrom[i].cd_status != CD_STATUS_PLAYING))
continue;
const uint32_t lba = cdrom[i].seek_pos;
const int r = cdrom_audio_callback(&(cdrom[i]), cd_buffer[i], CD_BUFLEN * 2);
if (!cdrom[i].sound_on || !r)
continue;
const int pre = cdrom_is_pre(&(cdrom[i]), lba);
const int ret = cdrom_audio_callback(&(cdrom[i]), cd_buffer[i],
CD_BUFLEN * 2);
if (cdrom[i].get_volume) {
audio_vol_l = cd_audio_volume_lut[cdrom[i].get_volume(cdrom[i].priv, 0)];
audio_vol_r = cd_audio_volume_lut[cdrom[i].get_volume(cdrom[i].priv, 1)];
} else {
audio_vol_l = cd_audio_volume_lut[255];
audio_vol_r = cd_audio_volume_lut[255];
}
if (cdrom[i].get_channel) {
channel_select[0] = (int) cdrom[i].get_channel(cdrom[i].priv, 0);
channel_select[1] = (int) cdrom[i].get_channel(cdrom[i].priv, 1);
} else {
channel_select[0] = 1;
channel_select[1] = 2;
}
for (int c = 0; c < CD_BUFLEN * 2; c += 2) {
/*Apply ATAPI channel select*/
cd_buffer_temp[0] = cd_buffer_temp[1] = 0.0;
if ((audio_vol_l != 0.0) && (channel_select[0] != 0)) {
if (channel_select[0] & 1)
cd_buffer_temp[0] += ((double) cd_buffer[i][c]); /* Channel 0 => Port 0 */
if (channel_select[0] & 2)
cd_buffer_temp[0] += ((double) cd_buffer[i][c + 1]); /* Channel 1 => Port 0 */
cd_buffer_temp[0] *= audio_vol_l; /* Multiply Port 0 by Port 0 volume */
if (pre)
cd_buffer_temp[0] = deemph_iir(0, cd_buffer_temp[0]); /* De-emphasize if necessary */
}
if ((audio_vol_r != 0.0) && (channel_select[1] != 0)) {
if (channel_select[1] & 1)
cd_buffer_temp[1] += ((double) cd_buffer[i][c]); /* Channel 0 => Port 1 */
if (channel_select[1] & 2)
cd_buffer_temp[1] += ((double) cd_buffer[i][c + 1]); /* Channel 1 => Port 1 */
cd_buffer_temp[1] *= audio_vol_r; /* Multiply Port 1 by Port 1 volume */
if (pre)
cd_buffer_temp[1] = deemph_iir(1, cd_buffer_temp[1]); /* De-emphasize if necessary */
}
/* Apply sound card CD volume and filters */
if (filter_cd_audio != NULL) {
filter_cd_audio(0, &(cd_buffer_temp[0]), filter_cd_audio_p);
filter_cd_audio(1, &(cd_buffer_temp[1]), filter_cd_audio_p);
}
if (sound_is_float) {
cd_out_buffer[c] += (float) (cd_buffer_temp[0] / 32768.0);
cd_out_buffer[c + 1] += (float) (cd_buffer_temp[1] / 32768.0);
if (ret) {
if (cdrom[i].get_volume) {
audio_vol_l = cd_audio_volume_lut[cdrom[i].get_volume(cdrom[i].priv, 0)];
audio_vol_r = cd_audio_volume_lut[cdrom[i].get_volume(cdrom[i].priv, 1)];
} else {
temp_buffer[0] += (int) trunc(cd_buffer_temp[0]);
temp_buffer[1] += (int) trunc(cd_buffer_temp[1]);
audio_vol_l = cd_audio_volume_lut[255];
audio_vol_r = cd_audio_volume_lut[255];
}
if (temp_buffer[0] > 32767)
temp_buffer[0] = 32767;
if (temp_buffer[0] < -32768)
temp_buffer[0] = -32768;
if (temp_buffer[1] > 32767)
temp_buffer[1] = 32767;
if (temp_buffer[1] < -32768)
temp_buffer[1] = -32768;
if (cdrom[i].get_channel) {
channel_select[0] = (int) cdrom[i].get_channel(cdrom[i].priv, 0);
channel_select[1] = (int) cdrom[i].get_channel(cdrom[i].priv, 1);
} else {
channel_select[0] = 1;
channel_select[1] = 2;
}
cd_out_buffer_int16[c] = (int16_t) temp_buffer[0];
cd_out_buffer_int16[c + 1] = (int16_t) temp_buffer[1];
// uint16_t *cddab = (uint16_t *) cdrom[i].raw_buffer;
for (int c = 0; c < CD_BUFLEN * 2; c += 2) {
/* Apply ATAPI channel select */
cd_buffer_temp[0] = cd_buffer_temp[1] = 0.0;
if ((audio_vol_l != 0.0) && (channel_select[0] != 0)) {
if (channel_select[0] & 1)
/* Channel 0 => Port 0 */
cd_buffer_temp[0] += ((double) cd_buffer[i][c]);
if (channel_select[0] & 2)
/* Channel 1 => Port 0 */
cd_buffer_temp[0] += ((double) cd_buffer[i][c + 1]);
/* Multiply Port 0 by Port 0 volume */
cd_buffer_temp[0] *= audio_vol_l;
}
if ((audio_vol_r != 0.0) && (channel_select[1] != 0)) {
if (channel_select[1] & 1)
/* Channel 0 => Port 1 */
cd_buffer_temp[1] += ((double) cd_buffer[i][c]);
if (channel_select[1] & 2)
/* Channel 1 => Port 1 */
cd_buffer_temp[1] += ((double) cd_buffer[i][c + 1]);
/* Multiply Port 1 by Port 1 volume */
cd_buffer_temp[1] *= audio_vol_r;
}
/* Apply sound card CD volume and filters */
if (filter_cd_audio != NULL) {
filter_cd_audio(0, &(cd_buffer_temp[0]),
filter_cd_audio_p);
filter_cd_audio(1, &(cd_buffer_temp[1]),
filter_cd_audio_p);
}
if (sound_is_float) {
cd_out_buffer[c] += (float) (cd_buffer_temp[0] / 32768.0);
cd_out_buffer[c + 1] += (float) (cd_buffer_temp[1] / 32768.0);
} else {
temp_buffer[0] = (int) trunc(cd_buffer_temp[0]);
temp_buffer[1] = (int) trunc(cd_buffer_temp[1]);
if (temp_buffer[0] > 32767)
temp_buffer[0] = 32767;
if (temp_buffer[0] < -32768)
temp_buffer[0] = -32768;
if (temp_buffer[1] > 32767)
temp_buffer[1] = 32767;
if (temp_buffer[1] < -32768)
temp_buffer[1] = -32768;
cd_out_buffer_int16[c] += (int16_t) temp_buffer[0];
cd_out_buffer_int16[c + 1] += (int16_t) temp_buffer[1];
}
}
}
}