2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __TIZEN_MEDIA_AUDIO_IO_CPULSEAUDIO_CLIENT_H__
18 #define __TIZEN_MEDIA_AUDIO_IO_CPULSEAUDIO_CLIENT_H__
24 #include <pulse/pulseaudio.h>
27 namespace tizen_media_audio {
29 * PULSE ThreadMainloop Locker
31 class CPulseStreamSpec;
33 class CPulseAudioClient {
35 enum class EStreamDirection : unsigned int {
36 STREAM_DIRECTION_RECORD, /**< Record stream */
37 STREAM_DIRECTION_PLAYBACK /**< Playback stream */
41 static const char* CLIENT_NAME;
43 /* Constructor & Destructor */
44 CPulseAudioClient(EStreamDirection direction,
45 CPulseStreamSpec& spec,
46 IPulseStreamListener* listener);
49 /* Implemented Methods */
54 int read(void* buffer, size_t length);
55 int peek(const void** buffer, size_t* length);
57 int write(const void* buffer, size_t length);
65 void checkRunningState();
66 bool isInThread() const;
68 size_t getWritableSize();
69 size_t getReadableSize();
71 size_t getBufferSize();
73 pa_usec_t getLatency();
74 pa_usec_t getFinalLatency();
76 void applyRecordVolume(double volume);
80 EStreamDirection __mDirection;
81 CPulseStreamSpec __mSpec;
82 IPulseStreamListener* __mpListener;
84 pa_threaded_mainloop* __mpMainloop;
85 pa_context* __mpContext;
86 pa_stream* __mpStream;
87 pa_proplist* __mpPropList;
90 bool __mIsOperationSuccess;
92 const void* __mpSyncReadDataPtr;
93 size_t __mSyncReadIndex;
94 size_t __mSyncReadLength;
95 bool __mIsUsedSyncRead;
96 bool __mIsFirstStream;
103 void resetStreamCallbacks();
104 void resetInternalObjects();
106 /* Private Callback Method */
107 static void __contextStateChangeCb(pa_context* c, void* user_data);
108 static void __streamStateChangeCb(pa_stream* s, void* user_data);
109 static void __streamCaptureCb(pa_stream* s, size_t length, void* user_data);
110 static void __streamPlaybackCb(pa_stream* s, size_t length, void* user_data);
111 static void __streamLatencyUpdateCb(pa_stream* s, void* user_data);
112 static void __streamStartedCb(pa_stream* s, void* user_data);
113 static void __streamUnderflowCb(pa_stream* s, void* user_data);
114 static void __streamOverflowCb(pa_stream* s, void* user_data);
115 static void __streamEventCb(pa_stream* s, const char *name, pa_proplist *pl, void *user_data);
116 static void __successStreamCb(pa_stream* s, int success, void* user_data);
117 static void __successDrainCb(pa_stream* s, int success, void* user_data);
118 static void __successDrainCbInThread(pa_stream* s, int success, void* user_data);
119 static void __successVolumeCb(pa_context* c, int success, void* user_data);
121 class CPulseThreadLocker {
123 explicit CPulseThreadLocker(pa_threaded_mainloop* mainloop);
124 virtual ~CPulseThreadLocker();
127 const pa_threaded_mainloop* ml{};
132 } /* namespace tizen_media_audio */
135 #endif /* __TIZEN_MEDIA_AUDIO_IO_CPULSEAUDIO_CLIENT_H__ */