Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Introduced helper method getInternalRenderedSampleCount() in Synth
It is intended to facilitate accurate computation of MIDI message timestamps
used in playMsg, etc. methods when the output sample rate varies
during the Synth lifetime
Loading branch information
@@ -865,6 +865,10 @@ Bit32u Synth::addMIDIInterfaceDelay(Bit32u len, Bit32u timestamp) {
return timestamp;
}
Bit32u Synth::getInternalRenderedSampleCount () const {
return renderedSampleCount;
}
bool Synth::playMsg (Bit32u msg) {
return playMsg (msg, renderedSampleCount);
}
@@ -309,6 +309,10 @@ friend class TVP;
// Returns the actual queue size being used.
MT32EMU_EXPORT Bit32u setMIDIEventQueueSize (Bit32u);
// Returns current value of the global counter of samples rendered since the synth was created (at the native sample rate 32000 Hz).
// This method helps to compute accurate timestamp of a MIDI message to use with the methods below.
MT32EMU_EXPORT Bit32u getInternalRenderedSampleCount () const ;
// Enqueues a MIDI event for subsequent playback.
// The MIDI event will be processed not before the specified timestamp.
// The timestamp is measured as the global rendered sample count since the synth was created (at the native sample rate 32000 Hz).
@@ -41,7 +41,7 @@ static mt32emu_service_version getSynthVersionID(mt32emu_service_i) {
return MT32EMU_SERVICE_VERSION_CURRENT;
}
static const mt32emu_service_i_v1 SERVICE_VTABLE = {
static const mt32emu_service_i_v2 SERVICE_VTABLE = {
getSynthVersionID,
mt32emu_get_supported_report_handler_version,
mt32emu_get_supported_midi_receiver_version,
@@ -109,7 +109,8 @@ static const mt32emu_service_i_v1 SERVICE_VTABLE = {
mt32emu_select_renderer_type,
mt32emu_get_selected_renderer_type,
mt32emu_convert_output_to_synth_timestamp,
mt32emu_convert_synth_to_output_timestamp
mt32emu_convert_synth_to_output_timestamp,
mt32emu_get_internal_rendered_sample_count
};
} // namespace MT32Emu
@@ -320,7 +321,7 @@ extern "C" {
mt32emu_service_i mt32emu_get_service_i () {
mt32emu_service_i i;
i.v1 = &SERVICE_VTABLE;
i.v2 = &SERVICE_VTABLE;
return i;
}
@@ -521,6 +522,10 @@ void mt32emu_set_midi_receiver(mt32emu_context context, mt32emu_midi_receiver_i
context->midiParser = (midi_receiver.v0 != NULL ) ? new DelegatingMidiStreamParser (context, midi_receiver, instance_data) : new DefaultMidiStreamParser (*context->synth );
}
mt32emu_bit32u mt32emu_get_internal_rendered_sample_count (mt32emu_const_context context) {
return context->synth ->getInternalRenderedSampleCount ();
}
void mt32emu_parse_stream (mt32emu_const_context context, const mt32emu_bit8u *stream, mt32emu_bit32u length) {
context->midiParser ->resetTimestamp ();
context->midiParser ->parseStream (stream, length);
@@ -209,6 +209,12 @@ MT32EMU_EXPORT mt32emu_bit32u mt32emu_set_midi_event_queue_size(mt32emu_const_co
*/
MT32EMU_EXPORT void mt32emu_set_midi_receiver (mt32emu_context context, mt32emu_midi_receiver_i midi_receiver, void *instance_data);
/* *
* Returns current value of the global counter of samples rendered since the synth was created (at the native sample rate 32000 Hz).
* This method helps to compute accurate timestamp of a MIDI message to use with the methods below.
*/
MT32EMU_EXPORT mt32emu_bit32u mt32emu_get_internal_rendered_sample_count (mt32emu_const_context context);
/* Enqueues a MIDI event for subsequent playback.
* The MIDI event will be processed not before the specified timestamp.
* The timestamp is measured as the global rendered sample count since the synth was created (at the native sample rate 32000 Hz).
@@ -120,7 +120,8 @@ typedef enum {
typedef enum {
MT32EMU_SERVICE_VERSION_0 = 0 ,
MT32EMU_SERVICE_VERSION_1 = 1 ,
MT32EMU_SERVICE_VERSION_CURRENT = MT32EMU_SERVICE_VERSION_1
MT32EMU_SERVICE_VERSION_2 = 2 ,
MT32EMU_SERVICE_VERSION_CURRENT = MT32EMU_SERVICE_VERSION_2
} mt32emu_service_version;
/* === Report Handler Interface === */
@@ -297,6 +298,9 @@ typedef union mt32emu_service_i mt32emu_service_i;
mt32emu_bit32u (*convertOutputToSynthTimestamp)(mt32emu_const_context context, mt32emu_bit32u output_timestamp); \
mt32emu_bit32u (*convertSynthToOutputTimestamp)(mt32emu_const_context context, mt32emu_bit32u synth_timestamp);
#define MT32EMU_SERVICE_I_V2 \
mt32emu_bit32u (*getInternalRenderedSampleCount)(mt32emu_const_context context);
typedef struct {
MT32EMU_SERVICE_I_V0
} mt32emu_service_i_v0;
@@ -306,6 +310,12 @@ typedef struct {
MT32EMU_SERVICE_I_V1
} mt32emu_service_i_v1;
typedef struct {
MT32EMU_SERVICE_I_V0
MT32EMU_SERVICE_I_V1
MT32EMU_SERVICE_I_V2
} mt32emu_service_i_v2;
/* *
* Extensible interface for all the library services.
* Union intended to view an interface of any subsequent version as any parent interface not requiring a cast.
@@ -314,6 +324,7 @@ typedef struct {
union mt32emu_service_i {
const mt32emu_service_i_v0 *v0;
const mt32emu_service_i_v1 *v1;
const mt32emu_service_i_v2 *v2;
};
#undef MT32EMU_SERVICE_I_V0
@@ -61,6 +61,7 @@ mt32emu_service_i mt32emu_get_service_i();
#define mt32emu_flush_midi_queue i.v0->flushMIDIQueue
#define mt32emu_set_midi_event_queue_size i.v0->setMIDIEventQueueSize
#define mt32emu_set_midi_receiver i.v0->setMIDIReceiver
#define mt32emu_get_internal_rendered_sample_count iV2 ()->getInternalRenderedSampleCount
#define mt32emu_parse_stream i.v0->parseStream
#define mt32emu_parse_stream_at i.v0->parseStream_At
#define mt32emu_play_short_message i.v0->playShortMessage
@@ -213,6 +214,7 @@ class Service {
void setMIDIReceiver (mt32emu_midi_receiver_i midi_receiver, void *instance_data) { mt32emu_set_midi_receiver (c, midi_receiver, instance_data); }
void setMIDIReceiver (IMidiReceiver &midi_receiver) { setMIDIReceiver (CppInterfaceImpl::getMidiReceiverThunk (), &midi_receiver); }
Bit32u getInternalRenderedSampleCount () { return mt32emu_get_internal_rendered_sample_count (c); }
void parseStream (const Bit8u *stream, Bit32u length) { mt32emu_parse_stream (c, stream, length); }
void parseStream_At (const Bit8u *stream, Bit32u length, Bit32u timestamp) { mt32emu_parse_stream_at (c, stream, length, timestamp); }
void playShortMessage (Bit32u message) { mt32emu_play_short_message (c, message); }
@@ -421,6 +423,7 @@ static mt32emu_midi_receiver_i getMidiReceiverThunk() {
#undef mt32emu_flush_midi_queue
#undef mt32emu_set_midi_event_queue_size
#undef mt32emu_set_midi_receiver
#undef mt32emu_get_internal_rendered_sample_count
#undef mt32emu_parse_stream
#undef mt32emu_parse_stream_at
#undef mt32emu_play_short_message
Toggle all file notes
Toggle all file annotations