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
MHFSCLTR_PRINT("%s: %zu failed to find\n", __func__, sz);
return NULL;
}
static inline void mhfs_cl_track_allocs_backup_or_restore(mhfs_cl_track *pTrack, const bool backup)
{
// copy ma_decoder and blockvf fileoffset
if(backup)
{
pTrack->backupDecoder = pTrack->decoder;
pTrack->backupFileOffset = pTrack->vf.fileoffset;
}
else
{
pTrack->decoder = pTrack->backupDecoder;
pTrack->vf.fileoffset = pTrack->backupFileOffset;
}
// copy the allocations
mhfs_cl_track_allocs *pAllocs = &pTrack->allocs;
for(unsigned i = 0; i < MHFS_CL_TRACK_MAX_ALLOCS; i++)
{
if(pAllocs->allocptrs[i] != NULL)
{
const size_t offset = ceil8(pAllocs->allocsizes[i]);
uint8_t *allocBuf = pAllocs->allocptrs[i];
const uint8_t *srcBuf;
uint8_t *destBuf;
if(backup)
{
srcBuf = allocBuf;
destBuf = allocBuf + offset;
}
else
{
srcBuf = allocBuf + offset;
destBuf = allocBuf;
}
memcpy(destBuf, srcBuf, pAllocs->allocsizes[i]);
}
}
}
static inline void mhfs_cl_track_allocs_backup(mhfs_cl_track *pTrack)
{
return mhfs_cl_track_allocs_backup_or_restore(pTrack, true);
}
static inline void mhfs_cl_track_allocs_restore(mhfs_cl_track *pTrack)
{
return mhfs_cl_track_allocs_backup_or_restore(pTrack, false);
}
void mhfs_cl_track_init(mhfs_cl_track *pTrack, const unsigned blocksize)
{
for(unsigned i = 0; i < MHFS_CL_TRACK_MAX_ALLOCS; i++)
{
pTrack->allocs.allocptrs[i] = NULL;
}
pTrack->decoderConfig = ma_decoder_config_init(ma_format_f32, 0, 0);
ma_allocation_callbacks cbs;
cbs.pUserData = pTrack;
cbs.onMalloc = &mhfs_cl_track_malloc;
cbs.onRealloc = &mhfs_cl_track_realloc;
cbs.onFree = &mhfs_cl_track_free;
pTrack->decoderConfig.allocationCallbacks = cbs;
pTrack->decoderConfig.encodingFormat = ma_encoding_format_unknown;
pTrack->dec_initialized = false;
blockvf_init(&pTrack->vf, blocksize);
pTrack->meta_initialized = false;
pTrack->currentFrame = 0;
}
void mhfs_cl_track_deinit(mhfs_cl_track *pTrack)
{
if(pTrack->dec_initialized) ma_decoder_uninit(&pTrack->decoder);
blockvf_deinit(&pTrack->vf);
}
void *mhfs_cl_track_add_block(mhfs_cl_track *pTrack, const uint32_t block_start, const unsigned filesize)
{
return blockvf_add_block(&pTrack->vf, block_start, filesize);
}
// mhfs_cl_track_read_pcm_frames_f32 will catch the error if we dont here
int mhfs_cl_track_seek_to_pcm_frame(mhfs_cl_track *pTrack, const uint32_t pcmFrameIndex)
{
if(pTrack->dec_initialized)
{
if(pcmFrameIndex >= pTrack->meta.totalPCMFrameCount)
{
// allow seeking to 0 always
if(pcmFrameIndex != 0)
{
return 0;
}
}
}
pTrack->currentFrame = pcmFrameIndex;
return 1;
}
double mhfs_cl_track_meta_audioinfo_durationInSecs(const mhfs_cl_track_meta_audioinfo *pInfo)
{
return (pInfo->sampleRate > 0) ? ((double)pInfo->totalPCMFrameCount / pInfo->sampleRate) : 0;
}
typedef enum {
DAF_FLAC,
DAF_MP3,
DAF_WAV,
DAF_PCM
} DecoderAudioFormats;
static inline void mhfs_cl_track_swap_tryorder(ma_encoding_format *first, ma_encoding_format *second)
{
ma_encoding_format temp = *first;
*first = *second;
*second = temp;
}
( run in 0.547 second using v1.01-cache-2.11-cpan-39bf76dae61 )