b948a1af25e16796bc626d3ef81f80442bb8b8df
[terminatorX.git] / wav_write.cc
1 /*
2     wav_write.cc - 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
31 #include <stdio.h>
32 #include <fcntl.h>
33 #include <signal.h>
34 #include <sys/soundcard.h>
35 #include "wav_file.h"
36 #include <unistd.h>
37
38 #include "endian.h"
39
40 void init_head(wav_sig *info){
41         int16_t tmp16;
42         int32_t tmp32;
43         
44         strcpy(info->head, "RIFF    WAVEfmt                     data    ");
45         
46         tmp32=(info->sofar + 32);       
47 #ifdef BIG_ENDIAN_MACHINE       
48         swap32(&tmp32);
49 #endif
50         *(int32_t  *)&info->head[4]  = tmp32;
51         
52         
53         tmp32=16;
54 #ifdef BIG_ENDIAN_MACHINE       
55         swap32(&tmp32);
56 #endif
57         *(int32_t *)&info->head[16] = tmp32;
58         
59         tmp16=1;
60 #ifdef BIG_ENDIAN_MACHINE       
61         swap16(&tmp16);
62 #endif
63         *(int16_t *)&info->head[20] = tmp16;
64         
65         info->head[22] = info->chans;
66         info->head[23] = 0;     
67         
68         tmp32=info->srate;
69 #ifdef BIG_ENDIAN_MACHINE       
70         swap32(&tmp32);
71 #endif
72         *(int32_t  *)&info->head[24] = tmp32;
73         
74         tmp32=info->bps;
75 #ifdef BIG_ENDIAN_MACHINE       
76         swap32(&tmp32);
77 #endif
78         *(int32_t  *)&info->head[28] = tmp32;
79         
80         info->head[32] = info->blkalign;
81         info->head[33] = 0;
82                 
83         info->head[34] = info->depth;
84         info->head[35] = 0;
85         
86         tmp32=info->sofar;
87 #ifdef BIG_ENDIAN_MACHINE       
88         swap32(&tmp32);
89 #endif
90         *(int32_t  *)&info->head[40] = tmp32;
91 }
92
93 int open_wav_rec(wav_sig *info){
94         info->handle = open(info->name, O_CREAT | O_RDWR, 0644);
95         init_head(info);
96         write(info->handle, info->head, 44);
97         return(info->handle);
98 }
99
100 int rewrite_head(wav_sig *info){
101         lseek(info->handle, 0, SEEK_SET);
102         init_head(info);
103         write(info->handle, info->head, 44);
104         /* make -Wall shut_up */
105         return(0);
106 }