4223322d244874d0ea65b1c67c8c0b7ba7be3e78
[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         fread((char *) header, 1, 44, handle); // TODO: What about res?
85         return(handle);
86 }
87
88 int16_t get_wav_format(wav_sig *info){
89         int16_t tmp; 
90         int8_t *p; 
91
92         read16(20);
93 }
94
95         /* mono or stereo */
96 int8_t get_wav_channels(wav_sig *info){
97         return(info->head[22]);
98 //      read16(22);
99 }
100
101         /* sample rate */
102 int32_t get_wav_srate(wav_sig *info){
103         int32_t tmp; 
104         int8_t *p; 
105         
106         read32(24);
107 }
108
109 int32_t get_wav_bps(wav_sig *info){
110         int32_t tmp; 
111         int8_t *p; 
112
113         read32(28);
114 }
115
116 int8_t get_wav_blkalign(wav_sig *info){
117         return(info->head[32]);
118 //      read16(32);
119 }
120
121         /* sample depth (8bit or 16bit) */
122 int8_t get_wav_depth(wav_sig *info){
123         return(info->head[34]);
124 //      read16(34);
125 }
126
127         /* data section only  ==  totalfile - 44 */
128 int32_t get_wav_len(wav_sig *info){
129         int32_t tmp; 
130         int8_t *p; 
131
132         read32(40);
133 }
134
135
136 FILE *init_wav_read(char file_name[], wav_sig *info){
137         int mode=0;
138         
139         info->handle = open_wav(info->head, file_name, &mode);
140         strcpy(info->name,file_name);
141         info->chans = get_wav_channels(info);
142         info->srate = get_wav_srate(info);
143         info->bps   = get_wav_bps(info);
144         info->blkalign = get_wav_blkalign(info);
145         info->depth = get_wav_depth(info);
146         info->len   = get_wav_len(info);
147         return(info->handle);   
148 }
149
150 void wav_close(FILE* wav)
151 {
152         if (wav)
153         {
154                 fclose(wav);
155         }
156 }