mirror of
https://github.com/libretro/RetroArch
synced 2025-01-29 09:32:52 +00:00
Fix ugly Jack crash with race condition.
This commit is contained in:
parent
343852af26
commit
a76b25aff9
30
audio/jack.c
30
audio/jack.c
@ -127,12 +127,12 @@ static size_t find_buffersize(jack_t *jd, int latency)
|
|||||||
static void* __jack_init(const char* device, unsigned rate, unsigned latency)
|
static void* __jack_init(const char* device, unsigned rate, unsigned latency)
|
||||||
{
|
{
|
||||||
jack_t *jd = calloc(1, sizeof(jack_t));
|
jack_t *jd = calloc(1, sizeof(jack_t));
|
||||||
if ( jd == NULL )
|
if (!jd)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pthread_cond_init(&jd->cond, NULL);
|
pthread_cond_init(&jd->cond, NULL);
|
||||||
pthread_mutex_init(&jd->cond_lock, NULL);
|
pthread_mutex_init(&jd->cond_lock, NULL);
|
||||||
|
|
||||||
const char **jports = NULL;
|
const char **jports = NULL;
|
||||||
|
|
||||||
jd->client = jack_client_open("SSNES", JackNullOption, NULL);
|
jd->client = jack_client_open("SSNES", JackNullOption, NULL);
|
||||||
@ -160,6 +160,18 @@ static void* __jack_init(const char* device, unsigned rate, unsigned latency)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t bufsize = find_buffersize(jd, latency);
|
||||||
|
SSNES_LOG("JACK: Internal buffer size: %d frames.\n", (int)(bufsize / sizeof(jack_default_audio_sample_t)));
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
jd->buffer[i] = jack_ringbuffer_create(bufsize);
|
||||||
|
if (jd->buffer[i] == NULL)
|
||||||
|
{
|
||||||
|
SSNES_ERR("Failed to create buffers.\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int parsed = parse_ports(dest_ports, jports);
|
int parsed = parse_ports(dest_ports, jports);
|
||||||
|
|
||||||
if (jack_activate(jd->client) < 0)
|
if (jack_activate(jd->client) < 0)
|
||||||
@ -180,19 +192,7 @@ static void* __jack_init(const char* device, unsigned rate, unsigned latency)
|
|||||||
for (int i = 0; i < parsed; i++)
|
for (int i = 0; i < parsed; i++)
|
||||||
free(dest_ports[i]);
|
free(dest_ports[i]);
|
||||||
|
|
||||||
size_t bufsize = find_buffersize(jd, latency);
|
|
||||||
|
|
||||||
SSNES_LOG("JACK: Internal buffer size: %d frames.\n", (int)(bufsize / sizeof(jack_default_audio_sample_t)));
|
|
||||||
for (int i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
jd->buffer[i] = jack_ringbuffer_create(bufsize);
|
|
||||||
if (jd->buffer[i] == NULL)
|
|
||||||
{
|
|
||||||
SSNES_ERR("Failed to create buffers.\n");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jack_free(jports);
|
jack_free(jports);
|
||||||
return jd;
|
return jd;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user