libaudiomgr_linux.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #pragma once
  2. #include "../iaudiomgrinterface.h"
  3. #include <pthread.h>
  4. #include <stdint.h>
  5. #include <assert.h>
  6. #include <pulse/pulseaudio.h>
  7. #include <pulse/sample.h>
  8. #include <stdio.h>
  9. #include <errno.h>
  10. #include "audiodevicepulse.h"
  11. #ifndef NSEC_PER_SEC
  12. #define NSEC_PER_SEC 1000000000LL
  13. #endif
  14. /*Audio stream flag*/
  15. #define AUDIO_STRM_ON (1)
  16. #define AUDIO_STRM_OFF (0)
  17. /*Audio Buffer flags*/
  18. #define AUDIO_BUFF_FREE (0)
  19. #define AUDIO_BUFF_USED (1)
  20. #define __THREAD_TYPE pthread_t
  21. #define __THREAD_CREATE(t,f,d) (pthread_create(t,NULL,f,d))
  22. #define __THREAD_CREATE_ATTRIB(t,a,f,d) (pthread_create(t,a,f,d))
  23. #define __THREAD_JOIN(t) (pthread_join(t, NULL))
  24. #define __ATTRIB_TYPE pthread_attr_t
  25. #define __INIT_ATTRIB(t) (pthread_attr_init(t))
  26. #define __ATTRIB_JOINABLE(t) (pthread_attr_setdetachstate(t, PTHREAD_CREATE_JOINABLE))
  27. #define __CLOSE_ATTRIB(t) (pthread_attr_destroy(t))
  28. #define __MUTEX_TYPE pthread_mutex_t
  29. #define __STATIC_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
  30. #define __INIT_MUTEX(m) ( pthread_mutex_init(m, NULL) )
  31. #define __CLOSE_MUTEX(m) ( pthread_mutex_destroy(m) )
  32. #define __LOCK_MUTEX(m) ( pthread_mutex_lock(m) )
  33. #define __UNLOCK_MUTEX(m) ( pthread_mutex_unlock(m) )
  34. #define __COND_TYPE pthread_cond_t
  35. #define __INIT_COND(c) ( pthread_cond_init (c, NULL) )
  36. #define __CLOSE_COND(c) ( pthread_cond_destroy(c) )
  37. #define __COND_BCAST(c) ( pthread_cond_broadcast(c) )
  38. #define __COND_SIGNAL(c) ( pthread_cond_signal(c) )
  39. #define __COND_TIMED_WAIT(c,m,t) ( pthread_cond_timedwait(c,m,t) )
  40. /*next index of ring buffer with size elements*/
  41. #define NEXT_IND(ind,size) ind++;if(ind>=size) ind=0
  42. /*internally is always float*/
  43. typedef int16_t sample_t;
  44. typedef struct rvc_audio_context_s
  45. {
  46. int num_input_dev; /*number of audio input devices in list*/
  47. rvc_audio_device_t* list_input_devices; /*audio input devices list*/
  48. int num_output_dev;
  49. rvc_audio_device_t* list_output_devices; /*audio output devices list*/
  50. int device; /*current device list index*/
  51. int channels; /*channels*/
  52. int samprate; /*sample rate*/
  53. double latency; /*current sugested latency*/
  54. pa_sample_format_t eformat;
  55. /*all ts are monotonic based: both real and generated*/
  56. int64_t current_ts; /*current buffer generated timestamp*/
  57. int64_t last_ts; /*last real timestamp (in nanosec)*/
  58. int64_t snd_begintime; /*sound capture start ref time*/
  59. int64_t ts_drift; /*drift between real and generated ts*/
  60. sample_t* capture_buff; /*pointer to capture data*/
  61. int capture_buff_size; /*capture buffer size (bytes)*/
  62. float capture_buff_level[2]; /*capture buffer channels level*/
  63. volatile int stream_flag; /*stream flag*/
  64. audiocap_param_t audio_param;
  65. }rvc_audio_context_t;
  66. typedef struct rvc_audio_volume_s{
  67. int volume_flag;
  68. char strdevicename[MAX_PATH];
  69. pa_cvolume cvolumes;
  70. }rvc_audio_volume_t;
  71. typedef struct rvc_volume_set_s {
  72. int volume_flag;
  73. char strdevicename[MAX_PATH];
  74. int ivolume;
  75. }rvc_volume_set_t;
  76. class AudioMgrImpl : public IAudioMgr
  77. {
  78. public:
  79. AudioMgrImpl(audiomgr_callback_t* pCallback);
  80. ~AudioMgrImpl();
  81. int audio_mgr_initialize();
  82. int audio_mgr_terminate();
  83. int audio_get_device_count(bool binput);
  84. int audio_get_device_name(char* pstrbuf, size_t ulen, bool binput, int index);
  85. int audio_get_device_id(const char* pstrname, bool binput);
  86. rvc_audio_device_t* audio_get_device_infos(bool binput, int index);
  87. int audio_get_device_volume(int* ivolume, const char* pstrname, bool binput);
  88. int audiopulse_get_device_volume(int* ivolume, const char* pstrname, bool binput);
  89. int audio_set_device_volume(int ivolume, const char* pstrname, bool binput);
  90. int audiopulse_set_device_volume(int ivolume, const char* pstrname, bool binput);
  91. int set_audio_capture_params(audiocap_param_t* param);
  92. int start_audio_capture();
  93. int stop_audio_capture();
  94. int audio_mgr_destroy();
  95. rvc_audio_context_t* audio_get_context();
  96. audiomgr_callback_t* audio_get_callback();
  97. void audiolog(const char* fmt, ...);
  98. private:
  99. int audio_init_pulseaudio();
  100. int pa_get_devicelist();
  101. int audio_close_pulseaudio();
  102. rvc_audio_device_t* audio_get_input_device(int index);
  103. rvc_audio_device_t* audio_get_output_device(int index);
  104. int audio_set_pulseaudio_device(int index);
  105. int audio_set_pulsecap_params(audiocap_param_t* param);
  106. void audio_set_latency(double latency);
  107. private:
  108. rvc_audio_context_t* m_audio_context;
  109. audiomgr_callback_t m_callback;
  110. __THREAD_TYPE m_readthread;
  111. };