Tizen 2.1 base
[sdk/ide/native-sample.git] / samples / native / cpp / Sample / Tizen C++ / MediaApp / MediaApp / project / src / WavWriter.cpp
1 //
2 // Tizen C++ SDK
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.tizenopensource.org/license
10 //
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.
16 //
17
18
19 #include "WavWriter.h"
20
21 #define RIFF_HEADER_POS     0
22 #define DATA_HEADER_POS     (sizeof(RIFFFILEHEADER) + sizeof(RIFFCHUNKHEADER) + sizeof(WavFormatInfo))
23
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'
28
29 WavWriter::WavWriter()
30 {
31         // TODO Auto-generated constructor stub
32
33 }
34
35 WavWriter::~WavWriter()
36 {
37         result r = E_SUCCESS;
38
39         __riffHdr.size = 4 + sizeof(__fmtHdr) + sizeof(__wavFmt) + sizeof(__dataHdr) + __totalSize;
40         __dataHdr.size = __totalSize;
41
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()));
46
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()));
51
52 CATCH:
53         return;
54 }
55
56 result
57 WavWriter::Construct(const Osp::Base::String& filename, AudioChannelType chan, AudioSampleType sampleType, int sampleRate)
58 {
59         result r = E_SUCCESS;
60
61         __totalSize = 0;
62
63         __riffHdr.chunkId = RIFF_CHUNK_ID;
64         __riffHdr.size = 4 + sizeof(__fmtHdr) + sizeof(__wavFmt) + sizeof(__dataHdr) + __totalSize;
65         __riffHdr.format = RIFF_FORMAT_WAVE;
66
67         __fmtHdr.chunkId = WAVE_FORMAT_CHUNK_ID;
68         __fmtHdr.size = sizeof(WavFormatInfo);
69
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;
76
77         __dataHdr.chunkId = WAVE_DATA_CHUNK_ID;
78         __dataHdr.size = __totalSize;
79
80
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()));
91
92 CATCH:
93         return r;
94 }
95
96 result
97 WavWriter::Write(const char* buffer, int size)
98 {
99         result r = __file.Write(buffer, size);
100
101         TryCatch(r == E_SUCCESS, , "file.Write failed:%s", GetErrorMessage(r));
102         __totalSize += size;
103
104 CATCH:
105         return r;
106 }
107
108 result
109 WavWriter::Write(const Osp::Base::ByteBuffer& buf)
110 {
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());
115
116 CATCH:
117         return r;
118 }