[ACR-1434] Extend channel and format parameters
[platform/core/api/audio-io.git] / src / cpp / CPulseStreamSpec.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17
18 #include "CAudioIODef.h"
19
20
21 using namespace std;
22 using namespace tizen_media_audio;
23
24
25 static const char* STREAM_NAME_INPUT_LOW_LATENCY   = "LOW LATENCY CAPTURE";
26 static const char* STREAM_NAME_INPUT_MID_LATENCY   = "MID LATENCY CAPTURE";
27 static const char* STREAM_NAME_INPUT_HIGH_LATENCY  = "HIGH LATENCY CAPTURE";
28 static const char* STREAM_NAME_INPUT_VOIP          = "VOIP CAPTURE";
29 static const char* STREAM_NAME_INPUT_DEFAULT       = "DEFAULT CAPTURE";
30
31 static const char* STREAM_NAME_OUTPUT_LOW_LATENCY  = "LOW LATENCY PLAYBACK";
32 static const char* STREAM_NAME_OUTPUT_MID_LATENCY  = "MID LATENCY PLAYBACK";
33 static const char* STREAM_NAME_OUTPUT_HIGH_LATENCY = "HIGH LATENCY PLAYBACK";
34 static const char* STREAM_NAME_OUTPUT_VOIP         = "VOIP PLAYBACK";
35 static const char* STREAM_NAME_OUTPUT_DEFAULT      = "DEFAULT PLAYBACK";
36 static const char* STREAM_NAME_OUTPUT_DEFAULT_ASYNC      = "DEFAULT PLAYBACK ASYNC";
37
38 static const char* STREAM_LATENCY_LOW     = "low";
39 static const char* STREAM_LATENCY_MID     = "mid";
40 static const char* STREAM_LATENCY_HIGH    = "high";
41 static const char* STREAM_LATENCY_VOIP    = "voip";
42 static const char* STREAM_LATENCY_DEFAULT = "default";
43 static const char* STREAM_LATENCY_DEFAULT_ASYNC = "default-async";
44
45 //LCOV_EXCL_START
46 CPulseStreamSpec::CPulseStreamSpec():
47     __mLatency(EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT),
48     __mStreamName(NULL) {
49     __adjustSpec();
50 }
51 //LCOV_EXCL_STOP
52
53 CPulseStreamSpec::CPulseStreamSpec(EStreamLatency latency, CAudioInfo& audioInfo) :
54     __mLatency(latency),
55     __mAudioInfo(audioInfo),
56     __mStreamName(NULL) {
57     __adjustSpec();
58 }
59
60 //LCOV_EXCL_START
61 CPulseStreamSpec::CPulseStreamSpec(EStreamLatency latency, CAudioInfo& audioInfo, int customLatency) :
62     __mLatency(latency),
63     __mAudioInfo(audioInfo),
64     __mStreamName(NULL) {
65     __adjustSpec();
66 }
67 //LCOV_EXCL_STOP
68
69 CPulseStreamSpec::~CPulseStreamSpec() {
70 }
71
72 void CPulseStreamSpec::__adjustSpec() {
73     // Sets a sampleRate
74     __mSampleSpec.rate = __mAudioInfo.getSampleRate();
75
76     // Convert channels for PA
77     __mSampleSpec.channels = static_cast<uint8_t>(__mAudioInfo.getChannel());
78
79     // Convert format for PA
80     switch (__mAudioInfo.getSampleType()) {
81     case CAudioInfo::ESampleType::SAMPLE_TYPE_U8:
82         __mSampleSpec.format = PA_SAMPLE_U8;
83         break;
84
85     case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
86         __mSampleSpec.format = PA_SAMPLE_S16LE;
87         break;
88
89     case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE:
90         __mSampleSpec.format = PA_SAMPLE_S24LE;
91         break;
92
93     case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE:
94         __mSampleSpec.format = PA_SAMPLE_S24_32LE;
95         break;
96
97     case CAudioInfo::ESampleType::SAMPLE_TYPE_S32_LE:
98         __mSampleSpec.format = PA_SAMPLE_S32LE;
99         break;
100
101     default:
102         __mSampleSpec.format = PA_SAMPLE_S16LE;
103         break;
104     }
105
106     // Sets channelmap
107     pa_channel_map_init_extend(&__mChannelMap, __mSampleSpec.channels, PA_CHANNEL_MAP_ALSA);
108
109     // Sets stream name
110     switch (__mLatency) {
111 //LCOV_EXCL_START
112     case EStreamLatency::STREAM_LATENCY_INPUT_LOW:
113         __mStreamName = STREAM_NAME_INPUT_LOW_LATENCY;
114         break;
115
116     case EStreamLatency::STREAM_LATENCY_INPUT_MID:
117         __mStreamName = STREAM_NAME_INPUT_MID_LATENCY;
118         break;
119
120     case EStreamLatency::STREAM_LATENCY_INPUT_HIGH:
121         __mStreamName = STREAM_NAME_INPUT_HIGH_LATENCY;
122         break;
123
124     case EStreamLatency::STREAM_LATENCY_INPUT_VOIP:
125         __mStreamName = STREAM_NAME_INPUT_VOIP;
126         break;
127 //LCOV_EXCL_STOP
128
129     case EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT:
130         __mStreamName = STREAM_NAME_INPUT_DEFAULT;
131         break;
132
133 //LCOV_EXCL_START
134     case EStreamLatency::STREAM_LATENCY_OUTPUT_LOW:
135         __mStreamName = STREAM_NAME_OUTPUT_LOW_LATENCY;
136         break;
137
138     case EStreamLatency::STREAM_LATENCY_OUTPUT_MID:
139         __mStreamName = STREAM_NAME_OUTPUT_MID_LATENCY;
140         break;
141
142     case EStreamLatency::STREAM_LATENCY_OUTPUT_HIGH:
143         __mStreamName = STREAM_NAME_OUTPUT_HIGH_LATENCY;
144         break;
145
146     case EStreamLatency::STREAM_LATENCY_OUTPUT_VOIP:
147         __mStreamName = STREAM_NAME_OUTPUT_VOIP;
148         break;
149 //LCOV_EXCL_STOP
150
151     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT:
152         __mStreamName = STREAM_NAME_OUTPUT_DEFAULT;
153         break;
154
155     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT_ASYNC:
156         __mStreamName = STREAM_NAME_OUTPUT_DEFAULT_ASYNC;
157         break;
158
159 //LCOV_EXCL_START
160     default:
161         AUDIO_IO_LOGW("Invalid __mLatency[%d]", static_cast<int>(__mLatency));
162         break;
163     }
164 //LCOV_EXCL_STOP
165 }
166
167 CPulseStreamSpec::EStreamLatency CPulseStreamSpec::getStreamLatency() {
168     return __mLatency;
169 }
170
171 const char* CPulseStreamSpec::getStreamLatencyToString() {
172     const char* latency;
173
174     switch (__mLatency) {
175 //LCOV_EXCL_START
176     case EStreamLatency::STREAM_LATENCY_INPUT_LOW:
177     case EStreamLatency::STREAM_LATENCY_OUTPUT_LOW:
178         latency = STREAM_LATENCY_LOW;
179         break;
180
181     case EStreamLatency::STREAM_LATENCY_INPUT_MID:
182     case EStreamLatency::STREAM_LATENCY_OUTPUT_MID:
183         latency = STREAM_LATENCY_MID;
184         break;
185
186     case EStreamLatency::STREAM_LATENCY_INPUT_HIGH:
187     case EStreamLatency::STREAM_LATENCY_OUTPUT_HIGH:
188         latency = STREAM_LATENCY_HIGH;
189         break;
190
191     case EStreamLatency::STREAM_LATENCY_INPUT_VOIP:
192     case EStreamLatency::STREAM_LATENCY_OUTPUT_VOIP:
193         latency = STREAM_LATENCY_VOIP;
194         break;
195 //LCOV_EXCL_STOP
196
197     case EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT:
198     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT:
199         latency = STREAM_LATENCY_DEFAULT;
200         break;
201
202     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT_ASYNC:
203         latency = STREAM_LATENCY_DEFAULT_ASYNC;
204         break;
205
206 //LCOV_EXCL_START
207     default:
208         AUDIO_IO_LOGW("Invalid __mLatency[%d]", static_cast<int>(__mLatency));
209         latency = STREAM_LATENCY_DEFAULT;
210         break;
211 //LCOV_EXCL_STOP
212     }
213
214     return latency;
215 }
216
217 CAudioInfo& CPulseStreamSpec::getAudioInfo() {
218     return __mAudioInfo;
219 }
220
221 pa_sample_spec CPulseStreamSpec::getSampleSpec() {
222     return __mSampleSpec;
223 }
224
225 pa_channel_map CPulseStreamSpec::getChannelMap() {
226     return __mChannelMap;
227 }
228
229 const char* CPulseStreamSpec::getStreamName() {
230     return __mStreamName;
231 }