667d3ae87ef23712244bdc0463b1358d3b9148ab
[platform/core/api/audio-io.git] / include / CAudioIO.h
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 #ifndef __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__
18 #define __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__
19
20 #include <sound_manager.h>
21
22 #ifdef __cplusplus
23
24
25 namespace tizen_media_audio {
26
27
28     /**
29      *  Abstract Class
30      *  You can't take this object directly.
31      */
32     class IPulseStreamListener;
33     class CAudioIO : public IPulseStreamListener {
34     public:
35         struct SStreamCallback {
36             void* mUserData;
37             void (*onStream)(size_t nbytes, void* user_data);
38
39             SStreamCallback() : mUserData(nullptr), onStream(nullptr) {
40                 /* Empty Body */
41             }
42
43             void set(void (*callback)(size_t, void*), void* userdata) {
44                 onStream = callback;
45                 mUserData = userdata;
46             }
47
48             void unset() {
49                 onStream = nullptr;
50                 mUserData = nullptr;
51             }
52         };
53
54         struct SStateChangedCallback {
55             void* mUserData;
56             void (*onStateChanged)(CAudioInfo::EAudioIOState state, CAudioInfo::EAudioIOState statePrev, bool byPolicy, void* user_data);
57
58             SStateChangedCallback() : mUserData(nullptr), onStateChanged(nullptr) {
59                 /* Empty Body */
60             }
61
62             void set(void (*callback)(CAudioInfo::EAudioIOState, CAudioInfo::EAudioIOState, bool, void*), void* userdata) {
63                 onStateChanged = callback;
64                 mUserData = userdata;
65             }
66
67             void unset() {
68                 onStateChanged = nullptr;
69                 mUserData = nullptr;
70             }
71         };
72
73         /* Constructor & Destructor */
74         CAudioIO();
75         explicit CAudioIO(CAudioInfo& audioInfo);
76         virtual ~CAudioIO() = default;
77
78         /* Implemented Handlers */
79         virtual void onStream(CPulseAudioClient* pClient, size_t length);
80         virtual void onStateChanged(CAudioInfo::EAudioIOState state, bool byPolicy);
81         virtual void onStateChanged(CAudioInfo::EAudioIOState state);
82
83         /* Methods */
84         virtual void initialize();
85         virtual void finalize();
86         virtual void prepare();
87         virtual void unprepare();
88         virtual void pause();
89         virtual void resume();
90         virtual void flush();
91         virtual int  getBufferSize() = 0;
92
93         CAudioInfo& getAudioInfo();
94
95         virtual void setStreamCallback(SStreamCallback callback);
96         SStreamCallback getStreamCallback();
97
98         virtual void setStateChangedCallback(SStateChangedCallback callback);
99         SStateChangedCallback getStateChangedCallback();
100
101         void setStreamInfo(sound_stream_info_h stream_info);
102
103         CAudioInfo::EAudioIOState getState() noexcept;
104
105     protected:
106         /* Protected Methods */
107         virtual void setInit(bool flag);
108         virtual bool isInit();
109         virtual bool IsReady();
110
111         void internalLock();
112         void internalUnlock();
113         void internalWait();
114         void internalSignal();
115
116         CPulseAudioClient*    mpPulseAudioClient;
117         CAudioInfo            mAudioInfo;
118
119         SStreamCallback       mStreamCallback;
120         SStateChangedCallback mStateChangedCallback;
121
122         CAudioInfo::EAudioDirection mDirection;
123         CAudioInfo::EAudioIOState mState;
124         CAudioInfo::EAudioIOState mStatePrev;
125         bool                  mByPolicy;
126
127     private:
128         pthread_mutex_t       __mMutex;
129         pthread_mutex_t       __mCondMutex;
130         pthread_cond_t        __mCond;
131         bool                  __mIsInit;
132     };
133
134
135 } /* namespace tizen_media_audio */
136
137 #endif
138 #endif /* __TIZEN_MEDIA_AUDIO_IO_CAUDIO_IO_H__ */