Support 24bit sample format and up-to 192kHz sample rate
[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
46 CPulseStreamSpec::CPulseStreamSpec():
47     __mLatency(EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT),
48     __mStreamName(NULL) {
49     __adjustSpec();
50 }
51
52 CPulseStreamSpec::CPulseStreamSpec(EStreamLatency latency, CAudioInfo& audioInfo) :
53     __mLatency(latency),
54     __mAudioInfo(audioInfo),
55     __mStreamName(NULL) {
56     __adjustSpec();
57 }
58
59 CPulseStreamSpec::CPulseStreamSpec(EStreamLatency latency, CAudioInfo& audioInfo, int customLatency) :
60     __mLatency(latency),
61     __mAudioInfo(audioInfo),
62     __mStreamName(NULL) {
63     __adjustSpec();
64 }
65
66 CPulseStreamSpec::~CPulseStreamSpec() {
67 }
68
69 void CPulseStreamSpec::__adjustSpec() {
70     // Sets a sampleRate
71     __mSampleSpec.rate = __mAudioInfo.getSampleRate();
72
73     // Convert channels for PA
74     switch (__mAudioInfo.getChannel()) {
75     case CAudioInfo::EChannel::CHANNEL_MONO:
76         __mSampleSpec.channels = 1;
77         break;
78
79     case CAudioInfo::EChannel::CHANNEL_STEREO:
80     default:
81         __mSampleSpec.channels = 2;
82         break;
83     }
84
85     // Convert format for PA
86     switch (__mAudioInfo.getSampleType()) {
87     case CAudioInfo::ESampleType::SAMPLE_TYPE_U8:
88         __mSampleSpec.format = PA_SAMPLE_U8;
89         break;
90
91     case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
92         __mSampleSpec.format = PA_SAMPLE_S16LE;
93         break;
94
95     case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE:
96         __mSampleSpec.format = PA_SAMPLE_S24LE;
97         break;
98
99     case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE:
100         __mSampleSpec.format = PA_SAMPLE_S24_32LE;
101         break;
102
103     default:
104         __mSampleSpec.format = PA_SAMPLE_S16LE;
105         break;
106     }
107
108     // Sets channelmap
109     pa_channel_map_init_auto(&__mChannelMap, __mSampleSpec.channels, PA_CHANNEL_MAP_ALSA);
110
111     // Sets stream name
112     switch (__mLatency) {
113     case EStreamLatency::STREAM_LATENCY_INPUT_LOW:
114         __mStreamName = STREAM_NAME_INPUT_LOW_LATENCY;
115         break;
116
117     case EStreamLatency::STREAM_LATENCY_INPUT_MID:
118         __mStreamName = STREAM_NAME_INPUT_MID_LATENCY;
119         break;
120
121     case EStreamLatency::STREAM_LATENCY_INPUT_HIGH:
122         __mStreamName = STREAM_NAME_INPUT_HIGH_LATENCY;
123         break;
124
125     case EStreamLatency::STREAM_LATENCY_INPUT_VOIP:
126         __mStreamName = STREAM_NAME_INPUT_VOIP;
127         break;
128
129     case EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT:
130         __mStreamName = STREAM_NAME_INPUT_DEFAULT;
131         break;
132
133     case EStreamLatency::STREAM_LATENCY_OUTPUT_LOW:
134         __mStreamName = STREAM_NAME_OUTPUT_LOW_LATENCY;
135         break;
136
137     case EStreamLatency::STREAM_LATENCY_OUTPUT_MID:
138         __mStreamName = STREAM_NAME_OUTPUT_MID_LATENCY;
139         break;
140
141     case EStreamLatency::STREAM_LATENCY_OUTPUT_HIGH:
142         __mStreamName = STREAM_NAME_OUTPUT_HIGH_LATENCY;
143         break;
144
145     case EStreamLatency::STREAM_LATENCY_OUTPUT_VOIP:
146         __mStreamName = STREAM_NAME_OUTPUT_VOIP;
147         break;
148
149     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT:
150         __mStreamName = STREAM_NAME_OUTPUT_DEFAULT;
151         break;
152
153     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT_ASYNC:
154         __mStreamName = STREAM_NAME_OUTPUT_DEFAULT_ASYNC;
155         break;
156
157     default:
158         AUDIO_IO_LOGW("Invalid __mLatency[%d]", static_cast<int>(__mLatency));
159         break;
160     }
161 }
162
163 CPulseStreamSpec::EStreamLatency CPulseStreamSpec::getStreamLatency() {
164     return __mLatency;
165 }
166
167 const char* CPulseStreamSpec::getStreamLatencyToString() {
168     const char* latency;
169
170     switch (__mLatency) {
171     case EStreamLatency::STREAM_LATENCY_INPUT_LOW:
172     case EStreamLatency::STREAM_LATENCY_OUTPUT_LOW:
173         latency = STREAM_LATENCY_LOW;
174         break;
175
176     case EStreamLatency::STREAM_LATENCY_INPUT_MID:
177     case EStreamLatency::STREAM_LATENCY_OUTPUT_MID:
178         latency = STREAM_LATENCY_MID;
179         break;
180
181     case EStreamLatency::STREAM_LATENCY_INPUT_HIGH:
182     case EStreamLatency::STREAM_LATENCY_OUTPUT_HIGH:
183         latency = STREAM_LATENCY_HIGH;
184         break;
185
186     case EStreamLatency::STREAM_LATENCY_INPUT_VOIP:
187     case EStreamLatency::STREAM_LATENCY_OUTPUT_VOIP:
188         latency = STREAM_LATENCY_VOIP;
189         break;
190
191     case EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT:
192     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT:
193         latency = STREAM_LATENCY_DEFAULT;
194         break;
195
196     case EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT_ASYNC:
197         latency = STREAM_LATENCY_DEFAULT_ASYNC;
198         break;
199
200     default:
201         AUDIO_IO_LOGW("Invalid __mLatency[%d]", static_cast<int>(__mLatency));
202         latency = STREAM_LATENCY_DEFAULT;
203         break;
204     }
205
206     return latency;
207 }
208
209 CAudioInfo& CPulseStreamSpec::getAudioInfo() {
210     return __mAudioInfo;
211 }
212
213 pa_sample_spec CPulseStreamSpec::getSampleSpec() {
214     return __mSampleSpec;
215 }
216
217 pa_channel_map CPulseStreamSpec::getChannelMap() {
218     return __mChannelMap;
219 }
220
221 const char* CPulseStreamSpec::getStreamName() {
222     return __mStreamName;
223 }