mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 16:54:03 +02:00
Update the hilo_interop example to use the new ring buffer.
This commit is contained in:
+7
-39
@@ -17,43 +17,18 @@ may be updated to make use of a more advanced data source that handles all of th
|
|||||||
*/
|
*/
|
||||||
#include "../miniaudio.c"
|
#include "../miniaudio.c"
|
||||||
|
|
||||||
static ma_pcm_rb rb;
|
static ma_audio_ring_buffer rb;
|
||||||
static ma_device device;
|
static ma_device device;
|
||||||
static ma_engine engine;
|
static ma_engine engine;
|
||||||
static ma_sound sound; /* The sound will be the playback of the capture side. */
|
static ma_sound sound; /* The sound will be the playback of the capture side. */
|
||||||
|
|
||||||
void capture_data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)
|
void capture_data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)
|
||||||
{
|
{
|
||||||
ma_result result;
|
|
||||||
ma_uint32 framesWritten;
|
|
||||||
|
|
||||||
(void)pFramesOut;
|
(void)pFramesOut;
|
||||||
|
(void)pDevice;
|
||||||
|
|
||||||
/* We need to write to the ring buffer. Need to do this in a loop. */
|
/* We need to write to the ring buffer. */
|
||||||
framesWritten = 0;
|
ma_audio_ring_buffer_write_pcm_frames(&rb, pFramesIn, frameCount, NULL);
|
||||||
while (framesWritten < frameCount) {
|
|
||||||
void* pMappedBuffer;
|
|
||||||
ma_uint32 framesToWrite = frameCount - framesWritten;
|
|
||||||
|
|
||||||
result = ma_pcm_rb_acquire_write(&rb, &framesToWrite, &pMappedBuffer);
|
|
||||||
if (result != MA_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (framesToWrite == 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the data from the capture buffer to the ring buffer. */
|
|
||||||
ma_copy_pcm_frames(pMappedBuffer, ma_offset_pcm_frames_const_ptr_f32((const float*)pFramesIn, framesWritten, pDevice->capture.channels), framesToWrite, pDevice->capture.format, pDevice->capture.channels);
|
|
||||||
|
|
||||||
result = ma_pcm_rb_commit_write(&rb, framesToWrite);
|
|
||||||
if (result != MA_SUCCESS) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
framesWritten += framesToWrite;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
@@ -83,20 +58,13 @@ int main(int argc, char** argv)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the ring buffer. */
|
/* Initialize the ring buffer. Make sure the sample rate is set so the engine can resample it if necessary. */
|
||||||
result = ma_pcm_rb_init(device.capture.format, device.capture.channels, device.capture.internalPeriodSizeInFrames * 5, NULL, NULL, &rb);
|
result = ma_audio_ring_buffer_init(device.capture.format, device.capture.channels, device.sampleRate, device.capture.internalPeriodSizeInFrames * 3, NULL, &rb);
|
||||||
if (result != MA_SUCCESS) {
|
if (result != MA_SUCCESS) {
|
||||||
printf("Failed to initialize the ring buffer.");
|
printf("Failed to initialize the ring buffer.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Ring buffers don't require a sample rate for their normal operation, but we can associate it
|
|
||||||
with a sample rate. We'll want to do this so the engine can resample if necessary.
|
|
||||||
*/
|
|
||||||
ma_pcm_rb_set_sample_rate(&rb, device.sampleRate);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
At this point the capture side is set up and we can now set up the playback side. Here we are
|
At this point the capture side is set up and we can now set up the playback side. Here we are
|
||||||
@@ -137,7 +105,7 @@ int main(int argc, char** argv)
|
|||||||
ma_sound_uninit(&sound);
|
ma_sound_uninit(&sound);
|
||||||
ma_engine_uninit(&engine);
|
ma_engine_uninit(&engine);
|
||||||
ma_device_uninit(&device);
|
ma_device_uninit(&device);
|
||||||
ma_pcm_rb_uninit(&rb);
|
ma_audio_ring_buffer_uninit(&rb);
|
||||||
|
|
||||||
|
|
||||||
(void)argc;
|
(void)argc;
|
||||||
|
|||||||
Reference in New Issue
Block a user