pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c
Go to the documentation of this file.
1 #define MINIAUDIO_IMPLEMENTATION
2 #include "../../../../miniaudio.h"
3 #include "../../../miniaudio_engine.h"
5 #include "../ma_channel_combiner_node/ma_channel_combiner_node.c"
6 
7 #include <stdio.h>
8 
9 #define DEVICE_FORMAT ma_format_f32 /* Must always be f32 for this example because the node graph system only works with this. */
10 #define DEVICE_CHANNELS 0 /* The input file will determine the channel count. */
11 #define DEVICE_SAMPLE_RATE 48000
12 
13 /*
14 In this example we're just separating out the channels with a `ma_channel_separator_node`, and then
15 combining them back together with a `ma_channel_combiner_node` before playing them back.
16 */
17 static ma_decoder g_decoder; /* The decoder that we'll read data from. */
18 static ma_data_source_node g_dataSupplyNode; /* The node that will sit at the root level. Will be reading data from g_dataSupply. */
19 static ma_channel_separator_node g_separatorNode; /* The separator node. */
20 static ma_channel_combiner_node g_combinerNode; /* The combiner node. */
21 static ma_node_graph g_nodeGraph; /* The main node graph that we'll be feeding data through. */
22 
23 void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)
24 {
25  (void)pInput;
26  (void)pDevice;
27 
28  /* All we need to do is read from the node graph. */
29  ma_node_graph_read_pcm_frames(&g_nodeGraph, pOutput, frameCount, NULL);
30 }
31 
32 int main(int argc, char** argv)
33 {
34  ma_result result;
35  ma_decoder_config decoderConfig;
36  ma_device_config deviceConfig;
38  ma_node_graph_config nodeGraphConfig;
39  ma_channel_separator_node_config separatorNodeConfig;
40  ma_channel_combiner_node_config combinerNodeConfig;
41  ma_data_source_node_config dataSupplyNodeConfig;
42  ma_uint32 iChannel;
43 
44  if (argc < 1) {
45  printf("No input file.\n");
46  return -1;
47  }
48 
49 
50  /* Decoder. */
52 
53  result = ma_decoder_init_file(argv[1], &decoderConfig, &g_decoder);
54  if (result != MA_SUCCESS) {
55  printf("Failed to load decoder.\n");
56  return -1;
57  }
58 
59 
60  /* Device. */
62  deviceConfig.playback.pDeviceID = NULL;
63  deviceConfig.playback.format = g_decoder.outputFormat;
65  deviceConfig.sampleRate = g_decoder.outputSampleRate;
66  deviceConfig.dataCallback = data_callback;
67  result = ma_device_init(NULL, &deviceConfig, &device);
68  if (result != MA_SUCCESS) {
69  return result;
70  }
71 
72 
73  /* Node graph. */
75 
76  result = ma_node_graph_init(&nodeGraphConfig, NULL, &g_nodeGraph);
77  if (result != MA_SUCCESS) {
78  printf("Failed to initialize node graph.");
79  goto done0;
80  }
81 
82 
83  /* Combiner. Attached straight to the endpoint. Input will be the separator node. */
85 
86  result = ma_channel_combiner_node_init(&g_nodeGraph, &combinerNodeConfig, NULL, &g_combinerNode);
87  if (result != MA_SUCCESS) {
88  printf("Failed to initialize channel combiner node.");
89  goto done1;
90  }
91 
93 
94 
95  /*
96  Separator. Attached to the combiner. We need to attach each of the outputs of the
97  separator to each of the inputs of the combiner.
98  */
100 
101  result = ma_channel_separator_node_init(&g_nodeGraph, &separatorNodeConfig, NULL, &g_separatorNode);
102  if (result != MA_SUCCESS) {
103  printf("Failed to initialize channel separator node.");
104  goto done2;
105  }
106 
107  /* The separator and combiner must have the same number of output and input buses respectively. */
109 
110  /* Each of the separator's outputs need to be attached to the corresponding input of the combiner. */
111  for (iChannel = 0; iChannel < ma_node_get_output_bus_count(&g_separatorNode); iChannel += 1) {
113  }
114 
115 
116 
117  /* Data supply. Attached to input bus 0 of the reverb node. */
118  dataSupplyNodeConfig = ma_data_source_node_config_init(&g_decoder, MA_FALSE);
119 
120  result = ma_data_source_node_init(&g_nodeGraph, &dataSupplyNodeConfig, NULL, &g_dataSupplyNode);
121  if (result != MA_SUCCESS) {
122  printf("Failed to initialize source node.");
123  goto done3;
124  }
125 
127 
128 
129 
130  /* Now we just start the device and wait for the user to terminate the program. */
132 
133  printf("Press Enter to quit...\n");
134  getchar();
135 
136  /* It's important that we stop the device first or else we'll uninitialize the graph from under the device. */
138 
139 
144 done0: ma_device_uninit(&device);
145 
146  (void)argc;
147  (void)argv;
148 
149  return 0;
150 }
ma_device_config::pDeviceID
ma_device_id * pDeviceID
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3127
ma_channel_combiner_node
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_combiner_node/ma_channel_combiner_node.h:18
MA_FALSE
#define MA_FALSE
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1531
g_combinerNode
static ma_channel_combiner_node g_combinerNode
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:20
ma_data_source_node_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/miniaudio_engine.h:1073
ma_channel_separator_node_uninit
MA_API void ma_channel_separator_node_uninit(ma_channel_separator_node *pSeparatorNode, const ma_allocation_callbacks *pAllocationCallbacks)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node.c:77
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_channel_separator_node_init
MA_API ma_result ma_channel_separator_node_init(ma_node_graph *pNodeGraph, const ma_channel_separator_node_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_channel_separator_node *pSeparatorNode)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node.c:34
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_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
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)
ma_device_stop
ma_result ma_device_stop(ma_device *pDevice)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:27544
ma_channel_separator_node_config_init
MA_API ma_channel_separator_node_config ma_channel_separator_node_config_init(ma_uint32 channels)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node.c:4
ma_channel_combiner_node_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_combiner_node/ma_channel_combiner_node.h:9
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
main
int main(int argc, char **argv)
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:32
ma_device_config::dataCallback
ma_device_callback_proc dataCallback
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3110
ma_channel_separator_node
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node.h:18
ma_channel_separator_node_config
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node.h:9
ma_node_graph_config_init
MA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels)
ma_decoder::outputFormat
ma_format outputFormat
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5203
device
ma_device device
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/tests/test_deviceio/ma_test_deviceio.c:57
DEVICE_FORMAT
#define DEVICE_FORMAT
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:9
ma_node_get_input_bus_count
MA_API ma_uint32 ma_node_get_input_bus_count(const ma_node *pNode)
DEVICE_SAMPLE_RATE
#define DEVICE_SAMPLE_RATE
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:11
g_decoder
static ma_decoder g_decoder
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:17
ma_result
int ma_result
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:1658
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_channel_combiner_node_init
MA_API ma_result ma_channel_combiner_node_init(ma_node_graph *pNodeGraph, const ma_channel_combiner_node_config *pConfig, const ma_allocation_callbacks *pAllocationCallbacks, ma_channel_combiner_node *pCombinerNode)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_combiner_node/ma_channel_combiner_node.c:34
g_separatorNode
static ma_channel_separator_node g_separatorNode
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:19
ma_decoder
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5193
g_dataSupplyNode
static ma_data_source_node g_dataSupplyNode
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:18
MA_ASSERT
#define MA_ASSERT(condition)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/extras/miniaudio_split/miniaudio.c:770
ma_node_graph_get_endpoint
MA_API ma_node * ma_node_graph_get_endpoint(ma_node_graph *pNodeGraph)
data_callback
void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uint32 frameCount)
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:23
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
ma_channel_separator_node.c
ma_channel_combiner_node_uninit
MA_API void ma_channel_combiner_node_uninit(ma_channel_combiner_node *pCombinerNode, const ma_allocation_callbacks *pAllocationCallbacks)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_combiner_node/ma_channel_combiner_node.c:73
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)
ma_device_config::channels
ma_uint32 channels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:3129
ma_decoder::outputChannels
ma_uint32 outputChannels
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5204
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_node_get_output_bus_count
MA_API ma_uint32 ma_node_get_output_bus_count(const ma_node *pNode)
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_channel_combiner_node_config_init
MA_API ma_channel_combiner_node_config ma_channel_combiner_node_config_init(ma_uint32 channels)
Definition: porcupine/demo/c/pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_combiner_node/ma_channel_combiner_node.c:4
ma_node_graph_uninit
MA_API void ma_node_graph_uninit(ma_node_graph *pNodeGraph, const ma_allocation_callbacks *pAllocationCallbacks)
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_decoder::outputSampleRate
ma_uint32 outputSampleRate
Definition: porcupine/demo/c/dr_libs/tests/external/miniaudio/miniaudio.h:5205
g_nodeGraph
static ma_node_graph g_nodeGraph
Definition: pvrecorder/src/miniaudio/research/_extras/nodes/ma_channel_separator_node/ma_channel_separator_node_example.c:21


picovoice_driver
Author(s):
autogenerated on Fri Apr 1 2022 02:13:56