Initialize Tizen 2.3
[external/opencore-amr.git] / test / wavwriter.c
1 /* ------------------------------------------------------------------
2  * Copyright (C) 2009 Martin Storsjo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18
19 #include "wavwriter.h"
20 #include <stdio.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <stdint.h>
24
25 struct wav_writer {
26         FILE *wav;
27         int data_length;
28
29         int sample_rate;
30         int bits_per_sample;
31         int channels;
32 };
33
34 static void write_string(struct wav_writer* ww, const char *str) {
35         fputc(str[0], ww->wav);
36         fputc(str[1], ww->wav);
37         fputc(str[2], ww->wav);
38         fputc(str[3], ww->wav);
39 }
40
41 static void write_int32(struct wav_writer* ww, int value) {
42         fputc((value >>  0) & 0xff, ww->wav);
43         fputc((value >>  8) & 0xff, ww->wav);
44         fputc((value >> 16) & 0xff, ww->wav);
45         fputc((value >> 24) & 0xff, ww->wav);
46 }
47
48 static void write_int16(struct wav_writer* ww, int value) {
49         fputc((value >> 0) & 0xff, ww->wav);
50         fputc((value >> 8) & 0xff, ww->wav);
51 }
52
53 static void write_header(struct wav_writer* ww, int length) {
54         int bytes_per_frame, bytes_per_sec;
55         write_string(ww, "RIFF");
56         write_int32(ww, 4 + 8 + 16 + 8 + length);
57         write_string(ww, "WAVE");
58
59         write_string(ww, "fmt ");
60         write_int32(ww, 16);
61
62         bytes_per_frame = ww->bits_per_sample/8*ww->channels;
63         bytes_per_sec   = bytes_per_frame*ww->sample_rate;
64         write_int16(ww, 1);                   // Format
65         write_int16(ww, ww->channels);        // Channels
66         write_int32(ww, ww->sample_rate);     // Samplerate
67         write_int32(ww, bytes_per_sec);       // Bytes per sec
68         write_int16(ww, bytes_per_frame);     // Bytes per frame
69         write_int16(ww, ww->bits_per_sample); // Bits per sample
70
71         write_string(ww, "data");
72         write_int32(ww, length);
73 }
74
75 void* wav_write_open(const char *filename, int sample_rate, int bits_per_sample, int channels) {
76         struct wav_writer* ww = (struct wav_writer*) malloc(sizeof(*ww));
77         memset(ww, 0, sizeof(*ww));
78         ww->wav = fopen(filename, "wb");
79         if (ww->wav == NULL) {
80                 free(ww);
81                 return NULL;
82         }
83         ww->data_length = 0;
84         ww->sample_rate = sample_rate;
85         ww->bits_per_sample = bits_per_sample;
86         ww->channels = channels;
87
88         write_header(ww, ww->data_length);
89         return ww;
90 }
91
92 void wav_write_close(void* obj) {
93         struct wav_writer* ww = (struct wav_writer*) obj;
94         if (ww->wav == NULL) {
95                 free(ww);
96                 return;
97         }
98         fseek(ww->wav, 0, SEEK_SET);
99         write_header(ww, ww->data_length);
100         fclose(ww->wav);
101         free(ww);
102 }
103
104 void wav_write_data(void* obj, const unsigned char* data, int length) {
105         struct wav_writer* ww = (struct wav_writer*) obj;
106         if (ww->wav == NULL)
107                 return;
108         fwrite(data, length, 1, ww->wav);
109         ww->data_length += length;
110 }
111