3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.tizenopensource.org/license
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 #include "WavWriter.h"
21 #define RIFF_HEADER_POS 0
22 #define DATA_HEADER_POS (sizeof(RIFFFILEHEADER) + sizeof(RIFFCHUNKHEADER) + sizeof(WavFormatInfo))
24 static const unsigned int RIFF_CHUNK_ID = 0x46464952; // 'RIFF'
25 static const unsigned int RIFF_FORMAT_WAVE = 0x45564157; // 'WAVE'
26 static const unsigned int WAVE_FORMAT_CHUNK_ID = 0x20746d66; // 'fmt '
27 static const unsigned int WAVE_DATA_CHUNK_ID = 0x61746164; // 'data'
29 WavWriter::WavWriter()
31 // TODO Auto-generated constructor stub
35 WavWriter::~WavWriter()
39 __riffHdr.size = 4 + sizeof(__fmtHdr) + sizeof(__wavFmt) + sizeof(__dataHdr) + __totalSize;
40 __dataHdr.size = __totalSize;
42 r = __file.Seek(FILESEEKPOSITION_BEGIN, RIFF_HEADER_POS);
43 TryCatch(r == E_SUCCESS, , "file.Seek failed:%s", GetErrorMessage(r));
44 r = __file.Write(&__riffHdr, sizeof(__riffHdr));
45 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
47 r = __file.Seek(FILESEEKPOSITION_BEGIN, DATA_HEADER_POS);
48 TryCatch(r == E_SUCCESS, , "file.Seek failed:%s", GetErrorMessage(r));
49 r = __file.Write(&__dataHdr, sizeof(__dataHdr));
50 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
57 WavWriter::Construct(const Osp::Base::String& filename, AudioChannelType chan, AudioSampleType sampleType, int sampleRate)
63 __riffHdr.chunkId = RIFF_CHUNK_ID;
64 __riffHdr.size = 4 + sizeof(__fmtHdr) + sizeof(__wavFmt) + sizeof(__dataHdr) + __totalSize;
65 __riffHdr.format = RIFF_FORMAT_WAVE;
67 __fmtHdr.chunkId = WAVE_FORMAT_CHUNK_ID;
68 __fmtHdr.size = sizeof(WavFormatInfo);
70 __wavFmt.nChannels = (chan == AUDIO_CHANNEL_TYPE_MONO) ? 1 : 2;
71 __wavFmt.wFormatTag = 1;
72 __wavFmt.nSamplesPerSec = sampleRate;
73 __wavFmt.wBitsPerSample = (sampleType == AUDIO_TYPE_PCM_U8) ? 8 : 16;
74 __wavFmt.nAvgBytesPerSec = sampleRate * __wavFmt.nChannels * (__wavFmt.wBitsPerSample / 8);
75 __wavFmt.nBlockAlign = __wavFmt.nChannels * __wavFmt.wBitsPerSample / 8;
77 __dataHdr.chunkId = WAVE_DATA_CHUNK_ID;
78 __dataHdr.size = __totalSize;
81 r = __file.Construct(filename, "wb");
82 TryCatch(r == E_SUCCESS, , "file.Construct failed");
83 r = __file.Write(&__riffHdr, sizeof(__riffHdr));
84 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
85 r = __file.Write(&__fmtHdr, sizeof(__fmtHdr));
86 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
87 r = __file.Write(&__wavFmt, sizeof(__wavFmt));
88 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
89 r = __file.Write(&__dataHdr, sizeof(__dataHdr));
90 TryCatch(r == E_SUCCESS, r = GetLastResult(), "file.Write failed:%s", GetErrorMessage(GetLastResult()));
97 WavWriter::Write(const char* buffer, int size)
99 result r = __file.Write(buffer, size);
101 TryCatch(r == E_SUCCESS, , "file.Write failed:%s", GetErrorMessage(r));
109 WavWriter::Write(const Osp::Base::ByteBuffer& buf)
111 result r = E_SUCCESS;
112 r = __file.Write(buf);
113 TryCatch(r == E_SUCCESS, , "file.Write failed:%s", GetErrorMessage(r));
114 __totalSize += (buf.GetLimit() - buf.GetPosition());