aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/adlmidi.cpp17
-rw-r--r--src/cvt_xmi2mid.hpp25
-rw-r--r--src/midi_sequencer.hpp12
-rw-r--r--src/midi_sequencer_impl.hpp19
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