102c54dae93e034c1b0cef965b314875ef8d9243
[terminatorX.git] / src / wav_write.c
1 /*
2     wav_write.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, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     
19     Changes:
20     
21     11 Mar 1999: -added license hint
22                  -added return statement in rewrite_head
23                  
24     20 Mar 1999: -using sys/types.h for type sizes for interplatform
25                  compatibility
26
27     22 Mar 1999: removed some wav-tools bugs (handling 8-Bit
28                  values as 16Bit integers) 
29                  
30     29 Apr 1999: hacked to use FILE* instead of file descriptors
31 */
32
33 #include <stdio.h>
34 #include <fcntl.h>
35 #include <signal.h>
36
37 #ifndef WIN32
38 #include <sys/soundcard.h>
39 #include <unistd.h>
40 #endif
41
42 #include "wav_file.h"
43
44 #include "tX_endian.h"
45
46 void init_head(wav_sig *info){
47         int16_t tmp16;
48         int32_t tmp32;
49         
50         strcpy(info->head, "RIFF    WAVEfmt                     data    ");
51         
52         tmp32=(info->sofar + 32);       
53 #ifdef BIG_ENDIAN_MACHINE       
54         swap32(&tmp32);
55 #endif
56         *(int32_t  *)&info->head[4]  = tmp32;
57         
58         
59         tmp32=16;
60 #ifdef BIG_ENDIAN_MACHINE       
61         swap32(&tmp32);
62 #endif
63         *(int32_t *)&info->head[16] = tmp32;
64         
65 /*      tmp16=1;
66 #ifdef BIG_ENDIAN_MACHINE       
67         swap16(&tmp16);
68 #endif
69         *(int16_t *)&info->head[20] = tmp16;
70 */
71         info->head[20] = 1;
72         info->head[21] = 0;
73         
74         info->head[22] = info->chans;
75         info->head[23] = 0;     
76         
77         tmp32=info->srate;
78 #ifdef BIG_ENDIAN_MACHINE       
79         swap32(&tmp32);
80 #endif
81         *(int32_t  *)&info->head[24] = tmp32;
82         
83         tmp32=info->bps;
84 #ifdef BIG_ENDIAN_MACHINE       
85         swap32(&tmp32);
86 #endif
87         *(int32_t  *)&info->head[28] = tmp32;
88         
89         info->head[32] = info->blkalign;
90         info->head[33] = 0;
91                 
92         info->head[34] = info->depth;
93         info->head[35] = 0;
94         
95         tmp32=info->sofar;
96 #ifdef BIG_ENDIAN_MACHINE       
97         swap32(&tmp32);
98 #endif
99         *(int32_t  *)&info->head[40] = tmp32;
100 }
101
102 FILE* open_wav_rec(wav_sig *info){
103         info->handle = fopen(info->name, "w");
104         if (!info->handle) return NULL;
105         init_head(info);
106         fwrite(info->head, 44, 1, info->handle);
107         return(info->handle);
108 }
109
110 int rewrite_head(wav_sig *info){
111         rewind(info->handle);
112         init_head(info);
113         fwrite(info->head, 44, 1, info->handle);
114
115         return(0);
116 }