porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c
Go to the documentation of this file.
1 #define MINIAUDIO_IMPLEMENTATION
2 #include "../miniaudio.h"
3 #include "miniaudio_engine.h"
4 
8 ma_splitter_node g_loopNode; /* For testing loop detection. We're going to route one of these endpoints back to g_splitterNode to form a loop. */
9 
10 void data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)
11 {
12  /* Read straight from our node graph. */
13  ma_node_graph_read_pcm_frames(&g_nodeGraph, pFramesOut, frameCount, NULL);
14 
15  (void)pDevice; /* Unused. */
16  (void)pFramesIn; /* Unused. */
17 }
18 
19 int main(int argc, char** argv)
20 {
21  ma_result result;
22  ma_device_config deviceConfig;
24  ma_decoder_config decoderConfig;
26  ma_node_graph_config nodeGraphConfig;
27  ma_data_source_node_config dataSourceNodeConfig;
28  ma_splitter_node_config splitterNodeConfig;
29 
30  if (argc <= 1) {
31  printf("No input file.");
32  return -1;
33  }
34 
36  deviceConfig.playback.format = ma_format_f32; /* The node graph API only supports f32. */
37  deviceConfig.playback.channels = 2;
38  deviceConfig.sampleRate = 48000;
39  deviceConfig.dataCallback = data_callback;
40  deviceConfig.pUserData = NULL;
41 
42  result = ma_device_init(NULL, &deviceConfig, &device);
43  if (result != MA_SUCCESS) {
44  printf("Failed to initialize device.");
45  return -1;
46  }
47 
48 
49  /*
50  Set up the new graph before starting the device so that we have something to read from as soon
51  as the device requests data. It doesn't matter what order we do this, but I'm starting with the
52  data source node since it makes more logical sense to me to start with the start of the chain.
53  */
55 
56  result = ma_node_graph_init(&nodeGraphConfig, NULL, &g_nodeGraph);
57  if (result != MA_SUCCESS) {
58  printf("Failed to initialize node graph.");
59  return -1;
60  }
61 
62 
63  /*
64  We want the decoder to use the same format as the device. This way we can keep the entire node
65  graph using the same format/channels/rate to avoid the need to do data conversion.
66  */
68 
69  result = ma_decoder_init_file(argv[1], &decoderConfig, &decoder);
70  if (result != MA_SUCCESS) {
71  printf("Failed to initialize decoder.");
73  return -1;
74  }
75 
76  dataSourceNodeConfig = ma_data_source_node_config_init(&decoder, MA_TRUE);
77 
78  result = ma_data_source_node_init(&g_nodeGraph, &dataSourceNodeConfig, NULL, &g_dataSourceNode);
79  if (result != MA_SUCCESS) {
80  printf("Failed to initialize data source node.");
83  return -1;
84  }
85 
86  /*result = ma_node_attach_output_bus(&g_dataSourceNode, 0, ma_node_graph_get_endpoint(&g_nodeGraph), 0);
87  if (result != MA_SUCCESS) {
88  printf("Failed to attach node.");
89  return -1;
90  }*/
91 
92  /*ma_node_set_state_time(&g_dataSourceNode, ma_node_state_started, 48000*1);
93  ma_node_set_state_time(&g_dataSourceNode, ma_node_state_stopped, 48000*5);*/
94 
95 
96 #if 1
97  /*
98  Splitter node. Note that we've already attached the data source node to another, so this section
99  will test that changing of attachments works as expected.
100  */
102 
103 
104 
105  /* Loop detection testing. */
106  result = ma_splitter_node_init(&g_nodeGraph, &splitterNodeConfig, NULL, &g_loopNode);
107  if (result != MA_SUCCESS) {
108  printf("Failed to initialize loop node.");
109  return -1;
110  }
111 
112  /* Adjust the volume of the splitter node's endpoints. We'll just do it 50/50 so that both of them combine to reproduce the original signal at the endpoint. */
115 
116 
117 
118 
119  result = ma_splitter_node_init(&g_nodeGraph, &splitterNodeConfig, NULL, &g_splitterNode);
120  if (result != MA_SUCCESS) {
121  printf("Failed to initialize splitter node.");
122  return -1;
123  }
124 
125 
126 #if 0
127  /* Connect both outputs of the splitter to the endpoint for now. Later on we'll test effects and whatnot. */
130 
131  /* Adjust the volume of the splitter node's endpoints. We'll just do it 50/50 so that both of them combine to reproduce the original signal at the endpoint. */
134 
135  /* The data source needs to have it's connection changed from the endpoint to the splitter. */
137 #else
138  /* Connect the loop node directly to the output. */
141 
142  /* Connect the splitter node directly to the loop node. */
145 
146  /* Connect the data source node to the splitter node. */
148 
149  /* Now loop back to the splitter node to form a loop. */
151 #endif
152 
153 
154 #endif
155 
156 
157 
158 
159  /* Stop the splitter node for testing. */
160  /*ma_node_set_state(&g_splitterNode, ma_node_state_stopped);*/
161 
162 
163  /*
164  Only start the device after our nodes have been set up. We passed in `deviceNode` as the user
165  data to the data callback so we need to make sure it's initialized before we start the device.
166  */
167  result = ma_device_start(&device);
168  if (result != MA_SUCCESS) {
170  return -1;
171  }
172 
173  printf("Press Enter to quit...");
174  getchar();
175 
176 
177  /* Teardown. These are uninitialized in a weird order here just for demonstration. */
178 
179  /* We should be able to safely destroy the node while the device is still running. */
181 
182  /* The device needs to be stopped before we uninitialize the node graph or else the device's callback will try referencing the node graph. */
184 
185  /* The node graph will be referenced by the device's data called so it needs to be uninitialized after the device has stopped. */
187 
188  return 0;
189 }
g_loopNode
ma_splitter_node g_loopNode
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:8
ma_data_source_node_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1073
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
NULL
#define NULL
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/extras/speex_resampler/thirdparty/resample.c:92
ma_splitter_node
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1105
ma_decoder_uninit
ma_result ma_decoder_uninit(ma_decoder *pDecoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:44739
ma_decoder_config
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5170
ma_device::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3626
ma_format_f32
@ ma_format_f32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1790
ma_splitter_node_init
MA_API ma_result ma_splitter_node_init(ma_node_graph *pNodeGraph, const ma_splitter_node_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_splitter_node *pSplitterNode)
ma_decoder_config_init
ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:40646
main
int main(int argc, char **argv)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:19
ma_node_graph_read_pcm_frames
MA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph *pNodeGraph, void *pFramesOut, ma_uint32 frameCount, ma_uint32 *pFramesRead)
decoder
ma_decoder decoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:61
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_node_graph_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1045
g_dataSourceNode
ma_data_source_node g_dataSourceNode
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:6
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
ma_splitter_node_config_init
MA_API ma_splitter_node_config ma_splitter_node_config_init(ma_uint32 channels)
ma_node_graph_config_init
MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels)
device
ma_device device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
f
f
g_splitterNode
ma_splitter_node g_splitterNode
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:7
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
ma_node_set_output_bus_volume
MA_API ma_result ma_node_set_output_bus_volume(ma_node *pNode, ma_uint32 outputBusIndex, float volume)
ma_splitter_node_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1097
data_callback
void data_callback(ma_device *pDevice, void *pFramesOut, const void *pFramesIn, ma_uint32 frameCount)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:10
ma_data_source_node_config_init
MA_API ma_data_source_node_config ma_data_source_node_config_init(ma_data_source *pDataSource, ma_bool32 looping)
ma_decoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5193
ma_node_graph_get_endpoint
MA_API ma_node * ma_node_graph_get_endpoint(ma_node_graph *pNodeGraph)
ma_node_graph_init
MA_API ma_result ma_node_graph_init(const ma_node_graph_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_node_graph *pNodeGraph)
ma_uint32
uint32_t ma_uint32
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1503
g_nodeGraph
ma_node_graph g_nodeGraph
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_routing.c:5
ma_device_config::format
ma_format format
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3128
ma_data_source_node_init
MA_API ma_result ma_data_source_node_init(ma_node_graph *pNodeGraph, const ma_data_source_node_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_data_source_node *pDataSourceNode)
ma_data_source_node_uninit
MA_API void ma_data_source_node_uninit(ma_data_source_node *pDataSourceNode, const ma_allocation_callbacks *pAllocationCallbacks)
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_node_attach_output_bus
MA_API ma_result ma_node_attach_output_bus(ma_node *pNode, ma_uint32 outputBusIndex, ma_node *pOtherNode, ma_uint32 otherNodeInputBusIndex)
miniaudio_engine.h
ma_device_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3129
ma_decoder_init_file
ma_result ma_decoder_init_file(const char *pFilePath, const ma_decoder_config *pConfig, ma_decoder *pDecoder)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:44687
ma_node_graph
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1053
ma_data_source_node
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1083
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_config::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3103
ma_device::sampleRate
ma_uint32 sampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3588
ma_node_graph_uninit
MA_API void ma_node_graph_uninit(ma_node_graph *pNodeGraph, const ma_allocation_callbacks *pAllocationCallbacks)
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_config::playback
struct ma_device_config::@97 playback
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


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