Go to the documentation of this file.
12 #pragma GCC diagnostic push
14 #pragma GCC diagnostic ignored "-Wunused-result"
16 #define MINIAUDIO_IMPLEMENTATION
18 #include "miniaudio.h"
20 #pragma GCC diagnostic pop
22 #include "pv_circular_buffer.h"
23 #include "pv_recorder.h"
46 fprintf(stdout,
"Overflow - reader is not reading fast enough.\n");
54 int32_t buffer_size_msec,
60 if (frame_length <= 0) {
63 if (buffer_size_msec <= 0) {
71 const int32_t capacity = (int32_t) ((16000 * buffer_size_msec) / 1000);
72 if (capacity < frame_length) {
115 if (device_index >=
count) {
187 object->is_started =
true;
208 object->is_started =
false;
224 int16_t *read_ptr = pcm;
225 int32_t processed = 0;
226 int32_t remaining =
object->frame_length;
243 remaining =
object->frame_length - processed;
253 return object->device.capture.name;
288 char **
d = calloc(capture_count,
sizeof(
char *));
294 for (int32_t i = 0; i < (int32_t) capture_count; i++) {
295 d[i] = strdup(capture_info[i].
name);
297 for (int32_t j = i - 1; j >= 0; j--) {
308 *
count = (int32_t) capture_count;
315 if (devices && (
count > 0)) {
316 for (int32_t i = 0; i <
count; i++) {
324 static const char *
const STRINGS[] = {
330 "DEVICE_INITIALIZED",
331 "DEVICE_NOT_INITIALIZED",
335 int32_t size =
sizeof(STRINGS) /
sizeof(STRINGS[0]);
@ PV_RECORDER_STATUS_OUT_OF_MEMORY
@ PV_CIRCULAR_BUFFER_STATUS_WRITE_OVERFLOW
PV_API pv_recorder_status_t pv_recorder_init(int32_t device_index, int32_t frame_length, int32_t buffer_size_msec, bool log_overflow, pv_recorder_t **object)
int32_t pv_circular_buffer_read(pv_circular_buffer_t *object, void *buffer, int32_t length)
#define MA_FAILED_TO_INIT_BACKEND
void ma_device_uninit(ma_device *pDevice)
ma_result ma_device_start(ma_device *pDevice)
static void pv_recorder_ma_callback(ma_device *device, void *output, const void *input, ma_uint32 frame_count)
pv_circular_buffer_status_t
ma_result ma_device_stop(ma_device *pDevice)
PV_API void pv_recorder_delete(pv_recorder_t *object)
@ PV_CIRCULAR_BUFFER_STATUS_SUCCESS
ma_device_callback_proc dataCallback
@ PV_RECORDER_STATUS_IO_ERROR
@ PV_RECORDER_STATUS_INVALID_ARGUMENT
void pv_circular_buffer_delete(pv_circular_buffer_t *object)
struct ma_device_config::@98 capture
const PV_API char * pv_recorder_version(void)
ma_result ma_context_uninit(ma_context *pContext)
PV_API pv_recorder_status_t pv_recorder_get_audio_devices(int32_t *count, char ***devices)
#define MA_DEVICE_NOT_INITIALIZED
void ma_mutex_uninit(ma_mutex *pMutex)
#define PV_RECORDER_DEFAULT_DEVICE_INDEX
static const int32_t READ_SLEEP_MILLI_SECONDS
static const int32_t READ_RETRY_COUNT
PV_API pv_recorder_status_t pv_recorder_stop(pv_recorder_t *object)
pv_circular_buffer_status_t pv_circular_buffer_init(int32_t capacity, int32_t element_size, pv_circular_buffer_t **object)
#define MA_DEVICE_ALREADY_INITIALIZED
PV_API pv_recorder_status_t pv_recorder_read(pv_recorder_t *object, int16_t *pcm)
ma_result ma_mutex_init(ma_context *pContext, ma_mutex *pMutex)
ma_result ma_context_get_devices(ma_context *pContext, ma_device_info **ppPlaybackDeviceInfos, ma_uint32 *pPlaybackDeviceCount, ma_device_info **ppCaptureDeviceInfos, ma_uint32 *pCaptureDeviceCount)
@ PV_RECORDER_STATUS_DEVICE_ALREADY_INITIALIZED
ma_device_config ma_device_config_init(ma_device_type deviceType)
const PV_API char * pv_recorder_get_selected_device(pv_recorder_t *object)
const PV_API char * pv_recorder_status_to_string(pv_recorder_status_t status)
PV_API void pv_recorder_free_device_list(int32_t count, char **devices)
void ma_mutex_unlock(ma_mutex *pMutex)
void pv_circular_buffer_reset(pv_circular_buffer_t *object)
pv_circular_buffer_t * buffer
ma_result ma_device_init(ma_context *pContext, const ma_device_config *pConfig, ma_device *pDevice)
void ma_mutex_lock(ma_mutex *pMutex)
@ PV_RECORDER_STATUS_DEVICE_NOT_INITIALIZED
@ PV_RECORDER_STATUS_RUNTIME_ERROR
PV_API pv_recorder_status_t pv_recorder_start(pv_recorder_t *object)
ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config *pConfig, ma_context *pContext)
@ PV_RECORDER_STATUS_BACKEND_ERROR
@ PV_RECORDER_STATUS_SUCCESS
@ PV_RECORDER_STATUS_INVALID_STATE
pv_circular_buffer_status_t pv_circular_buffer_write(pv_circular_buffer_t *object, const void *buffer, int32_t length)