portaudio.cpp revision 33ecfa2cc6e6e09cfc17e4b10249fb1e0b30fb7d
1/*
2 * Copyright (C) 2009 Wind River Systems
3 *      Author: Ho-Eun Ryu <ho-eun.ryu@windriver.com>
4 */
5
6#include <stdlib.h>
7#include <string.h>
8
9#include <OMX_Core.h>
10#include <OMX_Component.h>
11
12#include <componentbase.h>
13#include <portaudio.h>
14
15#define LOG_TAG "portaudio"
16#include <log.h>
17
18PortAudio::PortAudio()
19{
20    memset(&audioparam, 0, sizeof(audioparam));
21    ComponentBase::SetTypeHeader(&audioparam, sizeof(audioparam));
22}
23
24OMX_ERRORTYPE PortAudio::SetPortAudioParam(
25    const OMX_AUDIO_PARAM_PORTFORMATTYPE *p, bool overwrite_readonly)
26{
27    if (!overwrite_readonly) {
28        OMX_ERRORTYPE ret;
29
30        ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p));
31        if (ret != OMX_ErrorNone)
32            return ret;
33        if (audioparam.nPortIndex != p->nPortIndex)
34            return OMX_ErrorBadPortIndex;
35    }
36    else
37        audioparam.nPortIndex = p->nPortIndex;
38
39    audioparam.nIndex = p->nIndex;
40    audioparam.eEncoding = p->eEncoding;
41
42    return OMX_ErrorNone;
43}
44
45const OMX_AUDIO_PARAM_PORTFORMATTYPE *PortAudio::GetPortAudioParam(void)
46{
47    return &audioparam;
48}
49
50/* end of PortAudio */
51
52PortMp3::PortMp3()
53{
54    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
55
56    memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
57    audioparam.eEncoding = OMX_AUDIO_CodingMP3;
58    SetPortAudioParam(&audioparam, false);
59
60    memset(&mp3param, 0, sizeof(mp3param));
61    ComponentBase::SetTypeHeader(&mp3param, sizeof(mp3param));
62}
63
64OMX_ERRORTYPE PortMp3::SetPortMp3Param(const OMX_AUDIO_PARAM_MP3TYPE *p,
65                                       bool overwrite_readonly)
66{
67    if (!overwrite_readonly) {
68        OMX_ERRORTYPE ret;
69
70        ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p));
71        if (ret != OMX_ErrorNone)
72            return ret;
73        if (mp3param.nPortIndex != p->nPortIndex)
74            return OMX_ErrorBadPortIndex;
75    }
76    else {
77        OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
78
79        memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
80        audioparam.nPortIndex = p->nPortIndex;
81        SetPortAudioParam(&audioparam, true);
82
83        mp3param.nPortIndex = p->nPortIndex;
84    }
85
86    mp3param.nChannels = p->nChannels;
87    mp3param.nBitRate = p->nBitRate;
88    mp3param.nSampleRate = p->nSampleRate;
89    mp3param.nAudioBandWidth = p->nAudioBandWidth;
90    mp3param.eChannelMode = p->eChannelMode;
91    mp3param.eFormat = p->eFormat;
92
93    return OMX_ErrorNone;
94}
95
96const OMX_AUDIO_PARAM_MP3TYPE *PortMp3::GetPortMp3Param(void)
97{
98    return &mp3param;
99}
100
101/* end of PortMp3 */
102
103PortAac::PortAac()
104{
105    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
106
107    memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
108    audioparam.eEncoding = OMX_AUDIO_CodingAAC;
109    SetPortAudioParam(&audioparam, false);
110
111    memset(&aacparam, 0, sizeof(aacparam));
112    ComponentBase::SetTypeHeader(&aacparam, sizeof(aacparam));
113}
114
115OMX_ERRORTYPE PortAac::SetPortAacParam(const OMX_AUDIO_PARAM_AACPROFILETYPE *p,
116                                       bool overwrite_readonly)
117{
118    if (!overwrite_readonly) {
119        OMX_ERRORTYPE ret;
120
121        ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p));
122        if (ret != OMX_ErrorNone)
123            return ret;
124        if (aacparam.nPortIndex != p->nPortIndex)
125            return OMX_ErrorBadPortIndex;
126    }
127    else {
128        OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
129
130        memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
131        audioparam.nPortIndex = p->nPortIndex;
132        SetPortAudioParam(&audioparam, true);
133
134        aacparam.nPortIndex = p->nPortIndex;
135    }
136
137    aacparam.nChannels = p->nChannels;
138    aacparam.nBitRate = p->nBitRate;
139    aacparam.nSampleRate = p->nSampleRate;
140    aacparam.nAudioBandWidth = p->nAudioBandWidth;
141    aacparam.nFrameLength = p->nFrameLength;
142    aacparam.nAACtools = p->nAACtools;
143    aacparam.nAACERtools = p->nAACERtools;
144    aacparam.eAACProfile = p->eAACProfile;
145    aacparam.eAACStreamFormat = p->eAACStreamFormat;
146    aacparam.eChannelMode = p->eChannelMode;
147
148    return OMX_ErrorNone;
149}
150
151const OMX_AUDIO_PARAM_AACPROFILETYPE *PortAac::GetPortAacParam(void)
152{
153    return &aacparam;
154}
155
156/* end of PortAac */
157
158PortWma::PortWma()
159{
160    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
161
162    memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
163    audioparam.eEncoding = OMX_AUDIO_CodingWMA;
164    SetPortAudioParam(&audioparam, false);
165
166    memset(&wmaparam, 0, sizeof(wmaparam));
167    ComponentBase::SetTypeHeader(&wmaparam, sizeof(wmaparam));
168}
169
170OMX_ERRORTYPE PortWma::SetPortWmaParam(const OMX_AUDIO_PARAM_WMATYPE *p,
171                                       bool overwrite_readonly)
172{
173    if (!overwrite_readonly) {
174        OMX_ERRORTYPE ret;
175
176        ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p));
177        if (ret != OMX_ErrorNone)
178            return ret;
179        if (wmaparam.nPortIndex != p->nPortIndex)
180            return OMX_ErrorBadPortIndex;
181    }
182    else {
183        OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
184
185        memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
186        audioparam.nPortIndex = p->nPortIndex;
187        SetPortAudioParam(&audioparam, true);
188
189        wmaparam.nPortIndex = p->nPortIndex;
190    }
191
192    wmaparam.nChannels = p->nChannels;
193    wmaparam.nBitRate = p->nBitRate;
194    wmaparam.eFormat = p->eFormat;
195    wmaparam.eProfile = p->eProfile;
196    wmaparam.nSamplingRate = p->nSamplingRate;
197    wmaparam.nBlockAlign = p->nBlockAlign;
198    wmaparam.nEncodeOptions = p->nEncodeOptions;
199    wmaparam.nSuperBlockAlign = p->nSuperBlockAlign;
200
201    return OMX_ErrorNone;
202}
203
204const OMX_AUDIO_PARAM_WMATYPE *PortWma::GetPortWmaParam(void)
205{
206    return &wmaparam;
207}
208
209/* end of PortWma */
210
211PortPcm::PortPcm()
212{
213    OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
214
215    memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
216    audioparam.eEncoding = OMX_AUDIO_CodingPCM;
217    SetPortAudioParam(&audioparam, false);
218
219    memset(&pcmparam, 0, sizeof(pcmparam));
220    ComponentBase::SetTypeHeader(&pcmparam, sizeof(pcmparam));
221}
222
223OMX_ERRORTYPE PortPcm::SetPortPcmParam(const OMX_AUDIO_PARAM_PCMMODETYPE *p,
224                                       bool overwrite_readonly)
225{
226    if (!overwrite_readonly) {
227        OMX_ERRORTYPE ret;
228
229        ret = ComponentBase::CheckTypeHeader((void *)p, sizeof(*p));
230        if (ret != OMX_ErrorNone)
231            return ret;
232        if (pcmparam.nPortIndex != p->nPortIndex)
233            return OMX_ErrorBadPortIndex;
234    }
235    else {
236        OMX_AUDIO_PARAM_PORTFORMATTYPE audioparam;
237
238        memcpy(&audioparam, GetPortAudioParam(), sizeof(audioparam));
239        audioparam.nPortIndex = p->nPortIndex;
240        SetPortAudioParam(&audioparam, true);
241
242        pcmparam.nPortIndex = p->nPortIndex;
243    }
244
245    pcmparam.nChannels = p->nChannels;
246    pcmparam.eNumData = p->eNumData;
247    pcmparam.eEndian = p->eEndian;
248    pcmparam.bInterleaved = p->bInterleaved;
249    pcmparam.nBitPerSample = p->nBitPerSample;
250    pcmparam.nSamplingRate = p->nSamplingRate;
251    pcmparam.ePCMMode = p->ePCMMode;
252    memcpy(&pcmparam.eChannelMapping[0], &p->eChannelMapping[0],
253           sizeof(OMX_U32) * p->nChannels);
254
255    return OMX_ErrorNone;
256}
257
258const OMX_AUDIO_PARAM_PCMMODETYPE *PortPcm::GetPortPcmParam(void)
259{
260    return &pcmparam;
261}
262
263/* end of PortPcm */
264