123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- #pragma once
- #include "../iaudiomgrinterface.h"
- #include <pthread.h>
- #include <stdint.h>
- #include <assert.h>
- #include <pulse/pulseaudio.h>
- #include <pulse/sample.h>
- #include <stdio.h>
- #include <errno.h>
- #include "audiodevicepulse.h"
- #ifndef NSEC_PER_SEC
- #define NSEC_PER_SEC 1000000000LL
- #endif
- /*Audio stream flag*/
- #define AUDIO_STRM_ON (1)
- #define AUDIO_STRM_OFF (0)
- /*Audio Buffer flags*/
- #define AUDIO_BUFF_FREE (0)
- #define AUDIO_BUFF_USED (1)
- #define __THREAD_TYPE pthread_t
- #define __THREAD_CREATE(t,f,d) (pthread_create(t,NULL,f,d))
- #define __THREAD_CREATE_ATTRIB(t,a,f,d) (pthread_create(t,a,f,d))
- #define __THREAD_JOIN(t) (pthread_join(t, NULL))
- #define __ATTRIB_TYPE pthread_attr_t
- #define __INIT_ATTRIB(t) (pthread_attr_init(t))
- #define __ATTRIB_JOINABLE(t) (pthread_attr_setdetachstate(t, PTHREAD_CREATE_JOINABLE))
- #define __CLOSE_ATTRIB(t) (pthread_attr_destroy(t))
- #define __MUTEX_TYPE pthread_mutex_t
- #define __STATIC_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
- #define __INIT_MUTEX(m) ( pthread_mutex_init(m, NULL) )
- #define __CLOSE_MUTEX(m) ( pthread_mutex_destroy(m) )
- #define __LOCK_MUTEX(m) ( pthread_mutex_lock(m) )
- #define __UNLOCK_MUTEX(m) ( pthread_mutex_unlock(m) )
- #define __COND_TYPE pthread_cond_t
- #define __INIT_COND(c) ( pthread_cond_init (c, NULL) )
- #define __CLOSE_COND(c) ( pthread_cond_destroy(c) )
- #define __COND_BCAST(c) ( pthread_cond_broadcast(c) )
- #define __COND_SIGNAL(c) ( pthread_cond_signal(c) )
- #define __COND_TIMED_WAIT(c,m,t) ( pthread_cond_timedwait(c,m,t) )
- /*next index of ring buffer with size elements*/
- #define NEXT_IND(ind,size) ind++;if(ind>=size) ind=0
- /*internally is always float*/
- typedef int16_t sample_t;
- typedef struct rvc_audio_context_s
- {
- int num_input_dev; /*number of audio input devices in list*/
- rvc_audio_device_t* list_input_devices; /*audio input devices list*/
- int num_output_dev;
- rvc_audio_device_t* list_output_devices; /*audio output devices list*/
- int device; /*current device list index*/
- int channels; /*channels*/
- int samprate; /*sample rate*/
- double latency; /*current sugested latency*/
- pa_sample_format_t eformat;
- /*all ts are monotonic based: both real and generated*/
- int64_t current_ts; /*current buffer generated timestamp*/
- int64_t last_ts; /*last real timestamp (in nanosec)*/
- int64_t snd_begintime; /*sound capture start ref time*/
- int64_t ts_drift; /*drift between real and generated ts*/
- sample_t* capture_buff; /*pointer to capture data*/
- int capture_buff_size; /*capture buffer size (bytes)*/
- float capture_buff_level[2]; /*capture buffer channels level*/
- volatile int stream_flag; /*stream flag*/
- audiocap_param_t audio_param;
- }rvc_audio_context_t;
- typedef struct rvc_audio_volume_s{
- int volume_flag;
- char strdevicename[MAX_PATH];
- pa_cvolume cvolumes;
- }rvc_audio_volume_t;
- typedef struct rvc_volume_set_s {
- int volume_flag;
- char strdevicename[MAX_PATH];
- int ivolume;
- }rvc_volume_set_t;
- class AudioMgrImpl : public IAudioMgr
- {
- public:
- AudioMgrImpl(audiomgr_callback_t* pCallback);
- ~AudioMgrImpl();
- int audio_mgr_initialize();
- int audio_mgr_terminate();
- int audio_get_device_count(bool binput);
- int audio_get_device_name(char* pstrbuf, size_t ulen, bool binput, int index);
- int audio_get_device_id(const char* pstrname, bool binput);
- rvc_audio_device_t* audio_get_device_infos(bool binput, int index);
- int audio_get_device_volume(int* ivolume, const char* pstrname, bool binput);
- int audiopulse_get_device_volume(int* ivolume, const char* pstrname, bool binput);
- int audio_set_device_volume(int ivolume, const char* pstrname, bool binput);
- int audiopulse_set_device_volume(int ivolume, const char* pstrname, bool binput);
- int set_audio_capture_params(audiocap_param_t* param);
- int start_audio_capture();
- int stop_audio_capture();
- int audio_mgr_destroy();
- rvc_audio_context_t* audio_get_context();
- audiomgr_callback_t* audio_get_callback();
- void audiolog(const char* fmt, ...);
- private:
- int audio_init_pulseaudio();
- int pa_get_devicelist();
- int audio_close_pulseaudio();
- rvc_audio_device_t* audio_get_input_device(int index);
- rvc_audio_device_t* audio_get_output_device(int index);
- int audio_set_pulseaudio_device(int index);
- int audio_set_pulsecap_params(audiocap_param_t* param);
- void audio_set_latency(double latency);
- private:
- rvc_audio_context_t* m_audio_context;
- audiomgr_callback_t m_callback;
- __THREAD_TYPE m_readthread;
- };
|