WaveWriter.h revision 20111aa043c5f404472bc63b90bc5aad906b1101
1049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project/*
2049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
3049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *
4049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * you may not use this file except in compliance with the License.
6049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * You may obtain a copy of the License at
79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *
8049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project *
10049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * See the License for the specific language governing permissions and
14049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project * limitations under the License.
15049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project */
16049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
17049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#ifndef ANDROID_WAVEWRITER_H_
18049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
19049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project#define ANDROID_WAVEWRITER_H_
20049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
21049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectnamespace android {
22049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
23aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerclass WaveWriter {
24049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Projectpublic:
25049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project    WaveWriter(const char *filename,
26049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project               uint16_t num_channels, uint32_t sampling_rate)
27049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        : mFile(fopen(filename, "wb")),
28049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project          mTotalBytes(0) {
29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        fwrite("RIFFxxxxWAVEfmt \x10\x00\x00\x00\x01\x00", 1, 22, mFile);
30049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project        write_u16(num_channels);
31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u32(sampling_rate);
32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u32(sampling_rate * num_channels * 2);
33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u16(num_channels * 2);
34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u16(16);
35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        fwrite("dataxxxx", 1, 8, mFile);
36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    }
37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    ~WaveWriter() {
39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        fseek(mFile, 40, SEEK_SET);
40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u32(mTotalBytes);
41049d6fea481044fcc000e7782e5bc7046fc70844The Android Open Source Project
42aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        fseek(mFile, 4, SEEK_SET);
43aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        write_u32(36 + mTotalBytes);
44aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
45aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        fclose(mFile);
46aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        mFile = NULL;
47aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
48aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    void Append(const void *data, size_t size) {
50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        fwrite(data, 1, size, mFile);
51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        mTotalBytes += size;
52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    }
53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease
54aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turnerprivate:
55aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    void write_u16(uint16_t x) {
56aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        fputc(x & 0xff, mFile);
57aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner        fputc(x >> 8, mFile);
58aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    }
59aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    void write_u32(uint32_t x) {
61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u16(x & 0xffff);
62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease        write_u16(x >> 16);
63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease    }
64aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
65aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    FILE *mFile;
66aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner    size_t mTotalBytes;
67aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner};
68aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
69aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner}  // namespace android
70aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner
71aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner#endif  // ANDROID_WAVEWRITER_H_
72aeb407daf3711a10a27f3bc2223c5eb05158076eDavid 'Digit' Turner