sndio: Coalesce source files after outdev removal
authorDiego Biurrun <diego@biurrun.de>
Wed, 27 Sep 2017 13:12:41 +0000 (15:12 +0200)
committerDiego Biurrun <diego@biurrun.de>
Fri, 13 Oct 2017 21:57:59 +0000 (23:57 +0200)
libavdevice/Makefile
libavdevice/sndio.c [moved from libavdevice/sndio_dec.c with 56% similarity]
libavdevice/sndio.h [deleted file]

index 6954202..18228f5 100644 (file)
@@ -18,7 +18,7 @@ OBJS-$(CONFIG_FBDEV_INDEV)               += fbdev.o
 OBJS-$(CONFIG_JACK_INDEV)                += jack.o timefilter.o
 OBJS-$(CONFIG_OSS_INDEV)                 += oss_dec.o oss.o
 OBJS-$(CONFIG_PULSE_INDEV)               += pulse.o
-OBJS-$(CONFIG_SNDIO_INDEV)               += sndio_dec.o sndio.o
+OBJS-$(CONFIG_SNDIO_INDEV)               += sndio.o
 OBJS-$(CONFIG_V4L2_INDEV)                += v4l2.o
 OBJS-$(CONFIG_VFWCAP_INDEV)              += vfwcap.o
 OBJS-$(CONFIG_XCBGRAB_INDEV)             += xcbgrab.o
similarity index 56%
rename from libavdevice/sndio_dec.c
rename to libavdevice/sndio.c
index a839a6f..ae14453 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * sndio play and grab interface
+ * sndio grab interface
  * Copyright (c) 2010 Jacob Meuser
  *
  * This file is part of Libav.
 #include "libavformat/avformat.h"
 #include "libavformat/internal.h"
 
-#include "libavdevice/sndio.h"
+typedef struct SndioData {
+    AVClass *class;
+    struct sio_hdl *hdl;
+    enum AVCodecID codec_id;
+    int64_t hwpos;
+    int64_t softpos;
+    uint8_t *buffer;
+    int bps;
+    int buffer_size;
+    int buffer_offset;
+    int channels;
+    int sample_rate;
+} SndioData;
+
+static inline void movecb(void *addr, int delta)
+{
+    SndioData *s = addr;
+
+    s->hwpos += delta * s->channels * s->bps;
+}
+
+static av_cold int sndio_open(AVFormatContext *s1, int is_output,
+                              const char *audio_device)
+{
+    SndioData *s = s1->priv_data;
+    struct sio_hdl *hdl;
+    struct sio_par par;
+
+    hdl = sio_open(audio_device, is_output ? SIO_PLAY : SIO_REC, 0);
+    if (!hdl) {
+        av_log(s1, AV_LOG_ERROR, "Could not open sndio device\n");
+        return AVERROR(EIO);
+    }
+
+    sio_initpar(&par);
+
+    par.bits = 16;
+    par.sig  = 1;
+    par.le   = SIO_LE_NATIVE;
+
+    if (is_output)
+        par.pchan = s->channels;
+    else
+        par.rchan = s->channels;
+    par.rate = s->sample_rate;
+
+    if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) {
+        av_log(s1, AV_LOG_ERROR, "Impossible to set sndio parameters, "
+               "channels: %d sample rate: %d\n", s->channels, s->sample_rate);
+        goto fail;
+    }
+
+    if (par.bits != 16 || par.sig != 1 ||
+        (is_output  && (par.pchan != s->channels)) ||
+        (!is_output && (par.rchan != s->channels)) ||
+        (par.rate != s->sample_rate)) {
+        av_log(s1, AV_LOG_ERROR, "Could not set appropriate sndio parameters, "
+               "channels: %d sample rate: %d\n", s->channels, s->sample_rate);
+        goto fail;
+    }
+
+    s->buffer_size = par.round * par.bps *
+                     (is_output ? par.pchan : par.rchan);
+
+    if (is_output) {
+        s->buffer = av_malloc(s->buffer_size);
+        if (!s->buffer) {
+            av_log(s1, AV_LOG_ERROR, "Could not allocate buffer\n");
+            goto fail;
+        }
+    }
+
+    s->codec_id    = par.le ? AV_CODEC_ID_PCM_S16LE : AV_CODEC_ID_PCM_S16BE;
+    s->channels    = is_output ? par.pchan : par.rchan;
+    s->sample_rate = par.rate;
+    s->bps         = par.bps;
+
+    sio_onmove(hdl, movecb, s);
+
+    if (!sio_start(hdl)) {
+        av_log(s1, AV_LOG_ERROR, "Could not start sndio\n");
+        goto fail;
+    }
+
+    s->hdl = hdl;
+
+    return 0;
+
+fail:
+    av_freep(&s->buffer);
+
+    if (hdl)
+        sio_close(hdl);
+
+    return AVERROR(EIO);
+}
 
 static av_cold int audio_read_header(AVFormatContext *s1)
 {
@@ -41,7 +136,7 @@ static av_cold int audio_read_header(AVFormatContext *s1)
     if (!st)
         return AVERROR(ENOMEM);
 
-    ret = ff_sndio_open(s1, 0, s1->filename);
+    ret = sndio_open(s1, 0, s1->filename);
     if (ret < 0)
         return ret;
 
@@ -90,7 +185,10 @@ static av_cold int audio_read_close(AVFormatContext *s1)
 {
     SndioData *s = s1->priv_data;
 
-    ff_sndio_close(s);
+    av_freep(&s->buffer);
+
+    if (s->hdl)
+        sio_close(s->hdl);
 
     return 0;
 }
diff --git a/libavdevice/sndio.h b/libavdevice/sndio.h
deleted file mode 100644 (file)
index cd5c55e..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * sndio play and grab interface
- * Copyright (c) 2010 Jacob Meuser
- *
- * This file is part of Libav.
- *
- * Libav is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * Libav is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef AVDEVICE_SNDIO_H
-#define AVDEVICE_SNDIO_H
-
-#include <stdint.h>
-#include <sndio.h>
-
-#include "libavformat/avformat.h"
-#include "libavutil/log.h"
-
-typedef struct SndioData {
-    AVClass *class;
-    struct sio_hdl *hdl;
-    enum AVCodecID codec_id;
-    int64_t hwpos;
-    int64_t softpos;
-    uint8_t *buffer;
-    int bps;
-    int buffer_size;
-    int buffer_offset;
-    int channels;
-    int sample_rate;
-} SndioData;
-
-int ff_sndio_open(AVFormatContext *s1, int is_output, const char *audio_device);
-int ff_sndio_close(SndioData *s);
-
-#endif /* AVDEVICE_SNDIO_H */