1/* $NetBSD: auvolconv.c,v 1.3 2016/02/26 13:08:28 nat Exp $ */
2
3/*-
4 * Copyright (c) 2007 Jared D. McNeill <jmcneill@invisible.ca>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__KERNEL_RCSID(0, "$NetBSD: auvolconv.c,v 1.3 2016/02/26 13:08:28 nat Exp $");
31
32#include <sys/types.h>
33#include <sys/param.h>
34#include <sys/select.h>
35#include <sys/condvar.h>
36#include <sys/kmem.h>
37#include <sys/device.h>
38#include <sys/endian.h>
39
40#include <dev/audiovar.h>
41#include <dev/auconv.h>
42#include <dev/auvolconv.h>
43
44int
45auvolconv_slinear16_le_fetch_to(struct audio_softc *asc,
46 stream_fetcher_t *self, audio_stream_t *dst, int max_used)
47{
48 auvolconv_filter_t *pf;
49 stream_filter_t *this;
50 int16_t j, *wp;
51 int m, err;
52 u_int vol;
53
54 pf = (auvolconv_filter_t *)self;
55 this = &pf->base;
56 max_used = (max_used + 1) & ~1;
57 vol = *pf->vol;
58
59 if ((err = this->prev->fetch_to(asc, this->prev, this->src, max_used)))
60 return err;
61 m = (dst->end - dst->start) & ~1;
62 m = min(m, max_used);
63 FILTER_LOOP_PROLOGUE(this->src, 2, dst, 2, m) {
64 j = le16dec(s);
65 wp = (int16_t *)d;
66 le16enc(wp, (int32_t)(j * vol) / 255);
67 } FILTER_LOOP_EPILOGUE(this->src, dst);
68
69 return 0;
70}
71
72int
73auvolconv_slinear16_be_fetch_to(struct audio_softc *asc,
74 stream_fetcher_t *self, audio_stream_t *dst, int max_used)
75{
76 auvolconv_filter_t *pf;
77 stream_filter_t *this;
78 int16_t j, *wp;
79 int m, err;
80 u_int vol;
81
82 pf = (auvolconv_filter_t *)self;
83 this = &pf->base;
84 max_used = (max_used + 1) & ~1;
85 vol = *pf->vol;
86
87 if ((err = this->prev->fetch_to(asc, this->prev, this->src, max_used)))
88 return err;
89 m = (dst->end - dst->start) & ~1;
90 m = min(m, max_used);
91 FILTER_LOOP_PROLOGUE(this->src, 2, dst, 2, m) {
92 j = be16dec(s);
93 wp = (int16_t *)d;
94 be16enc(wp, (int32_t)(j * vol) / 255);
95 } FILTER_LOOP_EPILOGUE(this->src, dst);
96
97 return 0;
98}
99