summaryrefslogtreecommitdiff
path: root/apps/codecs/libcook/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libcook/main.c')
-rw-r--r--apps/codecs/libcook/main.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/apps/codecs/libcook/main.c b/apps/codecs/libcook/main.c
index 3c671e0c3f..c13e74a201 100644
--- a/apps/codecs/libcook/main.c
+++ b/apps/codecs/libcook/main.c
@@ -37,6 +37,86 @@
37# endif 37# endif
38#endif 38#endif
39 39
40static unsigned char wav_header[44]={
41 'R','I','F','F',// 0 - ChunkID
42 0,0,0,0, // 4 - ChunkSize (filesize-8)
43 'W','A','V','E',// 8 - Format
44 'f','m','t',' ',// 12 - SubChunkID
45 16,0,0,0, // 16 - SubChunk1ID // 16 for PCM
46 1,0, // 20 - AudioFormat (1=Uncompressed)
47 2,0, // 22 - NumChannels
48 0,0,0,0, // 24 - SampleRate in Hz
49 0,0,0,0, // 28 - Byte Rate (SampleRate*NumChannels*(BitsPerSample/8)
50 4,0, // 32 - BlockAlign (== NumChannels * BitsPerSample/8)
51 16,0, // 34 - BitsPerSample
52 'd','a','t','a',// 36 - Subchunk2ID
53 0,0,0,0 // 40 - Subchunk2Size
54};
55
56int open_wav(char* filename) {
57 int fd,res;
58
59 fd=open(filename,O_CREAT|O_WRONLY|O_TRUNC,S_IRUSR|S_IWUSR);
60 if (fd >= 0) {
61 res = write(fd,wav_header,sizeof(wav_header));
62 }
63
64 return(fd);
65}
66
67void close_wav(int fd, RMContext *rmctx) {
68 int x,res;
69 int filesize;
70 int bytes_per_sample = 2;
71 int samples_per_frame = rmctx->samples_pf_pc;
72 int nb_channels = rmctx->nb_channels;
73 int sample_rate = rmctx->sample_rate;
74 int nb_frames = rmctx->audio_framesize/rmctx->block_align * rmctx->nb_packets - 2; // first 2 frames have no valid audio; skipped in output
75
76 filesize= samples_per_frame*bytes_per_sample*nb_frames +44;
77 printf("Filesize = %d\n",filesize);
78
79 // ChunkSize
80 x=filesize-8;
81 wav_header[4]=(x&0xff);
82 wav_header[5]=(x&0xff00)>>8;
83 wav_header[6]=(x&0xff0000)>>16;
84 wav_header[7]=(x&0xff000000)>>24;
85
86 // Number of channels
87 wav_header[22]=nb_channels;
88
89 // Samplerate
90 wav_header[24]=sample_rate&0xff;
91 wav_header[25]=(sample_rate&0xff00)>>8;
92 wav_header[26]=(sample_rate&0xff0000)>>16;
93 wav_header[27]=(sample_rate&0xff000000)>>24;
94
95 // ByteRate
96 x=sample_rate*bytes_per_sample*nb_channels;
97 wav_header[28]=(x&0xff);
98 wav_header[29]=(x&0xff00)>>8;
99 wav_header[30]=(x&0xff0000)>>16;
100 wav_header[31]=(x&0xff000000)>>24;
101
102 // BlockAlign
103 wav_header[32]=rmctx->block_align;//2*rmctx->nb_channels;
104
105 // Bits per sample
106 wav_header[34]=16;
107
108 // Subchunk2Size
109 x=filesize-44;
110 wav_header[40]=(x&0xff);
111 wav_header[41]=(x&0xff00)>>8;
112 wav_header[42]=(x&0xff0000)>>16;
113 wav_header[43]=(x&0xff000000)>>24;
114
115 lseek(fd,0,SEEK_SET);
116 res = write(fd,wav_header,sizeof(wav_header));
117 close(fd);
118}
119
40int main(int argc, char *argv[]) 120int main(int argc, char *argv[])
41{ 121{
42 int fd, fd_dec; 122 int fd, fd_dec;