audio: make audio_pt_init block all signals
Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
parent
748a4ee311
commit
4b7c0418c0
@ -6,6 +6,8 @@
|
|||||||
#include "audio_int.h"
|
#include "audio_int.h"
|
||||||
#include "audio_pt_int.h"
|
#include "audio_pt_int.h"
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
static void logerr (struct audio_pt *pt, int err, const char *fmt, ...)
|
static void logerr (struct audio_pt *pt, int err, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -23,9 +25,16 @@ int audio_pt_init (struct audio_pt *p, void *(*func) (void *),
|
|||||||
{
|
{
|
||||||
int err, err2;
|
int err, err2;
|
||||||
const char *efunc;
|
const char *efunc;
|
||||||
|
sigset_t set, old_set;
|
||||||
|
|
||||||
p->drv = drv;
|
p->drv = drv;
|
||||||
|
|
||||||
|
err = sigfillset (&set);
|
||||||
|
if (err) {
|
||||||
|
logerr (p, errno, "%s(%s): sigfillset failed", cap, AUDIO_FUNC);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
err = pthread_mutex_init (&p->mutex, NULL);
|
err = pthread_mutex_init (&p->mutex, NULL);
|
||||||
if (err) {
|
if (err) {
|
||||||
efunc = "pthread_mutex_init";
|
efunc = "pthread_mutex_init";
|
||||||
@ -38,7 +47,23 @@ int audio_pt_init (struct audio_pt *p, void *(*func) (void *),
|
|||||||
goto err1;
|
goto err1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = pthread_sigmask (SIG_BLOCK, &set, &old_set);
|
||||||
|
if (err) {
|
||||||
|
efunc = "pthread_sigmask";
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
err = pthread_create (&p->thread, NULL, func, opaque);
|
err = pthread_create (&p->thread, NULL, func, opaque);
|
||||||
|
|
||||||
|
err2 = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
|
||||||
|
if (err2) {
|
||||||
|
logerr (p, err2, "%s(%s): pthread_sigmask (restore) failed",
|
||||||
|
cap, AUDIO_FUNC);
|
||||||
|
/* We have failed to restore original signal mask, all bets are off,
|
||||||
|
so terminate the process */
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
efunc = "pthread_create";
|
efunc = "pthread_create";
|
||||||
goto err2;
|
goto err2;
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include <esd.h>
|
#include <esd.h>
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include <signal.h>
|
|
||||||
|
|
||||||
#define AUDIO_CAP "esd"
|
#define AUDIO_CAP "esd"
|
||||||
#include "audio_int.h"
|
#include "audio_int.h"
|
||||||
@ -190,10 +189,6 @@ static int qesd_init_out (HWVoiceOut *hw, struct audsettings *as)
|
|||||||
ESDVoiceOut *esd = (ESDVoiceOut *) hw;
|
ESDVoiceOut *esd = (ESDVoiceOut *) hw;
|
||||||
struct audsettings obt_as = *as;
|
struct audsettings obt_as = *as;
|
||||||
int esdfmt = ESD_STREAM | ESD_PLAY;
|
int esdfmt = ESD_STREAM | ESD_PLAY;
|
||||||
int err;
|
|
||||||
sigset_t set, old_set;
|
|
||||||
|
|
||||||
sigfillset (&set);
|
|
||||||
|
|
||||||
esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
|
esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
|
||||||
switch (as->fmt) {
|
switch (as->fmt) {
|
||||||
@ -231,43 +226,25 @@ static int qesd_init_out (HWVoiceOut *hw, struct audsettings *as)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
esd->fd = -1;
|
|
||||||
err = pthread_sigmask (SIG_BLOCK, &set, &old_set);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask failed\n");
|
|
||||||
goto fail1;
|
|
||||||
}
|
|
||||||
|
|
||||||
esd->fd = esd_play_stream (esdfmt, as->freq, conf.dac_host, NULL);
|
esd->fd = esd_play_stream (esdfmt, as->freq, conf.dac_host, NULL);
|
||||||
if (esd->fd < 0) {
|
if (esd->fd < 0) {
|
||||||
qesd_logerr (errno, "esd_play_stream failed\n");
|
qesd_logerr (errno, "esd_play_stream failed\n");
|
||||||
goto fail2;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_pt_init (&esd->pt, qesd_thread_out, esd, AUDIO_CAP, AUDIO_FUNC)) {
|
if (audio_pt_init (&esd->pt, qesd_thread_out, esd, AUDIO_CAP, AUDIO_FUNC)) {
|
||||||
goto fail3;
|
goto fail2;
|
||||||
}
|
|
||||||
|
|
||||||
err = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask(restore) failed\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail3:
|
fail2:
|
||||||
if (close (esd->fd)) {
|
if (close (esd->fd)) {
|
||||||
qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
|
qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
|
||||||
AUDIO_FUNC, esd->fd);
|
AUDIO_FUNC, esd->fd);
|
||||||
}
|
}
|
||||||
esd->fd = -1;
|
esd->fd = -1;
|
||||||
|
|
||||||
fail2:
|
|
||||||
err = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask(restore) failed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
fail1:
|
fail1:
|
||||||
qemu_free (esd->pcm_buf);
|
qemu_free (esd->pcm_buf);
|
||||||
esd->pcm_buf = NULL;
|
esd->pcm_buf = NULL;
|
||||||
@ -423,10 +400,6 @@ static int qesd_init_in (HWVoiceIn *hw, struct audsettings *as)
|
|||||||
ESDVoiceIn *esd = (ESDVoiceIn *) hw;
|
ESDVoiceIn *esd = (ESDVoiceIn *) hw;
|
||||||
struct audsettings obt_as = *as;
|
struct audsettings obt_as = *as;
|
||||||
int esdfmt = ESD_STREAM | ESD_RECORD;
|
int esdfmt = ESD_STREAM | ESD_RECORD;
|
||||||
int err;
|
|
||||||
sigset_t set, old_set;
|
|
||||||
|
|
||||||
sigfillset (&set);
|
|
||||||
|
|
||||||
esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
|
esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
|
||||||
switch (as->fmt) {
|
switch (as->fmt) {
|
||||||
@ -461,44 +434,25 @@ static int qesd_init_in (HWVoiceIn *hw, struct audsettings *as)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
esd->fd = -1;
|
|
||||||
|
|
||||||
err = pthread_sigmask (SIG_BLOCK, &set, &old_set);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask failed\n");
|
|
||||||
goto fail1;
|
|
||||||
}
|
|
||||||
|
|
||||||
esd->fd = esd_record_stream (esdfmt, as->freq, conf.adc_host, NULL);
|
esd->fd = esd_record_stream (esdfmt, as->freq, conf.adc_host, NULL);
|
||||||
if (esd->fd < 0) {
|
if (esd->fd < 0) {
|
||||||
qesd_logerr (errno, "esd_record_stream failed\n");
|
qesd_logerr (errno, "esd_record_stream failed\n");
|
||||||
goto fail2;
|
goto fail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio_pt_init (&esd->pt, qesd_thread_in, esd, AUDIO_CAP, AUDIO_FUNC)) {
|
if (audio_pt_init (&esd->pt, qesd_thread_in, esd, AUDIO_CAP, AUDIO_FUNC)) {
|
||||||
goto fail3;
|
goto fail2;
|
||||||
}
|
|
||||||
|
|
||||||
err = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask(restore) failed\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail3:
|
fail2:
|
||||||
if (close (esd->fd)) {
|
if (close (esd->fd)) {
|
||||||
qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
|
qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
|
||||||
AUDIO_FUNC, esd->fd);
|
AUDIO_FUNC, esd->fd);
|
||||||
}
|
}
|
||||||
esd->fd = -1;
|
esd->fd = -1;
|
||||||
|
|
||||||
fail2:
|
|
||||||
err = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
|
|
||||||
if (err) {
|
|
||||||
qesd_logerr (err, "pthread_sigmask(restore) failed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
fail1:
|
fail1:
|
||||||
qemu_free (esd->pcm_buf);
|
qemu_free (esd->pcm_buf);
|
||||||
esd->pcm_buf = NULL;
|
esd->pcm_buf = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user