Home | History | Annotate | Line # | Download | only in audio
alaw.c revision 1.4
      1  1.4  skrll /*	$NetBSD: alaw.c,v 1.4 2021/07/21 06:35:44 skrll Exp $	*/
      2  1.2  isaki 
      3  1.2  isaki /*
      4  1.2  isaki  * Copyright (C) 2018 Tetsuya Isaki. All rights reserved.
      5  1.2  isaki  *
      6  1.2  isaki  * Redistribution and use in source and binary forms, with or without
      7  1.2  isaki  * modification, are permitted provided that the following conditions
      8  1.2  isaki  * are met:
      9  1.2  isaki  * 1. Redistributions of source code must retain the above copyright
     10  1.2  isaki  *    notice, this list of conditions and the following disclaimer.
     11  1.2  isaki  * 2. Redistributions in binary form must reproduce the above copyright
     12  1.2  isaki  *    notice, this list of conditions and the following disclaimer in the
     13  1.2  isaki  *    documentation and/or other materials provided with the distribution.
     14  1.2  isaki  *
     15  1.2  isaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  1.2  isaki  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     17  1.2  isaki  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     18  1.2  isaki  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     19  1.2  isaki  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     20  1.2  isaki  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     21  1.2  isaki  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     22  1.2  isaki  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     23  1.2  isaki  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24  1.2  isaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25  1.2  isaki  * SUCH DAMAGE.
     26  1.2  isaki  */
     27  1.2  isaki 
     28  1.2  isaki #include <sys/cdefs.h>
     29  1.4  skrll __KERNEL_RCSID(0, "$NetBSD: alaw.c,v 1.4 2021/07/21 06:35:44 skrll Exp $");
     30  1.2  isaki 
     31  1.4  skrll #include <sys/param.h>
     32  1.2  isaki #include <sys/types.h>
     33  1.2  isaki #include <sys/systm.h>
     34  1.2  isaki #include <sys/device.h>
     35  1.2  isaki #include <dev/audio/audiovar.h>
     36  1.2  isaki #include <dev/audio/mulaw.h>
     37  1.2  isaki 
     38  1.2  isaki static const uint16_t alaw_to_slinear16[256] = {
     39  1.2  isaki 	0xea80, 0xeb80, 0xe880, 0xe980, 0xee80, 0xef80, 0xec80, 0xed80,
     40  1.2  isaki 	0xe280, 0xe380, 0xe080, 0xe180, 0xe680, 0xe780, 0xe480, 0xe580,
     41  1.2  isaki 	0xf540, 0xf5c0, 0xf440, 0xf4c0, 0xf740, 0xf7c0, 0xf640, 0xf6c0,
     42  1.2  isaki 	0xf140, 0xf1c0, 0xf040, 0xf0c0, 0xf340, 0xf3c0, 0xf240, 0xf2c0,
     43  1.2  isaki 	0xaa00, 0xae00, 0xa200, 0xa600, 0xba00, 0xbe00, 0xb200, 0xb600,
     44  1.2  isaki 	0x8a00, 0x8e00, 0x8200, 0x8600, 0x9a00, 0x9e00, 0x9200, 0x9600,
     45  1.2  isaki 	0xd500, 0xd700, 0xd100, 0xd300, 0xdd00, 0xdf00, 0xd900, 0xdb00,
     46  1.2  isaki 	0xc500, 0xc700, 0xc100, 0xc300, 0xcd00, 0xcf00, 0xc900, 0xcb00,
     47  1.2  isaki 	0xfea8, 0xfeb8, 0xfe88, 0xfe98, 0xfee8, 0xfef8, 0xfec8, 0xfed8,
     48  1.2  isaki 	0xfe28, 0xfe38, 0xfe08, 0xfe18, 0xfe68, 0xfe78, 0xfe48, 0xfe58,
     49  1.2  isaki 	0xffa8, 0xffb8, 0xff88, 0xff98, 0xffe8, 0xfff8, 0xffc8, 0xffd8,
     50  1.2  isaki 	0xff28, 0xff38, 0xff08, 0xff18, 0xff68, 0xff78, 0xff48, 0xff58,
     51  1.2  isaki 	0xfaa0, 0xfae0, 0xfa20, 0xfa60, 0xfba0, 0xfbe0, 0xfb20, 0xfb60,
     52  1.2  isaki 	0xf8a0, 0xf8e0, 0xf820, 0xf860, 0xf9a0, 0xf9e0, 0xf920, 0xf960,
     53  1.2  isaki 	0xfd50, 0xfd70, 0xfd10, 0xfd30, 0xfdd0, 0xfdf0, 0xfd90, 0xfdb0,
     54  1.2  isaki 	0xfc50, 0xfc70, 0xfc10, 0xfc30, 0xfcd0, 0xfcf0, 0xfc90, 0xfcb0,
     55  1.2  isaki 	0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280,
     56  1.2  isaki 	0x1d80, 0x1c80, 0x1f80, 0x1e80, 0x1980, 0x1880, 0x1b80, 0x1a80,
     57  1.2  isaki 	0x0ac0, 0x0a40, 0x0bc0, 0x0b40, 0x08c0, 0x0840, 0x09c0, 0x0940,
     58  1.2  isaki 	0x0ec0, 0x0e40, 0x0fc0, 0x0f40, 0x0cc0, 0x0c40, 0x0dc0, 0x0d40,
     59  1.2  isaki 	0x5600, 0x5200, 0x5e00, 0x5a00, 0x4600, 0x4200, 0x4e00, 0x4a00,
     60  1.2  isaki 	0x7600, 0x7200, 0x7e00, 0x7a00, 0x6600, 0x6200, 0x6e00, 0x6a00,
     61  1.2  isaki 	0x2b00, 0x2900, 0x2f00, 0x2d00, 0x2300, 0x2100, 0x2700, 0x2500,
     62  1.2  isaki 	0x3b00, 0x3900, 0x3f00, 0x3d00, 0x3300, 0x3100, 0x3700, 0x3500,
     63  1.2  isaki 	0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128,
     64  1.2  isaki 	0x01d8, 0x01c8, 0x01f8, 0x01e8, 0x0198, 0x0188, 0x01b8, 0x01a8,
     65  1.2  isaki 	0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028,
     66  1.2  isaki 	0x00d8, 0x00c8, 0x00f8, 0x00e8, 0x0098, 0x0088, 0x00b8, 0x00a8,
     67  1.2  isaki 	0x0560, 0x0520, 0x05e0, 0x05a0, 0x0460, 0x0420, 0x04e0, 0x04a0,
     68  1.2  isaki 	0x0760, 0x0720, 0x07e0, 0x07a0, 0x0660, 0x0620, 0x06e0, 0x06a0,
     69  1.2  isaki 	0x02b0, 0x0290, 0x02f0, 0x02d0, 0x0230, 0x0210, 0x0270, 0x0250,
     70  1.2  isaki 	0x03b0, 0x0390, 0x03f0, 0x03d0, 0x0330, 0x0310, 0x0370, 0x0350,
     71  1.2  isaki };
     72  1.2  isaki 
     73  1.2  isaki static const uint8_t slinear8_to_alaw[256] = {
     74  1.2  isaki 	0xd5, 0xc5, 0xf5, 0xfd, 0xe5, 0xe1, 0xed, 0xe9,
     75  1.2  isaki 	0x95, 0x97, 0x91, 0x93, 0x9d, 0x9f, 0x99, 0x9b,
     76  1.2  isaki 	0x85, 0x84, 0x87, 0x86, 0x81, 0x80, 0x83, 0x82,
     77  1.2  isaki 	0x8d, 0x8c, 0x8f, 0x8e, 0x89, 0x88, 0x8b, 0x8a,
     78  1.2  isaki 	0xb5, 0xb5, 0xb4, 0xb4, 0xb7, 0xb7, 0xb6, 0xb6,
     79  1.2  isaki 	0xb1, 0xb1, 0xb0, 0xb0, 0xb3, 0xb3, 0xb2, 0xb2,
     80  1.2  isaki 	0xbd, 0xbd, 0xbc, 0xbc, 0xbf, 0xbf, 0xbe, 0xbe,
     81  1.2  isaki 	0xb9, 0xb9, 0xb8, 0xb8, 0xbb, 0xbb, 0xba, 0xba,
     82  1.2  isaki 	0xa5, 0xa5, 0xa5, 0xa5, 0xa4, 0xa4, 0xa4, 0xa4,
     83  1.2  isaki 	0xa7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa6, 0xa6,
     84  1.2  isaki 	0xa1, 0xa1, 0xa1, 0xa1, 0xa0, 0xa0, 0xa0, 0xa0,
     85  1.2  isaki 	0xa3, 0xa3, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa2,
     86  1.2  isaki 	0xad, 0xad, 0xad, 0xad, 0xac, 0xac, 0xac, 0xac,
     87  1.2  isaki 	0xaf, 0xaf, 0xaf, 0xaf, 0xae, 0xae, 0xae, 0xae,
     88  1.2  isaki 	0xa9, 0xa9, 0xa9, 0xa9, 0xa8, 0xa8, 0xa8, 0xa8,
     89  1.2  isaki 	0xab, 0xab, 0xab, 0xab, 0xaa, 0xaa, 0xaa, 0xaa,
     90  1.2  isaki 	0x2a, 0x2a, 0x2a, 0x2a, 0x2b, 0x2b, 0x2b, 0x2b,
     91  1.2  isaki 	0x28, 0x28, 0x28, 0x28, 0x29, 0x29, 0x29, 0x29,
     92  1.2  isaki 	0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f,
     93  1.2  isaki 	0x2c, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d,
     94  1.2  isaki 	0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23,
     95  1.2  isaki 	0x20, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21,
     96  1.2  isaki 	0x26, 0x26, 0x26, 0x26, 0x27, 0x27, 0x27, 0x27,
     97  1.2  isaki 	0x24, 0x24, 0x24, 0x24, 0x25, 0x25, 0x25, 0x25,
     98  1.2  isaki 	0x3a, 0x3a, 0x3b, 0x3b, 0x38, 0x38, 0x39, 0x39,
     99  1.2  isaki 	0x3e, 0x3e, 0x3f, 0x3f, 0x3c, 0x3c, 0x3d, 0x3d,
    100  1.2  isaki 	0x32, 0x32, 0x33, 0x33, 0x30, 0x30, 0x31, 0x31,
    101  1.2  isaki 	0x36, 0x36, 0x37, 0x37, 0x34, 0x34, 0x35, 0x35,
    102  1.2  isaki 	0x0a, 0x0b, 0x08, 0x09, 0x0e, 0x0f, 0x0c, 0x0d,
    103  1.2  isaki 	0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
    104  1.2  isaki 	0x1a, 0x18, 0x1e, 0x1c, 0x12, 0x10, 0x16, 0x14,
    105  1.2  isaki 	0x6a, 0x6e, 0x62, 0x66, 0x7a, 0x72, 0x4a, 0x5a,
    106  1.2  isaki };
    107  1.2  isaki 
    108  1.2  isaki /*
    109  1.2  isaki  * audio_alaw_to_internal:
    110  1.2  isaki  *	This filter performs conversion from A-law to internal format.
    111  1.2  isaki  */
    112  1.2  isaki void
    113  1.2  isaki audio_alaw_to_internal(audio_filter_arg_t *arg)
    114  1.2  isaki {
    115  1.2  isaki 	const uint8_t *s;
    116  1.2  isaki 	aint_t *d;
    117  1.2  isaki 	u_int sample_count;
    118  1.2  isaki 	u_int i;
    119  1.2  isaki 
    120  1.2  isaki 	DIAGNOSTIC_filter_arg(arg);
    121  1.2  isaki 	KASSERT(arg->srcfmt->encoding == AUDIO_ENCODING_ALAW);
    122  1.2  isaki 	KASSERT(arg->srcfmt->stride == 8);
    123  1.2  isaki 	KASSERT(arg->srcfmt->precision == 8);
    124  1.2  isaki 	KASSERT(audio_format2_is_internal(arg->dstfmt));
    125  1.2  isaki 	KASSERT(arg->srcfmt->channels == arg->dstfmt->channels);
    126  1.2  isaki 
    127  1.2  isaki 	s = arg->src;
    128  1.2  isaki 	d = arg->dst;
    129  1.2  isaki 	sample_count = arg->count * arg->srcfmt->channels;
    130  1.2  isaki 
    131  1.2  isaki 	for (i = 0; i < sample_count; i++) {
    132  1.2  isaki 		aint_t val;
    133  1.2  isaki 		val = alaw_to_slinear16[*s++];
    134  1.2  isaki 		val <<= AUDIO_INTERNAL_BITS - 16;
    135  1.2  isaki 		*d++ = val;
    136  1.2  isaki 	}
    137  1.2  isaki }
    138  1.2  isaki 
    139  1.2  isaki /*
    140  1.2  isaki  * audio_internal_to_alaw:
    141  1.2  isaki  *	This filter performs conversion from internal format to A-law.
    142  1.2  isaki  */
    143  1.2  isaki void
    144  1.2  isaki audio_internal_to_alaw(audio_filter_arg_t *arg)
    145  1.2  isaki {
    146  1.2  isaki 	const aint_t *s;
    147  1.2  isaki 	uint8_t *d;
    148  1.2  isaki 	u_int sample_count;
    149  1.2  isaki 	u_int i;
    150  1.2  isaki 
    151  1.2  isaki 	DIAGNOSTIC_filter_arg(arg);
    152  1.2  isaki 	KASSERT(arg->dstfmt->encoding == AUDIO_ENCODING_ALAW);
    153  1.2  isaki 	KASSERT(arg->dstfmt->stride == 8);
    154  1.2  isaki 	KASSERT(arg->dstfmt->precision == 8);
    155  1.2  isaki 	KASSERT(audio_format2_is_internal(arg->srcfmt));
    156  1.2  isaki 	KASSERT(arg->srcfmt->channels == arg->dstfmt->channels);
    157  1.2  isaki 
    158  1.2  isaki 	s = arg->src;
    159  1.2  isaki 	d = arg->dst;
    160  1.2  isaki 	sample_count = arg->count * arg->srcfmt->channels;
    161  1.2  isaki 
    162  1.2  isaki 	for (i = 0; i < sample_count; i++) {
    163  1.2  isaki 		uint8_t val;
    164  1.2  isaki 		val = (*s++) >> (AUDIO_INTERNAL_BITS - 8);
    165  1.2  isaki 		*d++ = slinear8_to_alaw[val];
    166  1.2  isaki 	}
    167  1.2  isaki }
    168