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