mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 00:06:59 +02:00
Resampler: Add back support for passing in NULL for the input/output.
This commit is contained in:
+150
-3
@@ -2995,8 +2995,7 @@ De-interleaved processing is not supported. To process frames, use
|
|||||||
`ma_resampler_process_pcm_frames()`. On input, this function takes the number of output frames you
|
`ma_resampler_process_pcm_frames()`. On input, this function takes the number of output frames you
|
||||||
can fit in the output buffer and the number of input frames contained in the input buffer. On
|
can fit in the output buffer and the number of input frames contained in the input buffer. On
|
||||||
output these variables contain the number of output frames that were written to the output buffer
|
output these variables contain the number of output frames that were written to the output buffer
|
||||||
and the number of input frames that were consumed in the process. You cannot pass in NULL for the
|
and the number of input frames that were consumed in the process.
|
||||||
input buffer or output buffer.
|
|
||||||
|
|
||||||
The sample rate can be changed dynamically on the fly. You can change this with explicit sample
|
The sample rate can be changed dynamically on the fly. You can change this with explicit sample
|
||||||
rates with `ma_resampler_set_rate()` and also with a decimal ratio with
|
rates with `ma_resampler_set_rate()` and also with a decimal ratio with
|
||||||
@@ -62653,13 +62652,152 @@ MA_API void ma_resampler_uninit(ma_resampler* pResampler, const ma_allocation_ca
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ma_result ma_resampler_process_pcm_frames_no_input_output(ma_resampler* pResampler, ma_uint64* pFrameCountIn, ma_uint64* pFrameCountOut)
|
||||||
|
{
|
||||||
|
ma_uint32 bpf = ma_get_bytes_per_frame(pResampler->format, pResampler->channels);
|
||||||
|
ma_uint8 framesIn[4096];
|
||||||
|
ma_uint64 framesInCap = sizeof(framesIn) / bpf;
|
||||||
|
ma_uint8 framesOut[4096];
|
||||||
|
ma_uint64 framesOutCap = sizeof(framesOut) / bpf;
|
||||||
|
ma_uint64 totalFramesProcessedIn;
|
||||||
|
ma_uint64 totalFramesProcessedOut;
|
||||||
|
ma_uint64 frameCountIn;
|
||||||
|
ma_uint64 frameCountOut;
|
||||||
|
|
||||||
|
totalFramesProcessedIn = 0;
|
||||||
|
totalFramesProcessedOut = 0;
|
||||||
|
|
||||||
|
while (totalFramesProcessedIn < frameCountIn && totalFramesProcessedOut < frameCountOut) {
|
||||||
|
ma_result result;
|
||||||
|
ma_uint64 framesProcessedIn;
|
||||||
|
ma_uint64 framesProcessedOut;
|
||||||
|
|
||||||
|
framesProcessedIn = frameCountIn - totalFramesProcessedIn;
|
||||||
|
if (framesProcessedIn > framesInCap) {
|
||||||
|
framesProcessedIn = framesInCap;
|
||||||
|
}
|
||||||
|
|
||||||
|
framesProcessedOut = frameCountOut - totalFramesProcessedOut;
|
||||||
|
if (framesProcessedOut > framesOutCap) {
|
||||||
|
framesProcessedOut = framesOutCap;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, framesIn, &framesProcessedIn, framesOut, &framesProcessedOut);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalFramesProcessedIn += framesProcessedIn;
|
||||||
|
totalFramesProcessedOut += framesProcessedOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pFrameCountIn = totalFramesProcessedIn;
|
||||||
|
*pFrameCountOut = totalFramesProcessedOut;
|
||||||
|
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ma_result ma_resampler_process_pcm_frames_no_input(ma_resampler* pResampler, ma_uint64* pFrameCountIn, const void* pFramesOut, ma_uint64* pFrameCountOut)
|
||||||
|
{
|
||||||
|
ma_uint32 bpf = ma_get_bytes_per_frame(pResampler->format, pResampler->channels);
|
||||||
|
ma_uint8 framesIn[4096];
|
||||||
|
ma_uint64 framesInCap = sizeof(framesIn) / bpf;
|
||||||
|
ma_uint64 totalFramesProcessedIn;
|
||||||
|
ma_uint64 totalFramesProcessedOut;
|
||||||
|
ma_uint64 frameCountIn;
|
||||||
|
ma_uint64 frameCountOut;
|
||||||
|
|
||||||
|
if (pFramesOut == NULL) {
|
||||||
|
return ma_resampler_process_pcm_frames_no_input_output(pResampler, pFrameCountIn, pFrameCountOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
frameCountIn = *pFrameCountIn;
|
||||||
|
frameCountOut = *pFrameCountOut;
|
||||||
|
|
||||||
|
/* The input needs to be treated as silence. */
|
||||||
|
MA_ZERO_MEMORY(framesIn, sizeof(framesIn));
|
||||||
|
|
||||||
|
totalFramesProcessedIn = 0;
|
||||||
|
totalFramesProcessedOut = 0;
|
||||||
|
|
||||||
|
while (totalFramesProcessedIn < frameCountIn && totalFramesProcessedOut < frameCountOut) {
|
||||||
|
ma_result result;
|
||||||
|
ma_uint64 framesProcessedIn;
|
||||||
|
ma_uint64 framesProcessedOut;
|
||||||
|
|
||||||
|
framesProcessedIn = frameCountIn - totalFramesProcessedIn;
|
||||||
|
if (framesProcessedIn > framesInCap) {
|
||||||
|
framesProcessedIn = framesInCap;
|
||||||
|
}
|
||||||
|
|
||||||
|
framesProcessedOut = frameCountOut - totalFramesProcessedOut;
|
||||||
|
|
||||||
|
result = pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, framesIn, &framesProcessedIn, ma_offset_ptr(pFramesOut, totalFramesProcessedOut * bpf), &framesProcessedOut);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalFramesProcessedIn += framesProcessedIn;
|
||||||
|
totalFramesProcessedOut += framesProcessedOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pFrameCountIn = totalFramesProcessedIn;
|
||||||
|
*pFrameCountOut = totalFramesProcessedOut;
|
||||||
|
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ma_result ma_resampler_process_pcm_frames_no_output(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, ma_uint64* pFrameCountOut)
|
||||||
|
{
|
||||||
|
ma_uint32 bpf = ma_get_bytes_per_frame(pResampler->format, pResampler->channels);
|
||||||
|
ma_uint8 framesOut[4096];
|
||||||
|
ma_uint64 framesOutCap = sizeof(framesOut) / bpf;
|
||||||
|
ma_uint64 totalFramesProcessedIn;
|
||||||
|
ma_uint64 totalFramesProcessedOut;
|
||||||
|
ma_uint64 frameCountIn;
|
||||||
|
ma_uint64 frameCountOut;
|
||||||
|
|
||||||
|
if (pFramesIn == NULL) {
|
||||||
|
return ma_resampler_process_pcm_frames_no_input_output(pResampler, pFrameCountIn, pFrameCountOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
totalFramesProcessedIn = 0;
|
||||||
|
totalFramesProcessedOut = 0;
|
||||||
|
|
||||||
|
while (totalFramesProcessedIn < frameCountIn && totalFramesProcessedOut < frameCountOut) {
|
||||||
|
ma_result result;
|
||||||
|
ma_uint64 framesProcessedIn;
|
||||||
|
ma_uint64 framesProcessedOut;
|
||||||
|
|
||||||
|
framesProcessedIn = frameCountIn - totalFramesProcessedIn;
|
||||||
|
|
||||||
|
framesProcessedOut = frameCountOut - totalFramesProcessedOut;
|
||||||
|
if (framesProcessedOut > framesOutCap) {
|
||||||
|
framesProcessedOut = framesOutCap;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, ma_offset_ptr(pFramesIn, totalFramesProcessedIn * bpf), &framesProcessedIn, framesOut, &framesProcessedOut);
|
||||||
|
if (result != MA_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
totalFramesProcessedIn += framesProcessedIn;
|
||||||
|
totalFramesProcessedOut += framesProcessedOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pFrameCountIn = totalFramesProcessedIn;
|
||||||
|
*pFrameCountOut = totalFramesProcessedOut;
|
||||||
|
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
MA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)
|
MA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)
|
||||||
{
|
{
|
||||||
if (pResampler == NULL) {
|
if (pResampler == NULL) {
|
||||||
return MA_INVALID_ARGS;
|
return MA_INVALID_ARGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFrameCountOut == NULL || pFramesOut == NULL || pFrameCountIn == NULL || pFramesIn == NULL) {
|
if (pFrameCountOut == NULL || pFrameCountIn == NULL) {
|
||||||
return MA_INVALID_ARGS;
|
return MA_INVALID_ARGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62667,6 +62805,14 @@ MA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const
|
|||||||
return MA_NOT_IMPLEMENTED;
|
return MA_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pFramesIn == NULL) {
|
||||||
|
return ma_resampler_process_pcm_frames_no_input(pResampler, pFrameCountIn, pFramesOut, pFrameCountOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pFramesOut == NULL) {
|
||||||
|
return ma_resampler_process_pcm_frames_no_output(pResampler, pFramesIn, pFrameCountIn, pFrameCountOut);
|
||||||
|
}
|
||||||
|
|
||||||
return pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);
|
return pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66521,6 +66667,7 @@ MA_API ma_uint64 ma_convert_frames_ex(void* pOut, ma_uint64 frameCountOut, const
|
|||||||
}
|
}
|
||||||
|
|
||||||
frameCountIn -= framesProcessedIn;
|
frameCountIn -= framesProcessedIn;
|
||||||
|
frameCountOut += framesProcessedOut;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user