pvrecorder/src/miniaudio/examples/simple_loopback.c
Go to the documentation of this file.
1 /*
2 Demonstrates how to implement loopback recording.
3 
4 This example simply captures data from your default playback device until you press Enter. The output is saved to the
5 file specified on the command line.
6 
7 Loopback mode is when you record audio that is played from a given speaker. It is only supported on WASAPI, but can be
8 used indirectly with PulseAudio by choosing the appropriate loopback device after enumeration.
9 
10 To use loopback mode you just need to set the device type to ma_device_type_loopback and set the capture device config
11 properties. The output buffer in the callback will be null whereas the input buffer will be valid.
12 */
13 #define MINIAUDIO_IMPLEMENTATION
14 #include "../miniaudio.h"
15 
16 #include <stdlib.h>
17 #include <stdio.h>
18 
19 void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
20 {
21  ma_encoder* pEncoder = (ma_encoder*)pDevice->pUserData;
22  MA_ASSERT(pEncoder != NULL);
23 
24  ma_encoder_write_pcm_frames(pEncoder, pInput, frameCount);
25 
26  (void)pOutput;
27 }
28 
29 int main(int argc, char** argv)
30 {
31  ma_result result;
32  ma_encoder_config encoderConfig;
34  ma_device_config deviceConfig;
36 
37  /* Loopback mode is currently only supported on WASAPI. */
38  ma_backend backends[] = {
40  };
41 
42  if (argc < 2) {
43  printf("No output file.\n");
44  return -1;
45  }
46 
48 
49  if (ma_encoder_init_file(argv[1], &encoderConfig, &encoder) != MA_SUCCESS) {
50  printf("Failed to initialize output file.\n");
51  return -1;
52  }
53 
55  deviceConfig.capture.pDeviceID = NULL; /* Use default device for this example. Set this to the ID of a _playback_ device if you want to capture from a specific device. */
56  deviceConfig.capture.format = encoder.config.format;
57  deviceConfig.capture.channels = encoder.config.channels;
58  deviceConfig.sampleRate = encoder.config.sampleRate;
59  deviceConfig.dataCallback = data_callback;
60  deviceConfig.pUserData = &encoder;
61 
62  result = ma_device_init_ex(backends, sizeof(backends)/sizeof(backends[0]), NULL, &deviceConfig, &device);
63  if (result != MA_SUCCESS) {
64  printf("Failed to initialize loopback device.\n");
65  return -2;
66  }
67 
68  result = ma_device_start(&device);
69  if (result != MA_SUCCESS) {
71  printf("Failed to start device.\n");
72  return -3;
73  }
74 
75  printf("Press Enter to stop recording...\n");
76  getchar();
77 
80 
81  return 0;
82 }
ma_encoder::config
ma_encoder_config config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5326
ma_device_init_ex
ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config *pContextConfig, const ma_device_config *pConfig, ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27362
ma_device_config::pDeviceID
ma_device_id * pDeviceID
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3127
ma_device_type_loopback
@ ma_device_type_loopback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3015
ma_device_uninit
void ma_device_uninit(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27425
ma_device_start
ma_result ma_device_start(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27485
ma_encoder_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5313
ma_backend_wasapi
@ ma_backend_wasapi
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2795
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
ma_resource_format_wav
@ ma_resource_format_wav
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5147
data_callback
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount)
Definition: pvrecorder/src/miniaudio/examples/simple_loopback.c:19
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
ma_encoder_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5317
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
ma_encoder_write_pcm_frames
ma_uint64 ma_encoder_write_pcm_frames(ma_encoder *pEncoder, const void *pFramesIn, ma_uint64 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45351
device
ma_device device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
encoder
ma_encoder encoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:62
main
int main(int argc, char **argv)
Definition: pvrecorder/src/miniaudio/examples/simple_loopback.c:29
ma_device_config::capture
struct ma_device_config::@98 capture
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_encoder_config::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5318
ma_encoder_uninit
void ma_encoder_uninit(ma_encoder *pEncoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45334
ma_encoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5324
ma_device::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3592
ma_encoder_init_file
ma_result ma_encoder_init_file(const char *pFilePath, const ma_encoder_config *pConfig, ma_encoder *pEncoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45279
ma_encoder_config_init
ma_encoder_config ma_encoder_config_init(ma_resource_format resourceFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:45183
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
ma_device_config::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3128
ma_device_config_init
ma_device_config ma_device_config_init(ma_device_type deviceType)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27034
ma_device_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3129
python.test_porcupine.argv
argv
Definition: test_porcupine.py:158
ma_device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3584
ma_device_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3100
ma_device_config::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3103
MA_SUCCESS
#define MA_SUCCESS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1659
ma_backend
ma_backend
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:2793
ma_encoder_config::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5316
ma_device_config::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3112


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:14:50