1/*************************************************************************/
2/* */
3/* Language Technologies Institute */
4/* Carnegie Mellon University */
5/* Copyright (c) 1999 */
6/* All Rights Reserved. */
7/* */
8/* Permission is hereby granted, free of charge, to use and distribute */
9/* this software and its documentation without restriction, including */
10/* without limitation the rights to use, copy, modify, merge, publish, */
11/* distribute, sublicense, and/or sell copies of this work, and to */
12/* permit persons to whom this work is furnished to do so, subject to */
13/* the following conditions: */
14/* 1. The code must retain the above copyright notice, this list of */
15/* conditions and the following disclaimer. */
16/* 2. Any modifications must be clearly marked as such. */
17/* 3. Original authors' names are not deleted. */
18/* 4. The authors' names are not used to endorse or promote products */
19/* derived from this software without specific prior written */
20/* permission. */
21/* */
22/* CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK */
23/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
24/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
25/* SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE */
26/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
27/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
28/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
29/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
30/* THIS SOFTWARE. */
31/* */
32/*************************************************************************/
33/* Author: Alan W Black (awb@cs.cmu.edu) */
34/* Date: August 2000 */
35/*************************************************************************/
36/* */
37/* Waveforms */
38/* */
39/*************************************************************************/
40#ifndef _CST_WAVE_H__
41#define _CST_WAVE_H__
42
43#include "cst_file.h"
44#include "cst_error.h"
45#include "cst_alloc.h"
46#include "cst_endian.h"
47#include "cst_file.h"
48#include "cst_val.h"
49
50typedef struct cst_wave_struct {
51 const char *type;
52 int sample_rate;
53 int num_samples;
54 int num_channels;
55 short *samples;
56} cst_wave;
57
58typedef struct cst_wave_header_struct {
59 const char *type;
60 int hsize;
61 int num_bytes;
62 int sample_rate;
63 int num_samples;
64 int num_channels;
65} cst_wave_header;
66
67cst_wave *new_wave();
68cst_wave *copy_wave(const cst_wave *w);
69void delete_wave(cst_wave *val);
70cst_wave *concat_wave(cst_wave *dest, const cst_wave *src);
71
72#define cst_wave_num_samples(w) (w?w->num_samples:0)
73#define cst_wave_num_channels(w) (w?w->num_channels:0)
74#define cst_wave_sample_rate(w) (w?w->sample_rate:0)
75#define cst_wave_samples(w) (w->samples)
76
77#define cst_wave_set_num_samples(w,s) w->num_samples=s
78#define cst_wave_set_num_channels(w,s) w->num_channels=s
79#define cst_wave_set_sample_rate(w,s) w->sample_rate=s
80
81int cst_wave_save(cst_wave *w, const char *filename, const char *type);
82int cst_wave_save_riff(cst_wave *w, const char *filename);
83int cst_wave_save_raw(cst_wave *w, const char *filename);
84int cst_wave_append_riff(cst_wave *w,const char *filename);
85
86int cst_wave_save_riff_fd(cst_wave *w, cst_file fd);
87int cst_wave_save_raw_fd(cst_wave *w, cst_file fd);
88
89int cst_wave_load(cst_wave *w, const char *filename, const char *type);
90int cst_wave_load_riff(cst_wave *w, const char *filename);
91int cst_wave_load_raw(cst_wave *w, const char *filename,
92 const char *bo, int sample_rate);
93
94int cst_wave_load_riff_header(cst_wave_header *header,cst_file fd);
95int cst_wave_load_riff_fd(cst_wave *w, cst_file fd);
96int cst_wave_load_raw_fd (cst_wave *w, cst_file fd,
97 const char *bo, int sample_rate);
98
99void cst_wave_resize(cst_wave *w,int samples, int num_channels);
100void cst_wave_resample(cst_wave *w, int sample_rate);
101void cst_wave_rescale(cst_wave *w, int factor);
102
103/* Resampling code */
104typedef struct cst_rateconv_struct {
105 int channels; /* what do you think? */
106 int up, down; /* up/down sampling ratio */
107
108 double gain; /* output gain */
109 int lag; /* lag time (in samples) */
110 int *sin, *sout, *coep; /* filter buffers, coefficients */
111
112 /* n.b. outsize is the minimum buffer size for
113 cst_rateconv_out() when streaming */
114 int insize, outsize; /* size of filter buffers */
115 int incount; /* amount of input data */
116 int len; /* size of filter */
117
118 /* internal foo coefficients */
119 double fsin, fgk, fgg;
120 /* internal counters */
121 int inbaseidx, inoffset, cycctr, outidx;
122} cst_rateconv;
123
124cst_rateconv * new_rateconv(int up, int down, int channels);
125void delete_rateconv(cst_rateconv *filt);
126int cst_rateconv_in(cst_rateconv *filt, const short *inptr, int max);
127int cst_rateconv_leadout(cst_rateconv *filt);
128int cst_rateconv_out(cst_rateconv *filt, short *outptr, int max);
129
130/* File format cruft. */
131
132#define RIFF_FORMAT_PCM 0x0001
133#define RIFF_FORMAT_ADPCM 0x0002
134#define RIFF_FORMAT_MULAW 0x0006
135#define RIFF_FORMAT_ALAW 0x0007
136
137/* Sun/Next header, short and sweet, note its always BIG_ENDIAN though */
138typedef struct {
139 unsigned int magic; /* magic number */
140 unsigned int hdr_size; /* size of this header */
141 int data_size; /* length of data (optional) */
142 unsigned int encoding; /* data encoding format */
143 unsigned int sample_rate; /* samples per second */
144 unsigned int channels; /* number of interleaved channels */
145} snd_header;
146
147#define CST_SND_MAGIC (unsigned int)0x2e736e64
148#define CST_SND_ULAW 1
149#define CST_SND_UCHAR 2
150#define CST_SND_SHORT 3
151
152/* Convertion functions */
153unsigned char cst_short_to_ulaw(short sample);
154short cst_ulaw_to_short(unsigned char ulawbyte);
155
156#define CST_G721_LEADIN 8
157unsigned char *cst_g721_decode(int *actual_size,int size,
158 const unsigned char *packed_residual);
159unsigned char *cst_g721_encode(int *packed_size,int actual_size,
160 const unsigned char *unpacked_residual);
161
162CST_VAL_USER_TYPE_DCLS(wave,cst_wave)
163
164#endif
165

source code of include/flite/cst_wave.h