libaudiomgr_linux.h 4.8 KB

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