File: ffsox_sox_pull_handler.c

package info (click to toggle)
bs1770gain 0.4.12-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,832 kB
  • sloc: ansic: 9,380; sh: 1,288; makefile: 212
file content (88 lines) | stat: -rwxr-xr-x 2,313 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 * ffsox_sox_pull_handler.c
 * Copyright (C) 2015 Peter Belkner <pbelkner@users.sf.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation; either
 * version 2.0 of the License, or (at your option) any later version.
 *
 * This program 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301  USA
 */
#include <ffsox_priv.h>

///////////////////////////////////////////////////////////////////////////////
typedef struct priv priv_t;

struct priv {
  pull_cb_t cb;
  void *data;
};

///////////////////////////////////////////////////////////////////////////////
static int getopts(sox_effect_t *e, int argc, char *argv[])
{
  priv_t *priv=e->priv;

  priv->cb=1<argc?(void *)argv[1]:NULL;
  priv->data=2<argc?(void *)argv[2]:NULL;

  return SOX_SUCCESS;
}

static int flow(sox_effect_t *e, sox_sample_t const *ibuf, sox_sample_t *obuf,
    size_t * isamp, size_t * osamp)
{
  priv_t *priv=e->priv;
  pull_cb_t cb=priv->cb;
  void *data;
  sox_sample_t const *rp,*mp;
  double scale;

  (void)obuf;

  if (NULL!=cb) {
    data=priv->data;
    rp=ibuf;
    mp=rp+*isamp;
    scale=1.0/MAXOF(*rp);

    while (rp<mp)
      cb(data,scale*(*rp++));
  }

  /* Outputting is the last `effect' in the effect chain so always passes
   * 0 samples on to the next effect (as there isn't one!) */
  *osamp = 0;

  return SOX_SUCCESS; /* All samples priv successfully */
}

sox_effect_handler_t const *ffsox_sox_pull_handler(void)
{
  static sox_effect_handler_t handler;

  if (NULL==handler.name) {
    handler.name="ffsox_sox_pull";
    handler.usage=NULL;
    handler.flags=SOX_EFF_MCHAN;
    handler.getopts=getopts;
    handler.start=NULL;
    handler.flow=flow;
    handler.drain=NULL;
    handler.stop=NULL;
    handler.kill=NULL;
    handler.priv_size=sizeof (priv_t);
  }

  return &handler;
}