/*---------------------------------------------------------------------- | AP4_LinearReader::EnableTrack +---------------------------------------------------------------------*/ AP4_Result AP4_LinearReader::EnableTrack(AP4_UI32 track_id) { // check if we don't already have this if (FindTracker(track_id)) return AP4_SUCCESS; // find the track in the movie AP4_Track* track = m_Movie.GetTrack(track_id); if (track == NULL) return AP4_ERROR_NO_SUCH_ITEM; // process this track return ProcessTrack(track); }
//buf = HMP image, br = HMP image size, out_size = output MIDI image size extern "C" void* load_hmp(BYTE* buf,DWORD br,DWORD* out_size) { MIDIHEADER mhd = {1,0,0xC0}; BYTE * max = buf+br; BYTE* ptr = buf; CWriteBuf* dst=wb_create(); DWORD n1,n2; dst->writedword(_rv('MThd')); dst->writedword(_rv(6)); dst->write(0,sizeof(mhd)); ptr = buf+0x30; mhd.trax = *ptr; dst->write(hmp_track0,sizeof(hmp_track0)); while(*(WORD*)ptr != 0x2FFF && ptr < max - 4-7) ptr++; ptr+=7; if (ptr == max-4) { dst->freebuf(); delete dst; return 0; } UINT n; for(n=1;n<mhd.trax;n++) { dst->writedword(_rv('MTrk')); n1 = *(DWORD*)ptr - 12; if (ptr + n1 > max) { dst->freebuf(); delete dst; return 0; } ptr += 8; UINT ts_ofs=dst->get_offs(); dst->writedword(0); if (!(n2=ProcessTrack(ptr,dst,n1))) { dst->freebuf(); delete dst; return 0; } dst->writedwordoffs(_rv(n2),ts_ofs); ptr += n1 + 4; } FixHeader(mhd); dst->writeoffs(&mhd,sizeof(mhd),8); UINT f_sz; BYTE* r=(BYTE*)dst->finish(&f_sz); delete dst; if (r) { if (out_size) *out_size=f_sz; return r; } else { return 0; } }
void Service::FormTrack() { cont->translate(HEADER_WDH, 0); ProcessTrack(); }