Split generic CD-ROM from SCSI-style CD-ROM;
Redid the way SCSI and ATAPI devices are handled; Slight timings change in the NCR 5380; Devices are now closed by device_close_all() in the reverse order of the one in which they were started; Slight changes to some code in win/; Added the WM_HARDRESET and WM_SHUTDOWN window messages for configuration manager purposes.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Sound emulation core.
|
||||
*
|
||||
* Version: @(#)sound.c 1.0.20 2018/10/02
|
||||
* Version: @(#)sound.c 1.0.21 2018/10/09
|
||||
*
|
||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||
* Miran Grca, <mgrca8@gmail.com>
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "../86box.h"
|
||||
#include "../device.h"
|
||||
#include "../timer.h"
|
||||
#include "../scsi/scsi_device.h"
|
||||
#include "../cdrom/cdrom.h"
|
||||
#include "../plat.h"
|
||||
#include "sound.h"
|
||||
@@ -188,68 +187,69 @@ void sound_set_cd_volume(unsigned int vol_l, unsigned int vol_r)
|
||||
|
||||
static void sound_cd_thread(void *param)
|
||||
{
|
||||
int i = 0;
|
||||
int c, has_audio, d, r, i = 0;
|
||||
int32_t audio_vol_l, audio_vol_r;
|
||||
|
||||
int channel_select[2];
|
||||
|
||||
float cd_buffer_temp[2] = {0.0, 0.0};
|
||||
float cd_buffer_temp2[2] = {0.0, 0.0};
|
||||
|
||||
int32_t cd_buffer_temp4[2] = {0, 0};
|
||||
|
||||
int c, has_audio;
|
||||
int d, r;
|
||||
|
||||
thread_set_event(sound_cd_start_event);
|
||||
|
||||
while (cdaudioon)
|
||||
{
|
||||
while (cdaudioon) {
|
||||
thread_wait_event(sound_cd_event, -1);
|
||||
thread_reset_event(sound_cd_event);
|
||||
|
||||
if (!soundon || !cdaudioon)
|
||||
return;
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2)
|
||||
{
|
||||
if (sound_is_float)
|
||||
{
|
||||
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2) {
|
||||
if (sound_is_float) {
|
||||
cd_out_buffer[c] = 0.0;
|
||||
cd_out_buffer[c+1] = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cd_out_buffer_int16[c] = 0;
|
||||
cd_out_buffer_int16[c+1] = 0;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < CDROM_NUM; i++)
|
||||
{
|
||||
|
||||
for (i = 0; i < CDROM_NUM; i++) {
|
||||
has_audio = 0;
|
||||
if ((cdrom_drives[i].bus_type == CDROM_BUS_DISABLED) || !cdrom[i] || !cdrom[i]->handler)
|
||||
if ((cdrom_drives[i].bus_type == CDROM_BUS_DISABLED) || !cdrom_drives[i].handler)
|
||||
continue;
|
||||
if (cdrom[i]->handler->audio_callback)
|
||||
if (cdrom_drives[i].handler->audio_callback)
|
||||
{
|
||||
r = cdrom[i]->handler->audio_callback(i, cd_buffer[i], CD_BUFLEN*2);
|
||||
r = cdrom_drives[i].handler->audio_callback(i, cd_buffer[i], CD_BUFLEN*2);
|
||||
has_audio = (cdrom_drives[i].bus_type && cdrom_drives[i].sound_on/* && r*/);
|
||||
} else
|
||||
continue;
|
||||
if (soundon && has_audio)
|
||||
{
|
||||
int32_t audio_vol_l = cdrom_mode_sense_get_volume(cdrom[i], 0);
|
||||
int32_t audio_vol_r = cdrom_mode_sense_get_volume(cdrom[i], 1);
|
||||
int channel_select[2];
|
||||
|
||||
channel_select[0] = cdrom_mode_sense_get_channel(cdrom[i], 0);
|
||||
channel_select[1] = cdrom_mode_sense_get_channel(cdrom[i], 1);
|
||||
if (soundon && has_audio) {
|
||||
if (cdrom_drives[i].get_volume) {
|
||||
audio_vol_l = cdrom_drives[i].get_volume(cdrom_drives[i].p, 0);
|
||||
audio_vol_r = cdrom_drives[i].get_volume(cdrom_drives[i].p, 1);
|
||||
} else {
|
||||
audio_vol_l = 255;
|
||||
audio_vol_r = 255;
|
||||
}
|
||||
|
||||
if (!r)
|
||||
{
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2)
|
||||
{
|
||||
if (sound_is_float)
|
||||
{
|
||||
if (cdrom_drives[i].get_channel) {
|
||||
channel_select[0] = cdrom_drives[i].get_channel(cdrom_drives[i].p, 0);
|
||||
channel_select[1] = cdrom_drives[i].get_channel(cdrom_drives[i].p, 1);
|
||||
} else {
|
||||
channel_select[0] = 1;
|
||||
channel_select[1] = 2;
|
||||
}
|
||||
|
||||
if (!r) {
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2) {
|
||||
if (sound_is_float) {
|
||||
cd_out_buffer[c] += 0.0;
|
||||
cd_out_buffer[c+1] += 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
cd_out_buffer_int16[c] += 0;
|
||||
cd_out_buffer_int16[c+1] += 0;
|
||||
}
|
||||
@@ -257,8 +257,7 @@ static void sound_cd_thread(void *param)
|
||||
continue;
|
||||
}
|
||||
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2)
|
||||
{
|
||||
for (c = 0; c < CD_BUFLEN*2; c += 2) {
|
||||
/* First, transfer the CD audio data to the temporary buffer. */
|
||||
cd_buffer_temp[0] = (float) cd_buffer[i][c];
|
||||
cd_buffer_temp[1] = (float) cd_buffer[i][c+1];
|
||||
@@ -271,25 +270,17 @@ static void sound_cd_thread(void *param)
|
||||
|
||||
/*Apply ATAPI channel select*/
|
||||
cd_buffer_temp2[0] = cd_buffer_temp2[1] = 0.0;
|
||||
if (channel_select[0] & 1)
|
||||
{
|
||||
cd_buffer_temp2[0] += cd_buffer_temp[0];
|
||||
}
|
||||
if (channel_select[0] & 2)
|
||||
{
|
||||
cd_buffer_temp2[1] += cd_buffer_temp[0];
|
||||
}
|
||||
if (channel_select[1] & 1)
|
||||
{
|
||||
cd_buffer_temp2[0] += cd_buffer_temp[1];
|
||||
}
|
||||
if (channel_select[1] & 2)
|
||||
{
|
||||
cd_buffer_temp2[1] += cd_buffer_temp[1];
|
||||
}
|
||||
|
||||
if (sound_process_handlers_num)
|
||||
{
|
||||
if (channel_select[0] & 1)
|
||||
cd_buffer_temp2[0] += cd_buffer_temp[0];
|
||||
if (channel_select[0] & 2)
|
||||
cd_buffer_temp2[1] += cd_buffer_temp[0];
|
||||
if (channel_select[1] & 1)
|
||||
cd_buffer_temp2[0] += cd_buffer_temp[1];
|
||||
if (channel_select[1] & 2)
|
||||
cd_buffer_temp2[1] += cd_buffer_temp[1];
|
||||
|
||||
if (sound_process_handlers_num) {
|
||||
cd_buffer_temp4[0] = (int32_t) cd_buffer_temp2[0];
|
||||
cd_buffer_temp4[1] = (int32_t) cd_buffer_temp2[1];
|
||||
|
||||
@@ -298,9 +289,7 @@ static void sound_cd_thread(void *param)
|
||||
|
||||
cd_buffer_temp2[0] = (float) cd_buffer_temp4[0];
|
||||
cd_buffer_temp2[1] = (float) cd_buffer_temp4[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
/*Apply sound card CD volume*/
|
||||
cd_buffer_temp2[0] *= (float) cd_vol_l;
|
||||
cd_buffer_temp2[0] /= 65535.0;
|
||||
@@ -309,13 +298,10 @@ static void sound_cd_thread(void *param)
|
||||
cd_buffer_temp2[1] /= 65535.0;
|
||||
}
|
||||
|
||||
if (sound_is_float)
|
||||
{
|
||||
if (sound_is_float) {
|
||||
cd_out_buffer[c] += (cd_buffer_temp2[0] / 32768.0);
|
||||
cd_out_buffer[c+1] += (cd_buffer_temp2[1] / 32768.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
if (cd_buffer_temp2[0] > 32767)
|
||||
cd_buffer_temp2[0] = 32767;
|
||||
if (cd_buffer_temp2[0] < -32768)
|
||||
@@ -331,6 +317,7 @@ static void sound_cd_thread(void *param)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sound_is_float)
|
||||
givealbuffer_cd(cd_out_buffer);
|
||||
else
|
||||
@@ -540,21 +527,15 @@ void sound_cd_thread_reset(void)
|
||||
int i = 0;
|
||||
int available_cdrom_drives = 0;
|
||||
|
||||
for (i = 0; i < CDROM_NUM; i++)
|
||||
{
|
||||
if (cdrom[i] && cdrom[i]->handler && cdrom[i]->handler->audio_stop)
|
||||
{
|
||||
cdrom[i]->handler->audio_stop(i);
|
||||
}
|
||||
for (i = 0; i < CDROM_NUM; i++) {
|
||||
if (cdrom_drives[i].handler && cdrom_drives[i].handler->audio_stop)
|
||||
cdrom_drives[i].handler->audio_stop(i);
|
||||
|
||||
if ((cdrom_drives[i].bus_type != CDROM_BUS_DISABLED) && cdrom[i])
|
||||
{
|
||||
if (cdrom_drives[i].bus_type != CDROM_BUS_DISABLED)
|
||||
available_cdrom_drives++;
|
||||
}
|
||||
}
|
||||
|
||||
if (available_cdrom_drives && !cd_thread_enable)
|
||||
{
|
||||
if (available_cdrom_drives && !cd_thread_enable) {
|
||||
cdaudioon = 1;
|
||||
|
||||
sound_cd_start_event = thread_create_event();
|
||||
@@ -564,9 +545,7 @@ void sound_cd_thread_reset(void)
|
||||
|
||||
thread_wait_event(sound_cd_start_event, -1);
|
||||
thread_reset_event(sound_cd_start_event);
|
||||
}
|
||||
else if (!available_cdrom_drives && cd_thread_enable)
|
||||
{
|
||||
} else if (!available_cdrom_drives && cd_thread_enable) {
|
||||
sound_cd_thread_end();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user