diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/adlmidi.cpp | 80 | ||||
-rw-r--r-- | src/adlmidi_load.cpp | 3 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 3 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 4 |
4 files changed, 35 insertions, 55 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp index e96c757..9743d57 100644 --- a/src/adlmidi.cpp +++ b/src/adlmidi.cpp @@ -227,8 +227,7 @@ ADLMIDI_EXPORT int adl_openBankFile(struct ADL_MIDIPlayer *device, const char *f if(device && device->adl_midiPlayer) { MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - play->m_setup.stored_samples = 0; - play->m_setup.backup_samples_size = 0; + play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadBank(filePath)) { std::string err = play->getErrorString(); @@ -248,8 +247,7 @@ ADLMIDI_EXPORT int adl_openBankData(struct ADL_MIDIPlayer *device, const void *m if(device && device->adl_midiPlayer) { MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - play->m_setup.stored_samples = 0; - play->m_setup.backup_samples_size = 0; + play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadBank(mem, static_cast<size_t>(size))) { std::string err = play->getErrorString(); @@ -269,8 +267,7 @@ ADLMIDI_EXPORT int adl_openFile(ADL_MIDIPlayer *device, const char *filePath) if(device && device->adl_midiPlayer) { MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - play->m_setup.stored_samples = 0; - play->m_setup.backup_samples_size = 0; + play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadMIDI(filePath)) { std::string err = play->getErrorString(); @@ -290,8 +287,7 @@ ADLMIDI_EXPORT int adl_openData(ADL_MIDIPlayer *device, const void *mem, unsigne if(device && device->adl_midiPlayer) { MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - play->m_setup.stored_samples = 0; - play->m_setup.backup_samples_size = 0; + play->m_setup.tick_skip_samples_delay = 0; if(!play->LoadMIDI(mem, static_cast<size_t>(size))) { std::string err = play->getErrorString(); @@ -360,8 +356,7 @@ ADLMIDI_EXPORT void adl_reset(struct ADL_MIDIPlayer *device) if(!device) return; MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - play->m_setup.stored_samples = 0; - play->m_setup.backup_samples_size = 0; + play->m_setup.tick_skip_samples_delay = 0; play->opl.Reset(play->m_setup.PCM_RATE); } @@ -516,21 +511,11 @@ inline static void SendStereoAudio(MIDIplay::Setup &device, { if(!in_size) return; - device.stored_samples = 0; size_t offset = static_cast<size_t>(out_pos); size_t inSamples = static_cast<size_t>(in_size * 2); size_t maxSamples = static_cast<size_t>(samples_requested) - offset; size_t toCopy = std::min(maxSamples, inSamples); std::memcpy(_out + out_pos, _in, toCopy * sizeof(short)); - - if(maxSamples < inSamples) - { - size_t appendSize = inSamples - maxSamples; - std::memcpy(device.backup_samples + device.backup_samples_size, - maxSamples + _in, appendSize * sizeof(short)); - device.backup_samples_size += (ssize_t)appendSize; - device.stored_samples += (ssize_t)appendSize; - } } @@ -555,39 +540,25 @@ ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out) ssize_t n_periodCountStereo = 512; //ssize_t n_periodCountPhys = n_periodCountStereo * 2; int left = sampleCount; + bool hasSkipped = setup.tick_skip_samples_delay > 0; while(left > 0) { - if(setup.backup_samples_size > 0) - { - //Send reserved samples if exist - ssize_t ate = 0; - - while((ate < setup.backup_samples_size) && (ate < left)) + {//... + const double eat_delay = setup.delay < setup.maxdelay ? setup.delay : setup.maxdelay; + if(hasSkipped) { - out[ate] = setup.backup_samples[ate]; - ate++; + size_t samples = setup.tick_skip_samples_delay > sampleCount ? sampleCount : setup.tick_skip_samples_delay; + n_periodCountStereo = samples / 2; } - - left -= (int)ate; - gotten_len += ate; - - if(ate < setup.backup_samples_size) + else { - for(ssize_t j = 0; j < ate; j++) - setup.backup_samples[(ate - 1) - j] = setup.backup_samples[(setup.backup_samples_size - 1) - j]; + setup.delay -= eat_delay; + setup.carry += setup.PCM_RATE * eat_delay; + n_periodCountStereo = static_cast<ssize_t>(setup.carry); + setup.carry -= n_periodCountStereo; } - setup.backup_samples_size -= ate; - } - else - { - const double eat_delay = setup.delay < setup.maxdelay ? setup.delay : setup.maxdelay; - setup.delay -= eat_delay; - setup.carry += setup.PCM_RATE * eat_delay; - n_periodCountStereo = static_cast<ssize_t>(setup.carry); - setup.carry -= n_periodCountStereo; - //if(setup.SkipForward > 0) // setup.SkipForward -= 1; //else @@ -595,6 +566,12 @@ ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out) if((player->atEnd) && (setup.delay <= 0.0)) break;//Stop to fetch samples at reaching the song end with disabled loop + ssize_t leftSamples = left / 2; + if(n_periodCountStereo > leftSamples) + { + setup.tick_skip_samples_delay = (n_periodCountStereo - leftSamples) * 2; + n_periodCountStereo = leftSamples; + } //! Count of stereo samples ssize_t in_generatedStereo = (n_periodCountStereo > 512) ? 512 : n_periodCountStereo; //! Total count of samples @@ -630,11 +607,18 @@ ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out) SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf, gotten_len, out); left -= (int)in_generatedPhys; - gotten_len += (in_generatedPhys) - setup.stored_samples; + gotten_len += (in_generatedPhys) /* - setup.stored_samples*/; } - setup.delay = player->Tick(eat_delay, setup.mindelay); - } + if(hasSkipped) + { + setup.tick_skip_samples_delay -= n_periodCountStereo * 2; + hasSkipped = setup.tick_skip_samples_delay > 0; + } + else + setup.delay = player->Tick(eat_delay, setup.mindelay); + + }//... } return static_cast<int>(gotten_len); diff --git a/src/adlmidi_load.cpp b/src/adlmidi_load.cpp index 5b54609..89428c9 100644 --- a/src/adlmidi_load.cpp +++ b/src/adlmidi_load.cpp @@ -379,8 +379,7 @@ bool MIDIplay::LoadMIDI(MIDIplay::fileReader &fr) } /**** Set all properties BEFORE starting of actial file reading! ****/ - m_setup.stored_samples = 0; - m_setup.backup_samples_size = 0; + m_setup.tick_skip_samples_delay = 0; opl.HighTremoloMode = m_setup.HighTremoloMode == -1 ? adlbanksetup[m_setup.AdlBank].deepTremolo : (bool)m_setup.HighTremoloMode; opl.HighVibratoMode = m_setup.HighVibratoMode == -1 ? adlbanksetup[m_setup.AdlBank].deepVibrato : (bool)m_setup.HighVibratoMode; opl.AdlPercussionMode = m_setup.AdlPercussionMode == -1 ? adlbanksetup[m_setup.AdlBank].adLibPercussions : (bool)m_setup.AdlPercussionMode; diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 2c10331..69db6b0 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -716,8 +716,7 @@ MIDIplay::MIDIplay(): m_setup.ScaleModulators = -1; m_setup.delay = 0.0; m_setup.carry = 0.0; - m_setup.stored_samples = 0; - m_setup.backup_samples_size = 0; + m_setup.tick_skip_samples_delay = 0; opl.NumCards = m_setup.NumCards; opl.AdlBank = m_setup.AdlBank; diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp index 8058824..32c3637 100644 --- a/src/adlmidi_private.hpp +++ b/src/adlmidi_private.hpp @@ -717,9 +717,7 @@ public: double maxdelay; /* For internal usage */ - ssize_t stored_samples; /* num of collected samples */ - short backup_samples[1024]; /* Backup sample storage. */ - ssize_t backup_samples_size; /* Backup sample storage. */ + ssize_t tick_skip_samples_delay; /* Skip tick processing after samples count. */ /* For internal usage */ unsigned long PCM_RATE; |