source: roaraudio/libroardsp/transcode_mualaw.c @ 5889:d866fb1213d6

Last change on this file since 5889:d866fb1213d6 was 5823:f9f70dbaa376, checked in by phi, 11 years ago

updated copyright

File size: 3.2 KB
Line 
1//transcode_mualaw.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2009-2013
5 *
6 *  This file is part of libroardsp a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroardsp is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 */
25
26#include "libroardsp.h"
27
28#define _CHECK() if ( state == NULL || state->info.pcm.bits != 16 || buf == NULL ) return -1
29
30#define _CHECK_BUF(len) \
31                        void * iobuf; \
32                        size_t outbyte = (len)/2; \
33                        _CHECK();     \
34                        if ( (len) & 0x01 ) return -1; \
35                        if ( provide_buffer(&iobuf, outbyte) == -1 ) \
36                         return -1;
37
38#define _SEND_RETURN()  if ( roar_vio_write(state->backend, iobuf, outbyte) != (ssize_t)outbyte ) \
39                         return -1; \
40                        return 0;
41
42#define _READ()         if ( roar_vio_read(state->backend, iobuf, outbyte) != (ssize_t)outbyte ) \
43                         return -1;
44
45static int provide_buffer(void ** buf, size_t len) {
46 static struct roar_buffer * bufbuf = NULL;
47 size_t buflen;
48
49 ROAR_DBG("provide_buffer(*) = ?");
50
51 if ( bufbuf != NULL ) {
52  if ( roar_buffer_get_len(bufbuf, &buflen) == -1 )
53   return -1;
54
55  if ( buflen >= len ) {
56   if ( roar_buffer_get_data(bufbuf, buf) == -1 )
57    return -1;
58
59   ROAR_DBG("provide_buffer(*) = 0");
60   return 0;
61  } else {
62   if ( roar_buffer_free(bufbuf) == -1 )
63    return -1;
64
65   bufbuf = NULL;
66  }
67 }
68
69 if ( roar_buffer_new_data(&bufbuf, len, buf) == -1 )
70  return -1;
71
72 ROAR_DBG("provide_buffer(*) = 0");
73 return 0;
74}
75
76int roar_xcoder_alaw_encode(struct roar_xcoder * state, void * buf, size_t len) {
77 _CHECK_BUF(len);
78
79 ROAR_DBG("roar_xcoder_alaw_encode(*) = ?");
80
81 if ( roardsp_conv_pcm162alaw(iobuf, buf, outbyte) == -1 )
82  return -1;
83
84 ROAR_DBG("roar_xcoder_alaw_encode(*) = ?");
85
86 _SEND_RETURN();
87}
88
89int roar_xcoder_alaw_decode(struct roar_xcoder * state, void * buf, size_t len) {
90 _CHECK_BUF(len);
91
92 _READ();
93
94 ROAR_DBG("roar_xcoder_alaw_decode(*): Start decoding..");
95
96 if ( roardsp_conv_alaw2pcm16(buf, iobuf, outbyte) == -1 )
97  return -1;
98
99 ROAR_DBG("roar_xcoder_alaw_decode(*): Decoding sucessful");
100 return 0;
101}
102
103int roar_xcoder_mulaw_encode(struct roar_xcoder * state, void * buf, size_t len) {
104 _CHECK_BUF(len);
105
106 if ( roardsp_conv_pcm162mulaw(iobuf, buf, outbyte) == -1 )
107  return -1;
108
109 _SEND_RETURN();
110}
111
112int roar_xcoder_mulaw_decode(struct roar_xcoder * state, void * buf, size_t len) {
113 _CHECK_BUF(len);
114
115 _READ();
116
117 if ( roardsp_conv_mulaw2pcm16(buf, iobuf, outbyte) == -1 )
118  return -1;
119
120 return 0;
121}
122
123//ll
Note: See TracBrowser for help on using the repository browser.