WIP: CDDA rework
This commit is contained in:
parent
0e0f685dee
commit
4ee83fec41
4 changed files with 131 additions and 120 deletions
|
@ -13,11 +13,7 @@ cda_audio::~cda_audio()
|
||||||
wait(0);
|
wait(0);
|
||||||
wait(1);
|
wait(1);
|
||||||
|
|
||||||
if (devid != 0)
|
cdaudio_active = false;
|
||||||
{
|
|
||||||
SDL_CloseAudioDevice(devid);
|
|
||||||
devid = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto& buffer : buffers)
|
for (auto& buffer : buffers)
|
||||||
{
|
{
|
||||||
|
@ -36,24 +32,14 @@ cda_audio::cda_audio(int num_sectors, int sectorsize, int samplerate, bool inter
|
||||||
this->sectorsize = sectorsize;
|
this->sectorsize = sectorsize;
|
||||||
for (auto& buffer : buffers)
|
for (auto& buffer : buffers)
|
||||||
{
|
{
|
||||||
buffer = xcalloc(uae_u8, num_sectors * ((bufsize + 4095) & ~4095));
|
buffer = xcalloc(uae_u8, num_sectors * ( bufsize + 4095 & ~4095));
|
||||||
}
|
}
|
||||||
this->num_sectors = num_sectors;
|
this->num_sectors = num_sectors;
|
||||||
|
|
||||||
if (internalmode)
|
if (internalmode)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SDL_memset(&want, 0, sizeof want);
|
cdaudio_active = true;
|
||||||
want.freq = samplerate;
|
|
||||||
want.format = AUDIO_S16;
|
|
||||||
want.channels = 2;
|
|
||||||
want.samples = bufsize;
|
|
||||||
|
|
||||||
devid = SDL_OpenAudioDevice(nullptr, 0, &want, &have, 0);
|
|
||||||
if (devid == 0)
|
|
||||||
SDL_Log("Failed to open audio: %s", SDL_GetError());
|
|
||||||
|
|
||||||
SDL_PauseAudioDevice(devid, 0);
|
|
||||||
|
|
||||||
active = true;
|
active = true;
|
||||||
playing = true;
|
playing = true;
|
||||||
|
@ -61,7 +47,7 @@ cda_audio::cda_audio(int num_sectors, int sectorsize, int samplerate, bool inter
|
||||||
|
|
||||||
void cda_audio::setvolume(int left, int right)
|
void cda_audio::setvolume(int left, int right)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < 2; j++)
|
for (auto j = 0; j < 2; j++)
|
||||||
{
|
{
|
||||||
volume[j] = j == 0 ? left : right;
|
volume[j] = j == 0 ? left : right;
|
||||||
volume[j] = sound_cd_volume[j] * volume[j] / 32768;
|
volume[j] = sound_cd_volume[j] * volume[j] / 32768;
|
||||||
|
@ -78,16 +64,16 @@ bool cda_audio::play(int bufnum)
|
||||||
if (!active)
|
if (!active)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uae_s16* p = (uae_s16*)(buffers[bufnum]);
|
auto* const p = reinterpret_cast<uae_s16*>(buffers[bufnum]);
|
||||||
for (int i = 0; i < num_sectors * sectorsize / 4; i++) {
|
for (auto i = 0; i < num_sectors * sectorsize / 4; i++) {
|
||||||
p[i * 2 + 0] = p[i * 2 + 0] * volume[0] / 32768;
|
p[i * 2 + 0] = p[i * 2 + 0] * volume[0] / 32768;
|
||||||
p[i * 2 + 1] = p[i * 2 + 1] * volume[1] / 32768;
|
p[i * 2 + 1] = p[i * 2 + 1] * volume[1] / 32768;
|
||||||
|
//PUT_CDAUDIO_WORD_STEREO(p[i * 2 + 0] * volume[0] / 32768, p[i * 2 + 1] * volume[1] / 32768);
|
||||||
|
//check_cdaudio_buffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int len = num_sectors * sectorsize;
|
|
||||||
SDL_QueueAudio(devid, p, len);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
//return cdaudio_catchup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cda_audio::wait(int bufnum)
|
void cda_audio::wait(int bufnum)
|
||||||
|
@ -95,7 +81,7 @@ void cda_audio::wait(int bufnum)
|
||||||
if (!active || !playing)
|
if (!active || !playing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (SDL_GetAudioDeviceStatus(devid) != SDL_AUDIO_PLAYING) {
|
while (SDL_GetAudioDeviceStatus(dev) != SDL_AUDIO_PLAYING) {
|
||||||
Sleep(10);
|
Sleep(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,5 +91,5 @@ bool cda_audio::isplaying(int bufnum)
|
||||||
if (!active || !playing)
|
if (!active || !playing)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return SDL_GetAudioDeviceStatus(devid) == SDL_AUDIO_PLAYING;
|
return SDL_GetAudioDeviceStatus(dev) == SDL_AUDIO_PLAYING;
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
|
||||||
|
@ -8,10 +7,6 @@ class cda_audio
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
int bufsize;
|
int bufsize;
|
||||||
#ifdef AMIBERRY
|
|
||||||
SDL_AudioDeviceID devid;
|
|
||||||
SDL_AudioSpec want, have;
|
|
||||||
#endif
|
|
||||||
int num_sectors;
|
int num_sectors;
|
||||||
int sectorsize;
|
int sectorsize;
|
||||||
int volume[2];
|
int volume[2];
|
||||||
|
@ -20,7 +15,7 @@ private:
|
||||||
bool active;
|
bool active;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
uae_u8 *buffers[2];
|
uae_u8* buffers[2];
|
||||||
|
|
||||||
cda_audio(int num_sectors, int sectorsize, int samplerate, bool internalmode);
|
cda_audio(int num_sectors, int sectorsize, int samplerate, bool internalmode);
|
||||||
~cda_audio();
|
~cda_audio();
|
||||||
|
|
|
@ -53,16 +53,20 @@ static int statuscnt;
|
||||||
#define SND_MAX_BUFFER2 524288
|
#define SND_MAX_BUFFER2 524288
|
||||||
#define SND_MAX_BUFFER 65536
|
#define SND_MAX_BUFFER 65536
|
||||||
|
|
||||||
//uae_u16 paula_sndbuffer[SND_MAX_BUFFER];
|
|
||||||
uae_u16 paula_sndbuffer[SND_MAX_BUFFER];
|
uae_u16 paula_sndbuffer[SND_MAX_BUFFER];
|
||||||
uae_u16* paula_sndbufpt;
|
uae_u16* paula_sndbufpt;
|
||||||
int paula_sndbufsize;
|
int paula_sndbufsize;
|
||||||
|
|
||||||
SDL_AudioSpec want, have;
|
#ifdef AMIBERRY
|
||||||
SDL_AudioDeviceID dev;
|
SDL_AudioDeviceID dev;
|
||||||
|
|
||||||
void sdl2_audio_callback(void* userdata, Uint8* stream, int len);
|
void sdl2_audio_callback(void* userdata, Uint8* stream, int len);
|
||||||
|
|
||||||
|
uae_u16 cdaudio_buffer[SND_MAX_BUFFER];
|
||||||
|
uae_u16* cdbufpt;
|
||||||
|
int cdaudio_bufsize;
|
||||||
|
bool cdaudio_active = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct sound_device* sound_devices[MAX_SOUND_DEVICES];
|
struct sound_device* sound_devices[MAX_SOUND_DEVICES];
|
||||||
struct sound_device* record_devices[MAX_SOUND_DEVICES];
|
struct sound_device* record_devices[MAX_SOUND_DEVICES];
|
||||||
|
|
||||||
|
@ -101,14 +105,12 @@ extern int vsynctimebase_orig;
|
||||||
|
|
||||||
void sound_setadjust(double v)
|
void sound_setadjust(double v)
|
||||||
{
|
{
|
||||||
float mult;
|
|
||||||
|
|
||||||
if (v < -ADJUST_LIMIT)
|
if (v < -ADJUST_LIMIT)
|
||||||
v = -ADJUST_LIMIT;
|
v = -ADJUST_LIMIT;
|
||||||
if (v > ADJUST_LIMIT)
|
if (v > ADJUST_LIMIT)
|
||||||
v = ADJUST_LIMIT;
|
v = ADJUST_LIMIT;
|
||||||
|
|
||||||
mult = 1000.0 + v;
|
const float mult = 1000.0 + v;
|
||||||
if (isvsync_chipset()) {
|
if (isvsync_chipset()) {
|
||||||
vsynctimebase = vsynctimebase_orig;
|
vsynctimebase = vsynctimebase_orig;
|
||||||
scaled_sample_evtime = scaled_sample_evtime_orig * mult / 1000.0;
|
scaled_sample_evtime = scaled_sample_evtime_orig * mult / 1000.0;
|
||||||
|
@ -134,11 +136,10 @@ static void docorrection(struct sound_dp* s, int sndbuf, double sync, int granul
|
||||||
granulaty = 10;
|
granulaty = 10;
|
||||||
|
|
||||||
if (tfprev != timeframes) {
|
if (tfprev != timeframes) {
|
||||||
double skipmode, avgskipmode;
|
const auto avg = s->avg_correct / s->cnt_correct;
|
||||||
double avg = s->avg_correct / s->cnt_correct;
|
|
||||||
|
|
||||||
skipmode = sync / 100.0;
|
auto skipmode = sync / 100.0;
|
||||||
avgskipmode = avg / (10000.0 / granulaty);
|
const auto avgskipmode = avg / (10000.0 / granulaty);
|
||||||
|
|
||||||
gui_data.sndbuf = sndbuf;
|
gui_data.sndbuf = sndbuf;
|
||||||
|
|
||||||
|
@ -166,7 +167,7 @@ static double sync_sound(double m)
|
||||||
skipmode = ADJUST_VSSIZE;
|
skipmode = ADJUST_VSSIZE;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (1) {
|
else {
|
||||||
|
|
||||||
skipmode = pow(m < 0 ? -m : m, EXP) / 2;
|
skipmode = pow(m < 0 ? -m : m, EXP) / 2;
|
||||||
if (m < 0)
|
if (m < 0)
|
||||||
|
@ -183,13 +184,16 @@ static double sync_sound(double m)
|
||||||
static void clearbuffer_sdl2(struct sound_data *sd)
|
static void clearbuffer_sdl2(struct sound_data *sd)
|
||||||
{
|
{
|
||||||
SDL_LockAudioDevice(dev);
|
SDL_LockAudioDevice(dev);
|
||||||
SDL_memset(paula_sndbuffer, 0, sizeof paula_sndbuffer);
|
memset(paula_sndbuffer, 0, sizeof paula_sndbuffer);
|
||||||
|
#ifdef AMIBERRY
|
||||||
|
clear_cdaudio_buffers();
|
||||||
|
#endif
|
||||||
SDL_UnlockAudioDevice(dev);
|
SDL_UnlockAudioDevice(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clearbuffer(struct sound_data* sd)
|
static void clearbuffer(struct sound_data* sd)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
auto* s = sd->data;
|
||||||
clearbuffer_sdl2(sd);
|
clearbuffer_sdl2(sd);
|
||||||
if (s->pullbuffer) {
|
if (s->pullbuffer) {
|
||||||
memset(s->pullbuffer, 0, s->pullbuffermaxlen);
|
memset(s->pullbuffer, 0, s->pullbuffermaxlen);
|
||||||
|
@ -212,7 +216,7 @@ static void pause_audio_sdl2(struct sound_data* sd)
|
||||||
|
|
||||||
static void resume_audio_sdl2(struct sound_data* sd)
|
static void resume_audio_sdl2(struct sound_data* sd)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
auto* s = sd->data;
|
||||||
sd->paused = 0;
|
sd->paused = 0;
|
||||||
clearbuffer(sd);
|
clearbuffer(sd);
|
||||||
sd->waiting_for_buffer = 1;
|
sd->waiting_for_buffer = 1;
|
||||||
|
@ -223,9 +227,8 @@ static void resume_audio_sdl2(struct sound_data* sd)
|
||||||
|
|
||||||
static void close_audio_sdl2(struct sound_data* sd)
|
static void close_audio_sdl2(struct sound_data* sd)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
auto* s = sd->data;
|
||||||
SDL_PauseAudioDevice(dev, 1);
|
SDL_PauseAudioDevice(dev, 1);
|
||||||
// shut everything down
|
|
||||||
SDL_CloseAudioDevice(dev);
|
SDL_CloseAudioDevice(dev);
|
||||||
xfree(s->pullbuffer);
|
xfree(s->pullbuffer);
|
||||||
s->pullbuffer = NULL;
|
s->pullbuffer = NULL;
|
||||||
|
@ -246,7 +249,7 @@ void set_volume(int volume, int mute)
|
||||||
|
|
||||||
static void finish_sound_buffer_pull(struct sound_data* sd, uae_u16* sndbuffer)
|
static void finish_sound_buffer_pull(struct sound_data* sd, uae_u16* sndbuffer)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
auto* s = sd->data;
|
||||||
|
|
||||||
if (s->pullbufferlen + sd->sndbufsize > s->pullbuffermaxlen) {
|
if (s->pullbufferlen + sd->sndbufsize > s->pullbuffermaxlen) {
|
||||||
write_log(_T("pull overflow! %d %d %d\n"), s->pullbufferlen, sd->sndbufsize, s->pullbuffermaxlen);
|
write_log(_T("pull overflow! %d %d %d\n"), s->pullbufferlen, sd->sndbufsize, s->pullbuffermaxlen);
|
||||||
|
@ -256,12 +259,17 @@ static void finish_sound_buffer_pull(struct sound_data* sd, uae_u16* sndbuffer)
|
||||||
s->pullbufferlen += sd->sndbufsize;
|
s->pullbufferlen += sd->sndbufsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void finish_cdaudio_buffer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int open_audio_sdl2(struct sound_data* sd, int index)
|
static int open_audio_sdl2(struct sound_data* sd, int index)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
auto* const s = sd->data;
|
||||||
int freq = sd->freq;
|
const auto freq = sd->freq;
|
||||||
int ch = sd->channels;
|
const auto ch = sd->channels;
|
||||||
int size;
|
|
||||||
|
|
||||||
sd->devicetype = SOUND_DEVICE_SDL2;
|
sd->devicetype = SOUND_DEVICE_SDL2;
|
||||||
if (sd->sndbufsize < 0x80)
|
if (sd->sndbufsize < 0x80)
|
||||||
|
@ -272,7 +280,8 @@ static int open_audio_sdl2(struct sound_data* sd, int index)
|
||||||
if (sd->sndbufsize > SND_MAX_BUFFER)
|
if (sd->sndbufsize > SND_MAX_BUFFER)
|
||||||
sd->sndbufsize = SND_MAX_BUFFER;
|
sd->sndbufsize = SND_MAX_BUFFER;
|
||||||
|
|
||||||
SDL_memset(&want, 0, sizeof want);
|
SDL_AudioSpec want, have;
|
||||||
|
memset(&want, 0, sizeof want);
|
||||||
want.freq = freq;
|
want.freq = freq;
|
||||||
want.format = AUDIO_S16;
|
want.format = AUDIO_S16;
|
||||||
want.channels = ch;
|
want.channels = ch;
|
||||||
|
@ -285,13 +294,17 @@ static int open_audio_sdl2(struct sound_data* sd, int index)
|
||||||
|
|
||||||
dev = SDL_OpenAudioDevice(nullptr, 0, &want, &have, 0);
|
dev = SDL_OpenAudioDevice(nullptr, 0, &want, &have, 0);
|
||||||
if (dev == 0)
|
if (dev == 0)
|
||||||
SDL_Log("Failed to open audio: %s", SDL_GetError());
|
{
|
||||||
|
write_log("Failed to open audio: %s", SDL_GetError());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
s->pullbuffermaxlen = sd->sndbufsize * 2;
|
s->pullbuffermaxlen = sd->sndbufsize * 2;
|
||||||
s->pullbuffer = xcalloc(uae_u8, s->pullbuffermaxlen);
|
s->pullbuffer = xcalloc(uae_u8, s->pullbuffermaxlen);
|
||||||
s->pullbufferlen = 0;
|
s->pullbufferlen = 0;
|
||||||
|
|
||||||
clear_sound_buffers();
|
clear_sound_buffers();
|
||||||
|
clear_cdaudio_buffers();
|
||||||
SDL_PauseAudioDevice(dev, 0);
|
SDL_PauseAudioDevice(dev, 0);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -299,16 +312,15 @@ static int open_audio_sdl2(struct sound_data* sd, int index)
|
||||||
|
|
||||||
int open_sound_device(struct sound_data* sd, int index, int bufsize, int freq, int channels)
|
int open_sound_device(struct sound_data* sd, int index, int bufsize, int freq, int channels)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
auto* dp = xcalloc(struct sound_dp, 1);
|
||||||
struct sound_dp* sdp = xcalloc(struct sound_dp, 1);
|
|
||||||
|
|
||||||
sd->data = sdp;
|
sd->data = dp;
|
||||||
sd->sndbufsize = bufsize;
|
sd->sndbufsize = bufsize;
|
||||||
sd->freq = freq;
|
sd->freq = freq;
|
||||||
sd->channels = channels;
|
sd->channels = channels;
|
||||||
sd->paused = 1;
|
sd->paused = 1;
|
||||||
sd->index = index;
|
sd->index = index;
|
||||||
ret = open_audio_sdl2(sd, index);
|
const auto ret = open_audio_sdl2(sd, index);
|
||||||
sd->samplesize = sd->channels * 2;
|
sd->samplesize = sd->channels * 2;
|
||||||
sd->sndbufframes = sd->sndbufsize / sd->samplesize;
|
sd->sndbufframes = sd->sndbufsize / sd->samplesize;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -325,7 +337,6 @@ void close_sound_device(struct sound_data* sd)
|
||||||
|
|
||||||
void pause_sound_device(struct sound_data* sd)
|
void pause_sound_device(struct sound_data* sd)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
|
||||||
sd->paused = 1;
|
sd->paused = 1;
|
||||||
gui_data.sndbuf_status = 0;
|
gui_data.sndbuf_status = 0;
|
||||||
gui_data.sndbuf = 0;
|
gui_data.sndbuf = 0;
|
||||||
|
@ -333,15 +344,13 @@ void pause_sound_device(struct sound_data* sd)
|
||||||
}
|
}
|
||||||
void resume_sound_device(struct sound_data* sd)
|
void resume_sound_device(struct sound_data* sd)
|
||||||
{
|
{
|
||||||
struct sound_dp* s = sd->data;
|
|
||||||
resume_audio_sdl2(sd);
|
resume_audio_sdl2(sd);
|
||||||
sd->paused = 0;
|
sd->paused = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int open_sound()
|
static int open_sound()
|
||||||
{
|
{
|
||||||
int ret = 0, ch;
|
auto size = currprefs.sound_maxbsiz;
|
||||||
int size = currprefs.sound_maxbsiz;
|
|
||||||
|
|
||||||
if (!currprefs.produce_sound) {
|
if (!currprefs.produce_sound) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -356,8 +365,8 @@ static int open_sound()
|
||||||
size &= ~63;
|
size &= ~63;
|
||||||
|
|
||||||
sdp->softvolume = -1;
|
sdp->softvolume = -1;
|
||||||
ch = get_audio_nativechannels(currprefs.sound_stereo);
|
const auto ch = get_audio_nativechannels(currprefs.sound_stereo);
|
||||||
ret = open_sound_device(sdp, 0, size, currprefs.sound_freq, ch);
|
const auto ret = open_sound_device(sdp, 0, size, currprefs.sound_freq, ch);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return 0;
|
return 0;
|
||||||
currprefs.sound_freq = changed_prefs.sound_freq = sdp->freq;
|
currprefs.sound_freq = changed_prefs.sound_freq = sdp->freq;
|
||||||
|
@ -380,6 +389,10 @@ static int open_sound()
|
||||||
paula_sndbufpt = paula_sndbuffer;
|
paula_sndbufpt = paula_sndbuffer;
|
||||||
#ifdef DRIVESOUND
|
#ifdef DRIVESOUND
|
||||||
driveclick_init();
|
driveclick_init();
|
||||||
|
#endif
|
||||||
|
#ifdef AMIBERRY
|
||||||
|
cdaudio_bufsize = SND_MAX_BUFFER;
|
||||||
|
cdbufpt = cdaudio_buffer;
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -398,10 +411,10 @@ void close_sound()
|
||||||
extrasndbufsize = 0;
|
extrasndbufsize = 0;
|
||||||
extrasndbuffered = 0;
|
extrasndbuffered = 0;
|
||||||
xfree(extrasndbuf);
|
xfree(extrasndbuf);
|
||||||
extrasndbuf = NULL;
|
extrasndbuf = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sound_paused(void)
|
bool sound_paused()
|
||||||
{
|
{
|
||||||
return sdp->paused != 0;
|
return sdp->paused != 0;
|
||||||
}
|
}
|
||||||
|
@ -453,7 +466,7 @@ int init_sound()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void disable_sound(void)
|
static void disable_sound()
|
||||||
{
|
{
|
||||||
close_sound();
|
close_sound();
|
||||||
currprefs.produce_sound = changed_prefs.produce_sound = 1;
|
currprefs.produce_sound = changed_prefs.produce_sound = 1;
|
||||||
|
@ -461,21 +474,21 @@ static void disable_sound(void)
|
||||||
|
|
||||||
static int reopen_sound(void)
|
static int reopen_sound(void)
|
||||||
{
|
{
|
||||||
bool paused = sdp->paused != 0;
|
const auto paused = sdp->paused != 0;
|
||||||
close_sound();
|
close_sound();
|
||||||
int v = open_sound();
|
const auto v = open_sound();
|
||||||
if (v && !paused)
|
if (v && !paused)
|
||||||
resume_sound_device(sdp);
|
resume_sound_device(sdp);
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void pause_sound_buffer(void)
|
void pause_sound_buffer()
|
||||||
{
|
{
|
||||||
sdp->deactive = true;
|
sdp->deactive = true;
|
||||||
reset_sound();
|
reset_sound();
|
||||||
}
|
}
|
||||||
|
|
||||||
void restart_sound_buffer(void)
|
void restart_sound_buffer()
|
||||||
{
|
{
|
||||||
sdp->deactive = false;
|
sdp->deactive = false;
|
||||||
//restart_sound_buffer2(sdp);
|
//restart_sound_buffer2(sdp);
|
||||||
|
@ -483,18 +496,16 @@ void restart_sound_buffer(void)
|
||||||
|
|
||||||
static void channelswap(uae_s16* sndbuffer, int len)
|
static void channelswap(uae_s16* sndbuffer, int len)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < len; i += 2) {
|
for (auto i = 0; i < len; i += 2) {
|
||||||
uae_s16 t;
|
const auto t = sndbuffer[i];
|
||||||
t = sndbuffer[i];
|
|
||||||
sndbuffer[i] = sndbuffer[i + 1];
|
sndbuffer[i] = sndbuffer[i + 1];
|
||||||
sndbuffer[i + 1] = t;
|
sndbuffer[i + 1] = t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void channelswap6(uae_s16* sndbuffer, int len)
|
static void channelswap6(uae_s16* sndbuffer, int len)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < len; i += 6) {
|
for (auto i = 0; i < len; i += 6) {
|
||||||
uae_s16 t;
|
auto t = sndbuffer[i + 0];
|
||||||
t = sndbuffer[i + 0];
|
|
||||||
sndbuffer[i + 0] = sndbuffer[i + 1];
|
sndbuffer[i + 0] = sndbuffer[i + 1];
|
||||||
sndbuffer[i + 1] = t;
|
sndbuffer[i + 1] = t;
|
||||||
t = sndbuffer[i + 4];
|
t = sndbuffer[i + 4];
|
||||||
|
@ -510,8 +521,8 @@ static void send_sound(struct sound_data* sd, uae_u16* sndbuffer)
|
||||||
if (sd->paused)
|
if (sd->paused)
|
||||||
return;
|
return;
|
||||||
if (sd->softvolume >= 0) {
|
if (sd->softvolume >= 0) {
|
||||||
uae_s16* p = (uae_s16*)sndbuffer;
|
auto* p = reinterpret_cast<uae_s16*>(sndbuffer);
|
||||||
for (int i = 0; i < sd->sndbufsize / 2; i++) {
|
for (auto i = 0; i < sd->sndbufsize / 2; i++) {
|
||||||
p[i] = p[i] * sd->softvolume / 32768;
|
p[i] = p[i] * sd->softvolume / 32768;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -524,43 +535,43 @@ bool audio_is_event_frame_possible(int)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_is_pull(void)
|
int audio_is_pull()
|
||||||
{
|
{
|
||||||
if (sdp->reset)
|
if (sdp->reset)
|
||||||
return 0;
|
return 0;
|
||||||
struct sound_dp* s = sdp->data;
|
auto* s = sdp->data;
|
||||||
if (s && s->pullmode) {
|
if (s && s->pullmode) {
|
||||||
return sdp->paused || sdp->deactive ? -1 : 1;
|
return sdp->paused || sdp->deactive ? -1 : 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_pull_buffer(void)
|
int audio_pull_buffer()
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
auto cnt = 0;
|
||||||
if (sdp->paused || sdp->deactive || sdp->reset)
|
if (sdp->paused || sdp->deactive || sdp->reset)
|
||||||
return 0;
|
return 0;
|
||||||
struct sound_dp* s = sdp->data;
|
auto* s = sdp->data;
|
||||||
if (s->pullbufferlen > 0) {
|
if (s->pullbufferlen > 0) {
|
||||||
cnt++;
|
cnt++;
|
||||||
int size = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer;
|
const auto size = reinterpret_cast<uae_u8*>(paula_sndbufpt) - reinterpret_cast<uae_u8*>(paula_sndbuffer);
|
||||||
if (size > sdp->sndbufsize * 2 / 3)
|
if (size > sdp->sndbufsize * 2 / 3)
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool audio_is_pull_event(void)
|
bool audio_is_pull_event()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool audio_finish_pull(void)
|
bool audio_finish_pull()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_reset(void)
|
static void handle_reset()
|
||||||
{
|
{
|
||||||
if (sdp->resetframe == timeframes)
|
if (sdp->resetframe == timeframes)
|
||||||
return;
|
return;
|
||||||
|
@ -575,16 +586,6 @@ static void handle_reset(void)
|
||||||
if (sdp->resetcnt <= 0) {
|
if (sdp->resetcnt <= 0) {
|
||||||
write_log(_T("Reopen sound failed. Retrying with default device.\n"));
|
write_log(_T("Reopen sound failed. Retrying with default device.\n"));
|
||||||
close_sound();
|
close_sound();
|
||||||
//int type = sound_devices[currprefs.win32_soundcard]->type;
|
|
||||||
//int max = enumerate_sound_devices();
|
|
||||||
//for (int i = 0; i < max; i++) {
|
|
||||||
// if (sound_devices[i]->alname == NULL && sound_devices[i]->type == type) {
|
|
||||||
// currprefs.win32_soundcard = changed_prefs.win32_soundcard = i;
|
|
||||||
// if (open_sound())
|
|
||||||
// return;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
currprefs.produce_sound = changed_prefs.produce_sound = 1;
|
currprefs.produce_sound = changed_prefs.produce_sound = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -601,7 +602,7 @@ static void handle_reset(void)
|
||||||
void finish_sound_buffer()
|
void finish_sound_buffer()
|
||||||
{
|
{
|
||||||
static unsigned long tframe;
|
static unsigned long tframe;
|
||||||
int bufsize = (uae_u8*)paula_sndbufpt - (uae_u8*)paula_sndbuffer;
|
const auto bufsize = reinterpret_cast<uae_u8*>(paula_sndbufpt) - reinterpret_cast<uae_u8*>(paula_sndbuffer);
|
||||||
|
|
||||||
if (sdp->reset) {
|
if (sdp->reset) {
|
||||||
handle_reset();
|
handle_reset();
|
||||||
|
@ -645,15 +646,15 @@ void finish_sound_buffer()
|
||||||
gui_data.sndbuf_status = 0;
|
gui_data.sndbuf_status = 0;
|
||||||
|
|
||||||
if (extrasndbuf) {
|
if (extrasndbuf) {
|
||||||
int size = extrasndbuffered + bufsize;
|
const auto size = extrasndbuffered + bufsize;
|
||||||
int copied = 0;
|
auto copied = 0;
|
||||||
if (size > extrasndbufsize) {
|
if (size > extrasndbufsize) {
|
||||||
copied = extrasndbufsize - extrasndbuffered;
|
copied = extrasndbufsize - extrasndbuffered;
|
||||||
memcpy(extrasndbuf + extrasndbuffered, paula_sndbuffer, copied);
|
memcpy(extrasndbuf + extrasndbuffered, paula_sndbuffer, copied);
|
||||||
send_sound(sdp, (uae_u16*)extrasndbuf);
|
send_sound(sdp, reinterpret_cast<uae_u16*>(extrasndbuf));
|
||||||
extrasndbuffered = 0;
|
extrasndbuffered = 0;
|
||||||
}
|
}
|
||||||
memcpy(extrasndbuf + extrasndbuffered, (uae_u8*)paula_sndbuffer + copied, bufsize - copied);
|
memcpy(extrasndbuf + extrasndbuffered, reinterpret_cast<uae_u8*>(paula_sndbuffer) + copied, bufsize - copied);
|
||||||
extrasndbuffered += bufsize - copied;
|
extrasndbuffered += bufsize - copied;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -701,9 +702,9 @@ void sound_volume(int dir)
|
||||||
|
|
||||||
void master_sound_volume(int dir)
|
void master_sound_volume(int dir)
|
||||||
{
|
{
|
||||||
int vol, mute, r;
|
int vol, mute;
|
||||||
|
|
||||||
r = get_master_volume(&vol, &mute);
|
const auto r = get_master_volume(&vol, &mute);
|
||||||
if (!r)
|
if (!r)
|
||||||
return;
|
return;
|
||||||
if (dir == 0)
|
if (dir == 0)
|
||||||
|
@ -720,20 +721,19 @@ void master_sound_volume(int dir)
|
||||||
// Audio callback function
|
// Audio callback function
|
||||||
void sdl2_audio_callback(void* userdata, Uint8* stream, int len)
|
void sdl2_audio_callback(void* userdata, Uint8* stream, int len)
|
||||||
{
|
{
|
||||||
struct sound_data* sd = (struct sound_data*)userdata;
|
auto* sd = static_cast<sound_data*>(userdata);
|
||||||
struct sound_dp* s = sd->data;
|
auto* s = sd->data;
|
||||||
int bytestocopy;
|
|
||||||
|
|
||||||
if (s->pullbufferlen <= 0)
|
if (s->pullbufferlen <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bytestocopy = s->framesperbuffer * sd->samplesize;
|
const auto bytes_to_copy = s->framesperbuffer * sd->samplesize;
|
||||||
if (bytestocopy > 0) {
|
if (bytes_to_copy > 0) {
|
||||||
memcpy(stream, s->pullbuffer, bytestocopy);
|
memcpy(stream, s->pullbuffer, bytes_to_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytestocopy < s->pullbufferlen) {
|
if (bytes_to_copy < s->pullbufferlen) {
|
||||||
memmove(s->pullbuffer, s->pullbuffer + bytestocopy, s->pullbufferlen - bytestocopy);
|
memmove(s->pullbuffer, s->pullbuffer + bytes_to_copy, s->pullbufferlen - bytes_to_copy);
|
||||||
}
|
}
|
||||||
s->pullbufferlen -= bytestocopy;
|
s->pullbufferlen -= bytes_to_copy;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,18 @@
|
||||||
extern uae_u16 paula_sndbuffer[];
|
extern uae_u16 paula_sndbuffer[];
|
||||||
extern uae_u16* paula_sndbufpt;
|
extern uae_u16* paula_sndbufpt;
|
||||||
extern int paula_sndbufsize;
|
extern int paula_sndbufsize;
|
||||||
|
#ifdef AMIBERRY
|
||||||
|
extern uae_u16 cdaudio_buffer[];
|
||||||
|
extern uae_u16* cdbufpt;
|
||||||
|
extern int cdaudio_bufsize;
|
||||||
|
extern bool cdaudio_active;
|
||||||
|
extern void finish_cdaudio_buffer();
|
||||||
|
extern bool cdaudio_catchup();
|
||||||
|
#define PUT_CDAUDIO_WORD_STEREO(l,r) do { *((uae_u32 *)cdbufpt) = ((r) << 16) | ((l) & 0xffff); cdbufpt = cdbufpt + 2; } while (0)
|
||||||
|
|
||||||
|
extern SDL_AudioDeviceID dev;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void finish_sound_buffer(void);
|
extern void finish_sound_buffer(void);
|
||||||
extern void restart_sound_buffer(void);
|
extern void restart_sound_buffer(void);
|
||||||
extern void pause_sound_buffer(void);
|
extern void pause_sound_buffer(void);
|
||||||
|
@ -124,12 +136,30 @@ STATIC_INLINE void check_sound_buffers()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE void clear_sound_buffers(void)
|
STATIC_INLINE void clear_sound_buffers()
|
||||||
{
|
{
|
||||||
memset(paula_sndbuffer, 0, paula_sndbufsize);
|
memset(paula_sndbuffer, 0, paula_sndbufsize);
|
||||||
paula_sndbufpt = paula_sndbuffer;
|
paula_sndbufpt = paula_sndbuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef AMIBERRY
|
||||||
|
STATIC_INLINE void check_cdaudio_buffers()
|
||||||
|
{
|
||||||
|
if ((uae_u8*)cdbufpt - (uae_u8*)cdaudio_buffer >= cdaudio_bufsize)
|
||||||
|
{
|
||||||
|
finish_cdaudio_buffer();
|
||||||
|
cdbufpt = cdaudio_buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC_INLINE void clear_cdaudio_buffers()
|
||||||
|
{
|
||||||
|
memset(cdaudio_buffer, 0, cdaudio_bufsize);
|
||||||
|
cdbufpt = cdaudio_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define PUT_SOUND_WORD(b) do { *(uae_u16 *)paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2); } while (0)
|
#define PUT_SOUND_WORD(b) do { *(uae_u16 *)paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2); } while (0)
|
||||||
#define PUT_SOUND_WORD_MONO(b) PUT_SOUND_WORD(b)
|
#define PUT_SOUND_WORD_MONO(b) PUT_SOUND_WORD(b)
|
||||||
#define SOUND16_BASE_VAL 0
|
#define SOUND16_BASE_VAL 0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue