diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adlmidi.cpp | 17 | ||||
-rw-r--r-- | src/cvt_xmi2mid.hpp | 25 | ||||
-rw-r--r-- | src/midi_sequencer.hpp | 12 | ||||
-rw-r--r-- | src/midi_sequencer_impl.hpp | 19 |
4 files changed, 49 insertions, 24 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp index f613544..9d8005c 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -793,13 +793,28 @@ ADLMIDI_EXPORT void adl_selectSongNum(struct ADL_MIDIPlayer *device, int songNum MidiPlayer *play = GET_MIDI_PLAYER(device); assert(play); - play->m_sequencer->setLoadTrack(songNumber); + play->m_sequencer->setSongNum(songNumber); #else ADL_UNUSED(device); ADL_UNUSED(songNumber); #endif } +ADLMIDI_EXPORT int adl_getSongsCount(struct ADL_MIDIPlayer *device) +{ +#ifndef ADLMIDI_DISABLE_MIDI_SEQUENCER + if(!device) + return 0; + + MidiPlayer *play = GET_MIDI_PLAYER(device); + assert(play); + return play->m_sequencer->getSongsCount(); +#else + ADL_UNUSED(device); + return 0; +#endif +} + ADLMIDI_EXPORT const char *adl_emulatorName() { return "<adl_emulatorName() is deprecated! Use adl_chipEmulatorName() instead!>"; diff --git a/src/cvt_xmi2mid.hpp b/src/cvt_xmi2mid.hpp index 181c7db..2c7f850 100644 --- a/src/cvt_xmi2mid.hpp +++ b/src/cvt_xmi2mid.hpp @@ -105,6 +105,8 @@ struct xmi2mid_xmi_ctx { int16_t *timing; midi_event *list; midi_event *current; + std::vector<std::vector<uint8_t > > *dyn_out; + std::vector<uint8_t > *dyn_out_cur; }; typedef struct { @@ -178,7 +180,11 @@ static void xmi2mid_copy(struct xmi2mid_xmi_ctx *ctx, char *b, uint32_t len) #define DST_CHUNK 8192 static void xmi2mid_resize_dst(struct xmi2mid_xmi_ctx *ctx) { uint32_t pos = (uint32_t)(ctx->dst_ptr - ctx->dst); - ctx->dst = (uint8_t *)realloc(ctx->dst, ctx->dstsize + DST_CHUNK); + if (ctx->dyn_out && ctx->dyn_out_cur) { + ctx->dyn_out_cur->resize(ctx->dstsize + DST_CHUNK); + ctx->dst = ctx->dyn_out_cur->data(); + } else + ctx->dst = (uint8_t *)realloc(ctx->dst, ctx->dstsize + DST_CHUNK); ctx->dstsize += DST_CHUNK; ctx->dstrem += DST_CHUNK; ctx->dst_ptr = ctx->dst + pos; @@ -593,7 +599,7 @@ _end: /* cleanup */ } static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, - std::vector<uint8_t *> &out, std::vector<uint32_t> &outsize, + std::vector<std::vector<uint8_t > > &out, uint32_t convert_type) { struct xmi2mid_xmi_ctx ctx; @@ -610,6 +616,7 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, ctx.srcsize = insize; ctx.src_end = ctx.src + insize; ctx.convert_type = convert_type; + ctx.dyn_out = &out; if (xmi2mid_ParseXMI(&ctx) < 0) { /*_WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);*/ @@ -623,7 +630,10 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, for (i = 0; i < ctx.info.tracks; i++) { - ctx.dst = (uint8_t*)malloc(DST_CHUNK); + out.push_back(std::vector<uint8_t>()); + ctx.dyn_out_cur = &out.back(); + ctx.dyn_out_cur->resize(DST_CHUNK); + ctx.dst = ctx.dyn_out_cur->data(); ctx.dst_ptr = ctx.dst; ctx.dstsize = DST_CHUNK; ctx.dstrem = DST_CHUNK; @@ -641,21 +651,14 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, xmi2mid_write2(&ctx, ctx.timing[i]);/* write divisions from track0 */ xmi2mid_ConvertListToMTrk(&ctx, ctx.events[i]); - out.push_back(ctx.dst); - outsize.push_back(ctx.dstsize - ctx.dstrem); + ctx.dyn_out_cur->resize(ctx.dstsize - ctx.dstrem); } ret = 0; _end: /* cleanup */ if (ret < 0) { - for(size_t j = 0; j < out.size(); ++j) - { - free(out[j]); - out[j] = NULL; - } out.clear(); - outsize.clear(); } if (ctx.events) { for (i = 0; i < ctx.info.tracks; i++) diff --git a/src/midi_sequencer.hpp b/src/midi_sequencer.hpp index 2cba080..5e7ecc7 100644 --- a/src/midi_sequencer.hpp +++ b/src/midi_sequencer.hpp @@ -618,10 +618,16 @@ public: void setSoloTrack(size_t track); /** - * @brief Set the track number of a multi-track file (such as XMI) - * @param trackNumber Identifier of the track to load (or -1 to mix all tracks as one song) + * @brief Set the song number of a multi-song file (such as XMI) + * @param trackNumber Identifier of the song to load (or -1 to mix all songs as one song) */ - void setLoadTrack(int track); + void setSongNum(int track); + + /** + * @brief Retrive the number of songs in a currently opened file + * @return Number of songs in the file. If 1 or less, means, the file has only one song inside. + */ + int getSongsCount(); /** * @brief Defines a handler for callback trigger events diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp index 3c94968..d9ff580 100644 --- a/src/midi_sequencer_impl.hpp +++ b/src/midi_sequencer_impl.hpp @@ -451,7 +451,7 @@ void BW_MidiSequencer::setSoloTrack(size_t track) m_trackSolo = track; } -void BW_MidiSequencer::setLoadTrack(int track) +void BW_MidiSequencer::setSongNum(int track) { m_loadTrackNumber = track; @@ -481,6 +481,11 @@ void BW_MidiSequencer::setLoadTrack(int track) } } +int BW_MidiSequencer::getSongsCount() +{ + return (int)m_rawSongsData.size(); +} + void BW_MidiSequencer::setTriggerHandler(TriggerHandler handler, void *userData) { @@ -2922,8 +2927,7 @@ bool BW_MidiSequencer::parseXMI(FileAndMemReader &fr) char headerBuf[headerSize] = ""; size_t fsize = 0; // BufferGuard<uint8_t> cvt_buf; - std::vector<uint8_t *> song_buf; - std::vector<uint32_t> song_size; + std::vector<std::vector<uint8_t > > song_buf; bool ret; (void)Convert_xmi2midi; /* Shut up the warning */ @@ -2972,13 +2976,12 @@ bool BW_MidiSequencer::parseXMI(FileAndMemReader &fr) // uint8_t *mid = NULL; // uint32_t mid_len = 0; int m2mret = Convert_xmi2midi_multi(mus, static_cast<uint32_t>(mus_len + 20), - song_buf, song_size, XMIDI_CONVERT_NOCONVERSION); + song_buf, XMIDI_CONVERT_NOCONVERSION); if(mus) free(mus); if(m2mret < 0) { - for(size_t i = 0; i < song_buf.size(); ++i) - std::free(song_buf[i]); + song_buf.clear(); m_errorString = "Invalid XMI data format!"; return false; } @@ -2988,12 +2991,10 @@ bool BW_MidiSequencer::parseXMI(FileAndMemReader &fr) for(size_t i = 0; i < song_buf.size(); ++i) { - m_rawSongsData.push_back(std::vector<uint8_t >(song_buf[i], song_buf[i] + song_size[i])); - std::free(song_buf[i]); + m_rawSongsData.push_back(song_buf[i]); } song_buf.clear(); - song_size.clear(); // cvt_buf.set(mid); // Open converted MIDI file |