mixer.c: Fix doxygen \file description.
[paraslash.git] / oss_write.c
index 35f7b6280115ec53bf88d5f2e303e34f8cc45d98..311a514dc86ff6bfb01abf53d16a75672827af12 100644 (file)
@@ -1,26 +1,20 @@
-/*
- * Copyright (C) 2009-2014 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2009 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file oss_write.c Paraslash's oss output plugin. */
 
 #include <regex.h>
 #include <sys/ioctl.h>
-#include <fcntl.h>
 #include <sys/soundcard.h>
+#include <lopsub.h>
 
+#include "write_cmd.lsg.h"
 #include "para.h"
 #include "fd.h"
 #include "string.h"
 #include "list.h"
 #include "sched.h"
-#include "ggo.h"
 #include "buffer_tree.h"
 #include "write.h"
-#include "write_common.h"
-#include "oss_write.cmdline.h"
 #include "error.h"
 
 /** Data specific to the oss writer. */
@@ -63,7 +57,7 @@ static int get_oss_format(enum sample_format sf)
        case SF_S16_BE: return AFMT_S16_BE;
        case SF_U16_LE: return AFMT_U16_LE;
        case SF_U16_BE: return AFMT_U16_BE;
-       default: return AFMT_S16_LE;
+       default: return -E_BAD_SAMPLE_FORMAT;
        }
 }
 
@@ -107,11 +101,11 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate,
 {
        int ret, format;
        unsigned ch, rate;
-       struct oss_write_args_info *conf = wn->conf;
        struct private_oss_write_data *powd = para_calloc(sizeof(*powd));
+       const char *dev = WRITE_CMD_OPT_STRING_VAL(OSS, DEVICE, wn->lpr);
 
-       PARA_INFO_LOG("opening %s\n", conf->device_arg);
-       ret = para_open(conf->device_arg, O_WRONLY, 0);
+       PARA_INFO_LOG("opening %s\n", dev);
+       ret = para_open(dev, O_WRONLY, 0);
        if (ret < 0)
                goto err_free;
        powd->fd = ret;
@@ -119,10 +113,14 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate,
        if (ret < 0)
                goto err;
        /* set PCM format */
-       sample_format = format = get_oss_format(sample_format);
+       ret = get_oss_format(sample_format);
+       if (ret < 0)
+               return ret;
+       sample_format = format = ret;
        ret = ioctl(powd->fd, SNDCTL_DSP_SETFMT, &format);
        if (ret < 0) {
                ret = -ERRNO_TO_PARA_ERROR(errno);
+               PARA_ERROR_LOG("could not set sample format\n");
                goto err;
        }
        ret = -E_BAD_SAMPLE_FORMAT;
@@ -147,7 +145,7 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate,
         * Set sampling rate
         *
         * If we request a higher sampling rate than is supported by the
-        * device, the the highest possible speed is automatically used. The
+        * device, the highest possible speed is automatically used. The
         * value actually used is returned as the new value of the argument.
         */
        rate = sample_rate;
@@ -166,7 +164,7 @@ static int oss_init(struct writer_node *wn, unsigned sample_rate,
                ret = -E_BAD_SAMPLERATE;
                if (100 * max > 110 * min) /* more than 10% deviation */
                        goto err;
-               PARA_NOTICE_LOG("using %dHz rather than %dHz\n", rate,
+               PARA_NOTICE_LOG("using %uHz rather than %uHz\n", rate,
                        sample_rate);
        }
        wn->min_iqs = powd->bytes_per_frame;
@@ -176,8 +174,7 @@ err:
        close(powd->fd);
 err_free:
        free(powd);
-       PARA_ERROR_LOG("failed to init %s: %s\n", conf->device_arg,
-               para_strerror(-ret));
+       PARA_ERROR_LOG("failed to init %s: %s\n", dev, para_strerror(-ret));
        return ret;
 }
 
@@ -241,37 +238,8 @@ out:
        return ret;
 }
 
-__malloc static void *oss_parse_config_or_die(int argc, char **argv)
-{
-       struct oss_write_args_info *conf = para_calloc(sizeof(*conf));
-
-       /* exits on errors */
-       oss_write_cmdline_parser(argc, argv, conf);
-       return conf;
-}
-
-static void oss_free_config(void *conf)
-{
-       oss_write_cmdline_parser_free(conf);
-}
-
-/**
- * The init function of the oss writer.
- *
- * \param w Pointer to the writer to initialize.
- *
- * \sa struct writer.
- */
-void oss_write_init(struct writer *w)
-{
-       struct oss_write_args_info dummy;
-
-       oss_write_cmdline_parser_init(&dummy);
-       w->close = oss_close;
-       w->pre_select = oss_pre_select;
-       w->post_select = oss_post_select;
-       w->parse_config_or_die = oss_parse_config_or_die;
-       w->free_config = oss_free_config;
-       w->help = (struct ggo_help)DEFINE_GGO_HELP(oss_write);
-       oss_write_cmdline_parser_free(&dummy);
-}
+const struct writer lsg_write_cmd_com_oss_user_data = {
+       .pre_select = oss_pre_select,
+       .post_select = oss_post_select,
+       .close = oss_close,
+};