RDK Documentation (Open Sourced RDK Components)
audio_capture_manager.cpp
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2016 RDK Management
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 #include <stdlib.h>
20 #include <string.h>
21 #include <sstream>
22 #include "audio_capture_manager.h"
23 #include <algorithm>
24 #include <chrono>
25 #include <unistd.h>
26 #include "rmfAudioCapture.h"
27 
28 using namespace audiocapturemgr;
29 
30 const unsigned int QUEUE_CHECK_LOOP_TIME_US = 1000 * 50; //50ms
31 static const size_t DEFAULT_FIFO_SIZE = 64 * 1024;
32 static const size_t DEFAULT_THRESHOLD = 8 * 1024;
33 static const unsigned int DEFAULT_DELAY_COMPENSATION = 0;
34 static const unsigned int MAX_QMGR_BUFFER_DURATION_S = 30; //safe maximum, beyond which the queue will be flushed without waiting for buffers to be consumed.
35 
36 static void * q_mgr_thread_launcher(void * data)
37 {
38  q_mgr * ptr = (q_mgr *) data;
39  ptr->data_processor_thread();
40  return NULL;
41 }
42 
43 rmf_Error q_mgr::data_callback(void *context, void *buf, unsigned int size)
44 {
45  ((q_mgr *)context)->add_data((unsigned char*)buf, size);
46  return RMF_SUCCESS;
47 }
48 
49 
50 inline void q_mgr::lock(pthread_mutex_t &mutex)
51 {
52  REPORT_IF_UNEQUAL(0, pthread_mutex_lock(&mutex));
53 }
54 inline void q_mgr::unlock(pthread_mutex_t &mutex)
55 {
56  REPORT_IF_UNEQUAL(0, pthread_mutex_unlock(&mutex));
57 }
58 inline void q_mgr::notify_data_ready()
59 {
60  DEBUG("Enter.\n");
61  if(m_notify_new_data)
62  {
63  DEBUG("Posting semaphore.\n");
64  REPORT_IF_UNEQUAL(0, sem_post(&m_sem));
65  m_notify_new_data = false;
66  }
67 }
68 void q_mgr::swap_queues() //caller must lock before invoking this.
69 {
70  if(!m_current_outgoing_q->empty())
71  {
72  WARN("Outgoing queue wasn't empty. Flushing it now.\n");
73  flush_queue(m_current_outgoing_q);
74  }
75  std::vector <audio_buffer *> * temp = m_current_incoming_q;
76  m_current_incoming_q = m_current_outgoing_q;
77  m_current_outgoing_q = temp;
78 }
79 
80 void q_mgr::flush_queue(std::vector <audio_buffer *> *q)
81 {
82  DEBUG("Flushing queue.\n");
83  std::vector <audio_buffer *>::iterator iter;
84  for(iter = q->begin(); iter != q->end(); iter++)
85  {
86  free_audio_buffer(*iter);
87  }
88  q->clear();
89 }
90 
91 namespace audiocapturemgr
92 {
93  void get_individual_audio_parameters(const audio_properties_t &audio_props, unsigned int &sampling_rate, unsigned int &bits_per_sample, unsigned int &num_channels)
94  {
95  bits_per_sample = 0;
96  sampling_rate= 0;
97  num_channels = 0;
98 
99  switch(audio_props.sampling_frequency)
100  {
101  case racFreq_e16000:
102  sampling_rate = 16000;
103  break;
104  case racFreq_e24000:
105  sampling_rate = 24000;
106  break;
107  case racFreq_e32000:
108  sampling_rate = 32000;
109  break;
110  case racFreq_e44100:
111  sampling_rate = 44100;
112  break;
113  case racFreq_e48000:
114  sampling_rate = 48000;
115  break;
116  default:
117  ERROR("Bad sampling rate: 0x%x\n", audio_props.sampling_frequency);
118  break;
119  }
120 
121  switch(audio_props.format)
122  {
124  bits_per_sample = 16; num_channels = 2;
125  break;
127  bits_per_sample = 24; num_channels = 2;
128  break;
130  bits_per_sample = 16; num_channels = 1;
131  break;
133  bits_per_sample = 16; num_channels = 1;
134  break;
136  bits_per_sample = 16; num_channels = 1;
137  break;
138  case racFormat_e24Bit5_1:
139  bits_per_sample = 24; num_channels = 6;
140  break;
141  default:
142  ERROR("Unknown format 0x%x\n", audio_props.format);
143  }
144  }
145 
146  unsigned int calculate_data_rate(const audio_properties_t &audio_props)
147  {
148  unsigned int bits_per_sample = 0;
149  unsigned int sampling_rate= 0;
150  unsigned int num_channels = 0;
151  get_individual_audio_parameters(audio_props, sampling_rate, bits_per_sample, num_channels);
152  unsigned int data_rate = bits_per_sample * sampling_rate * num_channels / 8;
153  INFO("Audio properties: %dkHz, %d bit, %d channel, byte rate: %d\n", sampling_rate, bits_per_sample, num_channels, data_rate);
154  return data_rate;
155  }
156 
157  std::string get_suffix(unsigned int ticker)
158  {
159  std::ostringstream stream;
160  stream << ticker;
161  std::string outstring = stream.str();
162  return outstring;
163  }
164 }
165 
166 q_mgr::q_mgr() : m_inflow_byte_counter(0), m_num_clients(0), m_notify_new_data(false), m_started(false), m_device_handle(NULL), m_stop_data_monitor(true)
167 {
168  INFO("Creating instance 0x%p.\n", static_cast <void *>(this));
169  pthread_mutexattr_t mutex_attribute;
170  REPORT_IF_UNEQUAL(0, pthread_mutexattr_init(&mutex_attribute));
171  REPORT_IF_UNEQUAL(0, pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_ERRORCHECK));
172  REPORT_IF_UNEQUAL(0, pthread_mutex_init(&m_q_mutex, &mutex_attribute));
173  REPORT_IF_UNEQUAL(0, pthread_mutex_init(&m_client_mutex, &mutex_attribute));
174  REPORT_IF_UNEQUAL(0, sem_init(&m_sem, 0, 0));
175  m_current_incoming_q = new std::vector <audio_buffer *>;
176  m_current_outgoing_q = new std::vector <audio_buffer *>;
177  m_processing_thread_alive = false; //CID:80565 : Initialize bool variable
178 
179  REPORT_IF_UNEQUAL(0, pthread_create(&m_thread, NULL, q_mgr_thread_launcher, (void *) this));
180 
181  int ret = RMF_AudioCapture_Open(&m_device_handle);
182  INFO("open() result is 0x%x\n", ret);
183 
184  RMF_AudioCapture_Settings settings;
186  m_audio_properties.format = settings.format;
187  m_audio_properties.sampling_frequency = settings.samplingFreq;
188  m_audio_properties.fifo_size = DEFAULT_FIFO_SIZE;
189  m_audio_properties.threshold = DEFAULT_THRESHOLD;
190  m_audio_properties.delay_compensation_ms = DEFAULT_DELAY_COMPENSATION;
191  m_bytes_per_second = calculate_data_rate(m_audio_properties);
192  m_max_queue_size = (MAX_QMGR_BUFFER_DURATION_S * m_bytes_per_second) / m_audio_properties.threshold;
193  INFO("Max incoming queue size is now %d\n", m_max_queue_size);
194 }
195 q_mgr::~q_mgr()
196 {
197  INFO("Deleting instance 0x%p.\n", static_cast <void *>(this));
198  if(true == m_started)
199  {
200  stop();
201  }
202  if(NULL != m_device_handle)
203  {
204  int ret = RMF_AudioCapture_Close(m_device_handle);
205  INFO("close() result is 0x%x\n", ret);
206  m_device_handle = NULL;
207  }
208 
209 
210  m_processing_thread_alive = false;
211  REPORT_IF_UNEQUAL(0, sem_post(&m_sem));
212  REPORT_IF_UNEQUAL(0, pthread_join(m_thread, NULL));
213  REPORT_IF_UNEQUAL(0, sem_destroy(&m_sem));
214  REPORT_IF_UNEQUAL(0, pthread_mutex_destroy(&m_q_mutex));
215  REPORT_IF_UNEQUAL(0, pthread_mutex_destroy(&m_client_mutex));
216  flush_queue(m_current_incoming_q);
217  flush_queue(m_current_outgoing_q);
218  delete m_current_incoming_q;
219  delete m_current_outgoing_q;
220 }
221 
222 
224 {
225  DEBUG("Enter.\n");
226  lock(m_q_mutex);
227  if(0 == memcmp(&m_audio_properties, &in_properties, sizeof(m_audio_properties)))
228  {
229  unlock(m_q_mutex);
230  return 0; //No change to properties
231  }
232 
233  /* Validate incoming parameters.*/
234  if((racFormat_eMax <= in_properties.format) || (racFreq_eMax <= in_properties.sampling_frequency))
235  {
236  ERROR("Bad parameters. Format: 0x%x, sampling freq: 0x%x\n", in_properties.format, in_properties.sampling_frequency);
237  unlock(m_q_mutex);
238  return -1;
239  }
240 
241  m_audio_properties = in_properties;
242 
243  /*Update data rate.*/
244  m_bytes_per_second = calculate_data_rate(m_audio_properties);
245  m_max_queue_size = (MAX_QMGR_BUFFER_DURATION_S * m_bytes_per_second) / m_audio_properties.threshold;
246  INFO("Max incoming queue size is now %d\n", m_max_queue_size);
247  unlock(m_q_mutex);
248 
249  lock(m_client_mutex);
250  bool needs_restart = m_started;
251  if(m_started)
252  {
253  stop();
254  }
255  std::vector<audio_capture_client *>::iterator iter;
256  for(iter = m_clients.begin(); iter != m_clients.end(); iter++)
257  {
258  (*iter)->notify_event(AUDIO_SETTINGS_CHANGE_EVENT);
259  }
260  if(needs_restart)
261  {
262  INFO("Restarting audio after settings change.\n");
263  start();
264  }
265 
266  unlock(m_client_mutex);
267  return 0;
268 }
269 
271 {
272  out_properties = m_audio_properties;
273 }
274 
276 {
277  RMF_AudioCapture_Settings settings;
279  out_properties.format = settings.format;
280  out_properties.sampling_frequency = settings.samplingFreq;
281  out_properties.fifo_size = settings.fifoSize;
282  out_properties.threshold = settings.threshold;
283  out_properties.delay_compensation_ms = settings.delayCompensation_ms;
284 }
285 unsigned int q_mgr::get_data_rate()
286 {
287  return m_bytes_per_second;
288 }
289 
290 void q_mgr::add_data(unsigned char *buf, unsigned int size)
291 {
292  DEBUG("Adding data.\n");
293  lock(m_q_mutex);
294  audio_buffer * temp = create_new_audio_buffer(buf, size, 0, m_num_clients);
295  if(m_max_queue_size < m_current_incoming_q->size())
296  {
297  WARN("Incoming queue size over limit. Flushing.\n");
298  flush_queue(m_current_incoming_q);
299  }
300  m_current_incoming_q->push_back(temp);
301  //TODO: guard against accumulating audio_buffers if there is no consumption.
302  notify_data_ready();
303  unlock(m_q_mutex);
304  m_inflow_byte_counter += size;
305 }
307 {
308  DEBUG("Launching.\n");
309  m_processing_thread_alive = true;
310  while(m_processing_thread_alive)
311  {
312  /*
313  * 1. If there are audio_buffers remaining in outbound queue, process them.
314  * 2. If no audio_buffers remain in outbound queue, wait for semaphore.
315  * 3. When semaphore is posted, if data is available in the other queue, swap queues.
316  * */
317  DEBUG("Enter processing loop.\n");
318  while(!m_current_outgoing_q->empty())
319  {
320  process_data();
321  }
322  DEBUG("No data in outgoing queue.\n");
323  /* No more data to be consumed. Gotta check the other queue */
324  lock(m_q_mutex);
325  if(!m_current_incoming_q->empty())
326  {
327  DEBUG("Incoming queue has buffers. Swapping them.\n");
328  swap_queues();
329  unlock(m_q_mutex);
330  }
331  else
332  {
333  /*Block until data is available.*/
334  m_notify_new_data = true;
335  unlock(m_q_mutex);
336  DEBUG("Incoming queue is empty as well. Waiting until a buffer arrives.\n");
337  if(0 != sem_wait(&m_sem))
338  {
339  ERROR("Critical semaphore error. Exiting\n");
340  return;
341  }
342  /* Just in case the semaphore was posted to shut down this thred... */
343  if(!m_processing_thread_alive)
344  {
345  break;
346  }
347 
348  lock(m_q_mutex);
349  DEBUG("New data available in incoming queue. Swapping them.\n");
350  swap_queues();
351  unlock(m_q_mutex);
352  }
353 
354  }
355  DEBUG("Exiting.\n");
356 }
357 
358 void q_mgr::update_buffer_references()
359 {
360  std::vector <audio_buffer *>::iterator buffer_iter;
362  for(buffer_iter = m_current_outgoing_q->begin(); buffer_iter != m_current_outgoing_q->end(); buffer_iter++)
363  {
364  set_ref_audio_buffer(*buffer_iter, m_num_clients);
365  }
367 }
368 
369 void q_mgr::process_data()
370 {
371  DEBUG("Processing %d buffers of data.\n", m_current_outgoing_q->size());
372 
373  lock(m_client_mutex);
374 
375  update_buffer_references();
376 
377  std::vector <audio_buffer *>::iterator buffer_iter;
378  for(buffer_iter = m_current_outgoing_q->begin(); buffer_iter != m_current_outgoing_q->end(); buffer_iter++)
379  {
380  std::vector <audio_capture_client *>::iterator client_iter;
381  for(client_iter = m_clients.begin(); client_iter != m_clients.end(); client_iter++)
382  {
383  (*client_iter)->data_callback(*buffer_iter);
384  }
385  }
386  unlock(m_client_mutex);
387  m_current_outgoing_q->clear();
388 }
389 
391 {
392  DEBUG("Enter.\n");
393  lock(m_client_mutex);
394  if(std::find(m_clients.begin(), m_clients.end(), client) == m_clients.end()) //Add only if it is not already present.
395  {
396  m_clients.push_back(client);
397  m_num_clients = m_clients.size();
398  if(1 == m_num_clients)
399  {
400  start();
401  }
402  }
403  else
404  {
405  INFO("Will not register client as it is already present.\n");
406  }
407  unlock(m_client_mutex);
408  INFO("Total clients: %d.\n", m_num_clients);
409  return 0;
410 }
412 {
413  DEBUG("Enter.\n");
414  lock(m_client_mutex);
415  m_clients.erase(std::remove(m_clients.begin(), m_clients.end(), client), m_clients.end());
416  m_num_clients = m_clients.size();
417  if(0 == m_num_clients)
418  {
419  stop();
420  }
421  unlock(m_client_mutex);
422  INFO("Total clients: %d.\n", m_num_clients);
423  return 0;
424 }
425 
426 void q_mgr::flush_system()
427 {
428  /*
429  * Flush everything in incoming queue.
430  * Wait until outbound queue is exhausted.
431  * Return.
432  * */
433  flush_queue(m_current_incoming_q);
434  while(!m_current_outgoing_q->empty())
435  {
436  usleep(QUEUE_CHECK_LOOP_TIME_US);
437  }
438  INFO("Exit.\n");
439 }
440 
441 static void log_settings(RMF_AudioCapture_Settings &settings)
442 {
443  INFO("Format 0x%x, sampling freq: 0x%x, FIFO size: %d, threshold: %d, delay compensation: %d\n",
444  settings.format, settings.samplingFreq, settings.fifoSize, settings.threshold, settings.delayCompensation_ms);
445 }
446 
447 void q_mgr::data_monitor()
448 {
449  INFO("data_monitor thread has launched.\n");
450  unsigned int saved_byte_counter = 0;
451  bool is_stalled = false;
452  std::unique_lock<std::mutex> wlock(m_data_monitor_mutex);
453  while(false == m_stop_data_monitor)
454  {
455  auto ret = m_data_monitor_cv.wait_for(wlock, std::chrono::seconds(5), [this](){return m_stop_data_monitor;});
456  if(false == ret)
457  { //This indicates a timeout or spurious wake.
458  if(saved_byte_counter == m_inflow_byte_counter)
459  {
460  if(false == is_stalled)
461  {
462  WARN("Data inflow has stalled at %u bytes for instance 0x%p.\n", saved_byte_counter, static_cast <void *>(this));
463  is_stalled = true;
464  }
465  else
466  continue; //already logged the stall once.
467  }
468  else
469  {
470  saved_byte_counter = m_inflow_byte_counter;
471  if(true == is_stalled)
472  {
473  INFO("Data inflow has resumed for instance 0x%p.\n", static_cast <void *>(this));
474  is_stalled = false;
475  }
476  }
477  }
478  }
479  INFO("data_monitor thread exiting.\n");
480 }
481 
483 {
484  if(true == m_started)
485  {
486  WARN("Looks like device was already started.\n");
487  return 0;
488  }
489 
490  m_inflow_byte_counter = 0;
491  RMF_AudioCapture_Settings settings;
492  memset (&settings, 0, sizeof(RMF_AudioCapture_Settings));
494 
496  settings.cbBufferReadyParm = (void *)this;
497  settings.fifoSize = m_audio_properties.fifo_size;
498  settings.threshold = m_audio_properties.threshold;
499  settings.delayCompensation_ms = m_audio_properties.delay_compensation_ms;
500  settings.format = m_audio_properties.format;
501  settings.samplingFreq = m_audio_properties.sampling_frequency;
502 
503  log_settings(settings);
504 
505  int ret = RMF_AudioCapture_Start(m_device_handle, &settings);
506  INFO("start() result is 0x%x\n", ret);
507  m_started = true;
508 
509  std::unique_lock<std::mutex> wlock(m_data_monitor_mutex);
510  m_stop_data_monitor = false;
511  m_data_monitor_thread = std::thread(&q_mgr::data_monitor, this);
512  return ret;
513 }
514 
516 {
517  if(false == m_started)
518  {
519  WARN("Looks like device is already stopped.\n");
520  return 0;
521  }
522 
523  {
524  std::unique_lock<std::mutex> wlock(m_data_monitor_mutex);
525  m_stop_data_monitor = true;
526  }
527  m_data_monitor_cv.notify_all();
528  m_data_monitor_thread.join();
529 
530  int ret = RMF_AudioCapture_Stop(m_device_handle);
531  INFO("stop() result is 0x%x\n", ret);
532  m_started = false;
533  return ret;
534 }
535 
536 void audio_capture_client::release_buffer(audio_buffer *ptr)
537 {
538  unref_audio_buffer(ptr);
539 }
540 
541 int audio_capture_client::data_callback(audio_buffer *buf)
542 {
543  release_buffer(buf);
544  return 0;
545 }
546 audio_capture_client::audio_capture_client(q_mgr * manager): m_priority(0), m_manager(manager)
547 {
548  pthread_mutexattr_t mutex_attribute;
549  REPORT_IF_UNEQUAL(0, pthread_mutexattr_init(&mutex_attribute));
550  REPORT_IF_UNEQUAL(0, pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_ERRORCHECK));
551  REPORT_IF_UNEQUAL(0, pthread_mutex_init(&m_mutex, &mutex_attribute));
552 }
553 audio_capture_client::~audio_capture_client()
554 {
555  REPORT_IF_UNEQUAL(0, pthread_mutex_destroy(&m_mutex));
556 }
557 
558 void audio_capture_client::set_manager(q_mgr *mgr)
559 {
560  m_manager = mgr;
561 }
562 
563 int audio_capture_client::set_audio_properties(audio_properties_t &properties)
564 {
565  return m_manager->set_audio_properties(properties);
566 }
567 
568 void audio_capture_client::get_audio_properties(audio_properties_t &properties)
569 {
570  m_manager->get_audio_properties(properties);
571 }
572 
573 void audio_capture_client::get_default_audio_properties(audio_properties_t &properties)
574 {
575  m_manager->get_default_audio_properties(properties);
576 }
577 
578 int audio_capture_client::start()
579 {
580  return m_manager->register_client(this);
581 }
582 
583 int audio_capture_client::stop()
584 {
585  return m_manager->unregister_client(this);
586 }
587 
588 void audio_capture_client::lock()
589 {
590  REPORT_IF_UNEQUAL(0, pthread_mutex_lock(&m_mutex));
591 }
592 
593 void audio_capture_client::unlock()
594 {
595  REPORT_IF_UNEQUAL(0, pthread_mutex_unlock(&m_mutex));
596 }
q_mgr::set_audio_properties
int set_audio_properties(audiocapturemgr::audio_properties_t &in_properties)
This API is used to set the audio properties to the client device.
Definition: audio_capture_manager.cpp:223
audio_capture_client
Definition: audio_capture_manager.h:219
racFormat_e24Bit5_1
@ racFormat_e24Bit5_1
Definition: rmfAudioCapture.h:75
racFreq_e24000
@ racFreq_e24000
Definition: rmfAudioCapture.h:85
q_mgr::add_data
void add_data(unsigned char *buf, unsigned int size)
This API creates new audio buffer and pushes the data to the queue.
Definition: audio_capture_manager.cpp:290
RMF_AudioCapture_Settings
Definition: rmfAudioCapture.h:104
racFreq_e48000
@ racFreq_e48000
Definition: rmfAudioCapture.h:88
q_mgr::get_data_rate
unsigned int get_data_rate()
Returns data rate in bytes per second.
Definition: audio_capture_manager.cpp:285
RMF_AudioCapture_Settings::delayCompensation_ms
unsigned int delayCompensation_ms
Definition: rmfAudioCapture.h:120
q_mgr::get_audio_properties
void get_audio_properties(audiocapturemgr::audio_properties_t &out_properties)
This API returns the current audio properties of the device.
Definition: audio_capture_manager.cpp:270
RMF_AudioCapture_Start
rmf_Error RMF_AudioCapture_Start(RMF_AudioCaptureHandle handle, RMF_AudioCapture_Settings *settings)
This API will start the Audio capture.
Definition: rmfAudioCapture.c:71
q_mgr::data_callback
static rmf_Error data_callback(void *context, void *buf, unsigned int size)
This function invokes an API for adding data to the audio buffer.
Definition: audio_capture_manager.cpp:43
RMF_AudioCapture_Settings::threshold
size_t threshold
Definition: rmfAudioCapture.h:114
audio_buffer
Definition: audio_buffer.h:25
q_mgr::data_processor_thread
void data_processor_thread()
This API processes the audio buffers available in the queue.
Definition: audio_capture_manager.cpp:306
RMF_AudioCapture_Open
rmf_Error RMF_AudioCapture_Open(RMF_AudioCaptureHandle *handle)
This API creates audio capture session, create all required resources to provide audio capture handle...
Definition: rmfAudioCapture.c:23
audiocapturemgr::audio_properties_t
Definition: audio_capture_manager.h:56
free_audio_buffer
void free_audio_buffer(audio_buffer *ptr)
Deletes the audio buffer.
Definition: audio_buffer.cpp:69
racFreq_e32000
@ racFreq_e32000
Definition: rmfAudioCapture.h:86
audio_buffer_get_global_lock
void audio_buffer_get_global_lock()
Function to acquire lock.
Definition: audio_buffer.cpp:73
q_mgr::get_default_audio_properties
void get_default_audio_properties(audiocapturemgr::audio_properties_t &out_properties)
This function will return default RMF_AudioCapture_Settings settings.
Definition: audio_capture_manager.cpp:275
racFormat_e16BitMonoRight
@ racFormat_e16BitMonoRight
Definition: rmfAudioCapture.h:73
create_new_audio_buffer
audio_buffer * create_new_audio_buffer(const unsigned char *in_ptr, unsigned int in_size, unsigned int clip_length, unsigned int refcount)
This API creates new audio buffer.
Definition: audio_buffer.cpp:45
q_mgr::register_client
int register_client(audio_capture_client *client)
This API registers the client.
Definition: audio_capture_manager.cpp:390
RMF_AudioCapture_Settings::cbBufferReadyParm
void * cbBufferReadyParm
Definition: rmfAudioCapture.h:106
racFormat_e24BitStereo
@ racFormat_e24BitStereo
Definition: rmfAudioCapture.h:69
q_mgr::start
int start()
This function will start the Audio capture.
Definition: audio_capture_manager.cpp:482
racFormat_e16BitMono
@ racFormat_e16BitMono
Definition: rmfAudioCapture.h:74
RMF_AudioCapture_Settings::fifoSize
size_t fifoSize
Definition: rmfAudioCapture.h:112
RMF_AudioCapture_Stop
rmf_Error RMF_AudioCapture_Stop(RMF_AudioCaptureHandle handle)
This API will stop the audio capture.
Definition: rmfAudioCapture.c:82
q_mgr::stop
int stop()
This function will stop the audio capture.
Definition: audio_capture_manager.cpp:515
racFreq_e44100
@ racFreq_e44100
Definition: rmfAudioCapture.h:87
RMF_AudioCapture_Close
rmf_Error RMF_AudioCapture_Close(RMF_AudioCaptureHandle handle)
This API will free all resources associated with this audio capture handle. It will close audio captu...
Definition: rmfAudioCapture.c:91
q_mgr
Definition: audio_capture_manager.h:70
RMF_AudioCapture_GetDefaultSettings
rmf_Error RMF_AudioCapture_GetDefaultSettings(RMF_AudioCapture_Settings *settings)
This API Will return default RMF audio capture settings.
Definition: rmfAudioCapture.c:51
unref_audio_buffer
void unref_audio_buffer(audio_buffer *ptr)
This API is to release the audio buffer.
Definition: audio_buffer.cpp:51
audio_buffer_release_global_lock
void audio_buffer_release_global_lock()
Function to release lock.
Definition: audio_buffer.cpp:77
set_ref_audio_buffer
void set_ref_audio_buffer(audio_buffer *ptr, unsigned int refcount)
This API is used to update the buffer references.
Definition: audio_buffer.h:62
RMF_AudioCapture_Settings::samplingFreq
racFreq samplingFreq
Definition: rmfAudioCapture.h:118
RMF_AudioCapture_Settings::cbBufferReady
RMF_AudioCaptureBufferReadyCb cbBufferReady
Definition: rmfAudioCapture.h:105
racFreq_e16000
@ racFreq_e16000
Definition: rmfAudioCapture.h:83
racFormat_e16BitStereo
@ racFormat_e16BitStereo
Definition: rmfAudioCapture.h:68
RMF_AudioCapture_Settings::format
racFormat format
Definition: rmfAudioCapture.h:115
q_mgr::unregister_client
int unregister_client(audio_capture_client *client)
Removes the client.
Definition: audio_capture_manager.cpp:411
racFormat_e16BitMonoLeft
@ racFormat_e16BitMonoLeft
Definition: rmfAudioCapture.h:72