Update yelp call to match current yelp revisions.
[terminatorX.git] / src / wav_read.c
1 /*
2     wav_read.c - taken from wav-tools 1.1
3     Copyright (C) by Colin Ligertwood
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 /* operations for verifying and reading wav files. */
20
21 #include <stdio.h>
22 #include <fcntl.h>
23 #include <sys/stat.h>
24 #include "wav_file.h"
25 #ifndef WIN32
26 #include <unistd.h>
27 #endif
28 #include <string.h>
29 #include "tX_endian.h"
30 #include "tX_types.h"
31
32 /* Read little endian 16bit values little endian
33 */
34 #ifdef BIG_ENDIAN_MACHINE
35
36 #define read16(x); \
37         p = (int8_t *) &tmp; \
38         p[0] = info->head[x]; \
39         p[1] = info->head[x+1]; \
40         swap16(&tmp); \
41         return(tmp);
42
43 #else
44
45 #define read16(x); \
46         p = (int8_t *) &tmp; \
47         p[0] = info->head[x]; \
48         p[1] = info->head[x+1]; \
49         return(tmp);
50
51 #endif  
52         
53
54 /* Read little endian 32bit values little endian
55 */
56 #ifdef BIG_ENDIAN_MACHINE
57
58 #define read32(x); \
59         p = (int8_t *) &tmp; \
60         p[0] = info->head[x]; \
61         p[1] = info->head[x+1]; \
62         p[2] = info->head[x+2]; \
63         p[3] = info->head[x+3]; \
64         swap32(&tmp); \
65         return (tmp);
66
67 #else
68
69 #define read32(x); \
70         p = (int8_t *) &tmp; \
71         p[0] = info->head[x]; \
72         p[1] = info->head[x+1]; \
73         p[2] = info->head[x+2]; \
74         p[3] = info->head[x+3]; \
75         return (tmp);
76
77 #endif
78
79         /* wav header is 44 bytes long */
80 FILE* open_wav(char *header, char file_name[], int *mode){
81         FILE* handle;
82         handle = fopen(file_name, "r");
83         if(handle)
84         if (fread((char *) header, 1, 44, handle) != 44) {
85                 fclose(handle);
86                 handle = NULL;
87         }
88         return handle;
89 }
90
91 int16_t get_wav_format(wav_sig *info){
92         int16_t tmp; 
93         int8_t *p; 
94
95         read16(20);
96 }
97
98         /* mono or stereo */
99 int8_t get_wav_channels(wav_sig *info){
100         return(info->head[22]);
101 //      read16(22);
102 }
103
104         /* sample rate */
105 int32_t get_wav_srate(wav_sig *info){
106         int32_t tmp; 
107         int8_t *p; 
108         
109         read32(24);
110 }
111
112 int32_t get_wav_bps(wav_sig *info){
113         int32_t tmp; 
114         int8_t *p; 
115
116         read32(28);
117 }
118
119 int8_t get_wav_blkalign(wav_sig *info){
120         return(info->head[32]);
121 //      read16(32);
122 }
123
124         /* sample depth (8bit or 16bit) */
125 int8_t get_wav_depth(wav_sig *info){
126         return(info->head[34]);
127 //      read16(34);
128 }
129
130         /* data section only  ==  totalfile - 44 */
131 int32_t get_wav_len(wav_sig *info){
132         int32_t tmp; 
133         int8_t *p; 
134
135         read32(40);
136 }
137
138
139 FILE *init_wav_read(char file_name[], wav_sig *info){
140         int mode=0;
141         
142         info->handle = open_wav(info->head, file_name, &mode);
143         strcpy(info->name,file_name);
144         info->chans = get_wav_channels(info);
145         info->srate = get_wav_srate(info);
146         info->bps   = get_wav_bps(info);
147         info->blkalign = get_wav_blkalign(info);
148         info->depth = get_wav_depth(info);
149         info->len   = get_wav_len(info);
150         return(info->handle);   
151 }
152
153 void wav_close(FILE* wav)
154 {
155         if (wav)
156         {
157                 fclose(wav);
158         }
159 }