App-MHFS
view release on metacpan or search on metacpan
share/public_html/static/music_worklet_inprogress/decoder/src/mhfs_cl_track.h view on Meta::CPAN
return retval;
}
mhfs_cl_track_io_error_update(&ioError, retval, temprd.needed_offset);
}
// try loading via ma_decoder
const mhfs_cl_error retval = mhfs_cl_track_load_metadata_ma_decoder(pTrack, &temprd, on_metablock, context);
if(retval == MHFS_CL_SUCCESS)
{
return retval;
}
mhfs_cl_track_io_error_update(&ioError, retval, temprd.needed_offset);
}
pTrack->decoderConfig.encodingFormat = encFmt;
if(ioError.initialized)
{
pReturnData->needed_offset = ioError.neededOffset;
return ioError.res;
}
return MHFS_CL_ERROR;
}
mhfs_cl_error mhfs_cl_track_read_pcm_frames_f32(mhfs_cl_track *pTrack, const uint32_t desired_pcm_frames, float32_t *outFloat, mhfs_cl_track_return_data *pReturnData)
{
mhfs_cl_track_return_data rd;
if(pReturnData == NULL) pReturnData = &rd;
mhfs_cl_error retval = MHFS_CL_SUCCESS;
// initialize the decoder if necessary
if(!pTrack->meta_initialized)
{
MHFSCLTR_PRINT("metadata is somehow not initialized\n");
return MHFS_CL_ERROR;
}
if(!pTrack->dec_initialized)
{
retval = mhfs_cl_track_open_ma_decoder(pTrack, &pReturnData->needed_offset);
if(retval != MHFS_CL_SUCCESS) return retval;
}
// seek to sample
MHFSCLTR_PRINT("seek to %u d_pcmframes %u\n", pTrack->currentFrame, desired_pcm_frames);
const uint32_t currentPCMFrame32 = 0xFFFFFFFF;
mhfs_cl_track_blockvf_ma_decoder_call_before(pTrack, true);
const ma_result seekRes = ma_decoder_seek_to_pcm_frame(&pTrack->decoder, pTrack->currentFrame);
const mhfs_cl_error seekBlockRes = mhfs_cl_track_blockvf_ma_decoder_call_after(pTrack, true, &pReturnData->needed_offset);
if(seekBlockRes != MHFS_CL_SUCCESS)
{
MHFSCLTR_PRINT("%s: failed seek_to_pcm_frame NOT OK current: %u desired: %u\n", __func__, currentPCMFrame32, pTrack->currentFrame);
return seekBlockRes;
}
if(seekRes != MA_SUCCESS)
{
MHFSCLTR_PRINT("%s: seek failed current: %u desired: %u ma_result %d\n", __func__, currentPCMFrame32, pTrack->currentFrame, seekRes);
retval = MHFS_CL_ERROR;
goto mhfs_cl_track_read_pcm_frames_f32_FAIL;
}
// finally read
uint64_t frames_decoded = 0;
if(desired_pcm_frames != 0)
{
uint64_t toread = desired_pcm_frames;
// decode to pcm
mhfs_cl_track_blockvf_ma_decoder_call_before(pTrack, true);
ma_result decRes = ma_decoder_read_pcm_frames(&pTrack->decoder, outFloat, toread, &frames_decoded);
const mhfs_cl_error decBlockRes = mhfs_cl_track_blockvf_ma_decoder_call_after(pTrack, true, &pReturnData->needed_offset);
if(decBlockRes != MHFS_CL_SUCCESS)
{
MHFSCLTR_PRINT("mhfs_cl_track_read_pcm_frames_f32_mem: failed read_pcm_frames_f32\n");
return decBlockRes;
}
if(decRes != MA_SUCCESS)
{
MHFSCLTR_PRINT("mhfs_cl_track_read_pcm_frames_f32_mem: failed read_pcm_frames_f32(decode), ma_result %d\n", decRes);
retval = MHFS_CL_ERROR;
if(decRes == MA_AT_END)
{
MHFSCLTR_PRINT("MA_AT_END\n"); // not a real error
}
goto mhfs_cl_track_read_pcm_frames_f32_FAIL;
}
if(frames_decoded != desired_pcm_frames)
{
MHFSCLTR_PRINT("mhfs_cl_track_read_pcm_frames_f32_mem: expected %u decoded %"PRIu64"\n", desired_pcm_frames, frames_decoded);
}
pTrack->currentFrame += frames_decoded;
}
MHFSCLTR_PRINT("returning from pTrack->currentFrame: %u, totalFrames %"PRIu64" frames_decoded %"PRIu64" desired %u\n", pTrack->currentFrame, pTrack->meta.totalPCMFrameCount, frames_decoded, desired_pcm_frames);
pReturnData->frames_read = frames_decoded;
return MHFS_CL_SUCCESS;
mhfs_cl_track_read_pcm_frames_f32_FAIL:
if(pTrack->dec_initialized)
{
ma_decoder_uninit(&pTrack->decoder);
pTrack->dec_initialized = false;
}
return retval;
}
#endif /* mhfs_cl_track_c */
#endif /* MHFSCLTRACK_IMPLEMENTATION */
( run in 0.876 second using v1.01-cache-2.11-cpan-d7f47b0818f )