pvrecorder/src/miniaudio/research/_examples/resource_manager.c
Go to the documentation of this file.
1 /*
2 Demonstrates how you can use the resource manager to manage loaded sounds.
3 
4 This example loads the first sound specified on the command line via the resource manager and then plays it using the
5 low level API.
6 
7 You can control whether or not you want to load the sound asynchronously and whether or not you want to store the data
8 in-memory or stream it. When storing the sound in-memory you can also control whether or not it is decoded. To do this,
9 specify a combination of the following options in `ma_resource_manager_data_source_init()`:
10 
11  * MA_DATA_SOURCE_FLAG_ASYNC - Load asynchronously.
12  * MA_DATA_SOURCE_FLAG_DECODE - Store the sound in-memory in uncompressed/decoded format.
13  * MA_DATA_SOURCE_FLAG_STREAM - Stream the sound from disk rather than storing entirely in memory. Useful for music.
14 
15 The object returned by the resource manager is just a standard data source which means it can be plugged into any of
16 `ma_data_source_*()` APIs just like any other data source and it should just work.
17 
18 Internally, there's a background thread that's used to process jobs and enable asynchronicity. By default there is only
19 a single job thread, but this can be configured in the resource manager config. You can also implement your own threads
20 for processing jobs. That is more advanced, and beyond the scope of this example.
21 
22 When you initialize a resource manager you can specify the sample format, channels and sample rate to use when reading
23 data from the data source. This means the resource manager will ensure all sounds will have a standard format. When not
24 set, each sound will have their own formats and you'll need to do the necessary data conversion yourself.
25 */
26 #define MA_NO_ENGINE /* We're intentionally not using the ma_engine API here. */
27 #define MINIAUDIO_IMPLEMENTATION
28 #include "../../miniaudio.h"
29 #include "../miniaudio_engine.h"
30 
31 #ifdef __EMSCRIPTEN__
32 #include <emscripten.h>
33 
34 void main_loop__em(void* pUserData)
35 {
36  ma_resource_manager* pResourceManager = (ma_resource_manager*)pUserData;
37  MA_ASSERT(pResourceManager != NULL);
38 
39  /*
40  The Emscripten build does not support threading which means we need to process jobs manually. If
41  there are no jobs needing to be processed this will return immediately with MA_NO_DATA_AVAILABLE.
42  */
43  ma_resource_manager_process_next_job(pResourceManager);
44 }
45 #endif
46 
47 void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
48 {
49  ma_data_source_read_pcm_frames((ma_data_source*)pDevice->pUserData, pOutput, frameCount, NULL, MA_TRUE);
50 
51  (void)pInput;
52 }
53 
54 int main(int argc, char** argv)
55 {
56  ma_result result;
57  ma_device_config deviceConfig;
59  ma_resource_manager_config resourceManagerConfig;
60  ma_resource_manager resourceManager;
62 
63  if (argc < 2) {
64  printf("No input file.");
65  return -1;
66  }
67 
68 
69  /* We'll initialize the device first. */
71  deviceConfig.dataCallback = data_callback;
72  deviceConfig.pUserData = &dataSource; /* <-- We'll be reading from this in the data callback. */
73 
74  result = ma_device_init(NULL, &deviceConfig, &device);
75  if (result != MA_SUCCESS) {
76  printf("Failed to initialize device.");
77  return -1;
78  }
79 
80 
81  /*
82  We have the device so now we want to initialize the resource manager. We'll use the resource manager to load a
83  sound based on the command line.
84  */
85  resourceManagerConfig = ma_resource_manager_config_init();
86  resourceManagerConfig.decodedFormat = device.playback.format;
87  resourceManagerConfig.decodedChannels = device.playback.channels;
88  resourceManagerConfig.decodedSampleRate = device.sampleRate;
89 
90  /*
91  We're not supporting threading with Emscripten so go ahead and disable threading. It's important
92  that we set the appropriate flag and also the job thread count to 0.
93  */
94 #ifdef __EMSCRIPTEN__
95  resourceManagerConfig.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING;
96  resourceManagerConfig.jobThreadCount = 0;
97 #endif
98 
99  result = ma_resource_manager_init(&resourceManagerConfig, &resourceManager);
100  if (result != MA_SUCCESS) {
102  printf("Failed to initialize the resource manager.");
103  return -1;
104  }
105 
106  /* Now that we have a resource manager we can load a sound. */
108  &resourceManager,
109  argv[1],
111  NULL, /* Async notification. */
112  &dataSource);
113  if (result != MA_SUCCESS) {
114  printf("Failed to load sound \"%s\".", argv[1]);
115  return -1;
116  }
117 
118 
119  /* Now that we have a sound we can start the device. */
120  result = ma_device_start(&device);
121  if (result != MA_SUCCESS) {
123  printf("Failed to start device.");
124  return -1;
125  }
126 
127 #ifdef __EMSCRIPTEN__
128  emscripten_set_main_loop_arg(main_loop__em, &resourceManager, 0, 1);
129 #else
130  printf("Press Enter to quit...\n");
131  getchar();
132 #endif
133 
134  /* Teardown. */
135 
136  /* Uninitialize the device first to ensure the data callback is stopped and doesn't try to access any data. */
138 
139  /*
140  Before uninitializing the resource manager we need to uninitialize every data source. The data source is owned by
141  the caller which means you're responsible for uninitializing it.
142  */
144 
145  /* Uninitialize the resource manager after each data source. */
146  ma_resource_manager_uninit(&resourceManager);
147 
148  return 0;
149 }
ma_resource_manager_config::decodedChannels
ma_uint32 decodedChannels
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1516
ma_resource_manager_config::decodedSampleRate
ma_uint32 decodedSampleRate
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1517
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_resource_manager_data_source_init
MA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager *pResourceManager, const char *pName, ma_uint32 flags, const ma_pipeline_notifications *pNotifications, ma_resource_manager_data_source *pDataSource)
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
ma_device::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3626
ma_data_source_read_pcm_frames
MA_API ma_result ma_data_source_read_pcm_frames(ma_data_source *pDataSource, void *pFramesOut, ma_uint64 frameCount, ma_uint64 *pFramesRead, ma_bool32 loop)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:37348
ma_data_source
void ma_data_source
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.h:4500
ma_device::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3625
ma_device_type_playback
@ ma_device_type_playback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3012
ma_resource_manager_data_source_uninit
MA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data_source *pDataSource)
ma_resource_manager_config::flags
ma_uint32 flags
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1519
MA_DATA_SOURCE_FLAG_ASYNC
#define MA_DATA_SOURCE_FLAG_ASYNC
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1123
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
device
ma_device device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_resource_manager_uninit
MA_API void ma_resource_manager_uninit(ma_resource_manager *pResourceManager)
ma_resource_manager_process_next_job
MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager *pResourceManager)
ma_resource_manager_init
MA_API ma_result ma_resource_manager_init(const ma_resource_manager_config *pConfig, ma_resource_manager *pResourceManager)
ma_resource_manager_config::jobThreadCount
ma_uint32 jobThreadCount
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1518
MA_RESOURCE_MANAGER_FLAG_NO_THREADING
#define MA_RESOURCE_MANAGER_FLAG_NO_THREADING
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1396
ma_resource_manager_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1511
ma_device::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3592
MA_DATA_SOURCE_FLAG_DECODE
#define MA_DATA_SOURCE_FLAG_DECODE
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1122
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
data_callback
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount)
Definition: pvrecorder/src/miniaudio/research/_examples/resource_manager.c:47
ma_resource_manager
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1528
ma_resource_manager_config_init
MA_API ma_resource_manager_config ma_resource_manager_config_init(void)
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
MA_DATA_SOURCE_FLAG_STREAM
#define MA_DATA_SOURCE_FLAG_STREAM
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1121
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_resource_manager_config::decodedFormat
ma_format decodedFormat
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1515
ma_resource_manager_data_source
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1498
python.test_porcupine.argv
argv
Definition: test_porcupine.py:158
ma_device_init
ma_result ma_device_init(ma_context *pContext, const ma_device_config *pConfig, ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27048
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::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3588
MA_TRUE
#define MA_TRUE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1530
MA_SUCCESS
#define MA_SUCCESS
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1659
ma_device::playback
struct ma_device::@115 playback
ma_device_config::pUserData
void * pUserData
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3112
main
int main(int argc, char **argv)
Definition: pvrecorder/src/miniaudio/research/_examples/resource_manager.c:54


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