From 32894736780ea63e5fea456de27650fc27ec57c6 Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Sat, 28 Sep 2013 18:01:12 +0200 Subject: audio/out: add sndio support Based on an earlier patch for mplayer by Alexandre Ratchov --- stream/ai_sndio.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ stream/audio_in.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ stream/audio_in.h | 19 ++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 stream/ai_sndio.c (limited to 'stream') diff --git a/stream/ai_sndio.c b/stream/ai_sndio.c new file mode 100644 index 0000000000..b486bb9210 --- /dev/null +++ b/stream/ai_sndio.c @@ -0,0 +1,49 @@ +#include +#include + +#include "config.h" + +#include +#include "audio_in.h" +#include "mpvcore/mp_msg.h" + +int ai_sndio_setup(audio_in_t *ai) +{ + struct sio_par par; + + sio_initpar(&par); + + par.bits = 16; + par.sig = 1; + par.le = 1; + par.rchan = ai->req_channels; + par.rate = ai->req_samplerate; + par.appbufsz = ai->req_samplerate; /* 1 sec */ + + if (!sio_setpar(ai->sndio.hdl, &par) || !sio_getpar(ai->sndio.hdl, &par)) { + mp_msg(MSGT_TV, MSGL_ERR, "could not configure sndio audio"); + return -1; + } + + ai->channels = par.rchan; + ai->samplerate = par.rate; + ai->samplesize = par.bits; + ai->bytes_per_sample = par.bps; + ai->blocksize = par.round * par.bps; + + return 0; +} + +int ai_sndio_init(audio_in_t *ai) +{ + int err; + + if ((ai->sndio.hdl = sio_open(ai->sndio.device, SIO_REC, 0)) == NULL) { + mp_msg(MSGT_TV, MSGL_ERR, "could not open sndio audio"); + return -1; + } + + err = ai_sndio_setup(ai); + + return err; +} diff --git a/stream/audio_in.c b/stream/audio_in.c index cc54e87800..420311e848 100644 --- a/stream/audio_in.c +++ b/stream/audio_in.c @@ -52,6 +52,12 @@ int audio_in_init(audio_in_t *ai, int type) ai->oss.audio_fd = -1; ai->oss.device = strdup("/dev/dsp"); return 0; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + ai->sndio.hdl = NULL; + ai->sndio.device = strdup("default"); + return 0; #endif default: return -1; @@ -73,6 +79,12 @@ int audio_in_setup(audio_in_t *ai) if (ai_oss_init(ai) < 0) return -1; ai->setup = 1; return 0; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + if (ai_sndio_init(ai) < 0) return -1; + ai->setup = 1; + return 0; #endif default: return -1; @@ -95,6 +107,13 @@ int audio_in_set_samplerate(audio_in_t *ai, int rate) if (!ai->setup) return 0; if (ai_oss_set_samplerate(ai) < 0) return -1; return ai->samplerate; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + ai->req_samplerate = rate; + if (!ai->setup) return 0; + if (ai_sndio_setup(ai) < 0) return -1; + return ai->samplerate; #endif default: return -1; @@ -117,6 +136,13 @@ int audio_in_set_channels(audio_in_t *ai, int channels) if (!ai->setup) return 0; if (ai_oss_set_channels(ai) < 0) return -1; return ai->channels; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + ai->req_channels = channels; + if (!ai->setup) return 0; + if (ai_sndio_setup(ai) < 0) return -1; + return ai->channels; #endif default: return -1; @@ -145,6 +171,12 @@ int audio_in_set_device(audio_in_t *ai, char *device) free(ai->oss.device); ai->oss.device = strdup(device); return 0; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + if (ai->sndio.device) free(ai->sndio.device); + ai->sndio.device = strdup(device); + return 0; #endif default: return -1; @@ -170,6 +202,13 @@ int audio_in_uninit(audio_in_t *ai) close(ai->oss.audio_fd); ai->setup = 0; return 0; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + if (ai->sndio.hdl) + sio_close(ai->sndio.hdl); + ai->setup = 0; + return 0; #endif } } @@ -186,6 +225,12 @@ int audio_in_start_capture(audio_in_t *ai) #ifdef CONFIG_OSS_AUDIO case AUDIO_IN_OSS: return 0; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + if (!sio_start(ai->sndio.hdl)) + return -1; + return 0; #endif default: return -1; @@ -220,6 +265,20 @@ int audio_in_read_chunk(audio_in_t *ai, unsigned char *buffer) #ifdef CONFIG_OSS_AUDIO case AUDIO_IN_OSS: ret = read(ai->oss.audio_fd, buffer, ai->blocksize); + if (ret != ai->blocksize) { + if (ret < 0) { + mp_msg(MSGT_TV, MSGL_ERR, "\nError reading audio: %s\n", strerror(errno)); + + } else { + mp_msg(MSGT_TV, MSGL_ERR, "\nNot enough audio samples!\n"); + } + return -1; + } + return ret; +#endif +#ifdef CONFIG_SNDIO + case AUDIO_IN_SNDIO: + ret = sio_read(ai->sndio.hdl, buffer, ai->blocksize); if (ret != ai->blocksize) { if (ret < 0) { mp_tmsg(MSGT_TV, MSGL_ERR, "\nError reading audio: %s\n", strerror(errno)); diff --git a/stream/audio_in.h b/stream/audio_in.h index 31688e7192..2f42685c7c 100644 --- a/stream/audio_in.h +++ b/stream/audio_in.h @@ -21,6 +21,7 @@ #define AUDIO_IN_ALSA 1 #define AUDIO_IN_OSS 2 +#define AUDIO_IN_SNDIO 3 #include "config.h" @@ -45,6 +46,16 @@ typedef struct { } ai_oss_t; #endif +#ifdef CONFIG_SNDIO +#include + +typedef struct { + char *device; + + struct sio_hdl *hdl; +} ai_sndio_t; +#endif + typedef struct { int type; @@ -67,6 +78,9 @@ typedef struct #ifdef CONFIG_OSS_AUDIO ai_oss_t oss; #endif +#ifdef CONFIG_SNDIO + ai_sndio_t sndio; +#endif } audio_in_t; int audio_in_init(audio_in_t *ai, int type); @@ -90,4 +104,9 @@ int ai_oss_set_channels(audio_in_t *ai); int ai_oss_init(audio_in_t *ai); #endif +#ifdef CONFIG_SNDIO +int ai_sndio_setup(audio_in_t *ai); +int ai_sndio_init(audio_in_t *ai); +#endif + #endif /* MPLAYER_AUDIO_IN_H */ -- cgit v1.2.3