aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/adlmidi.cpp')
-rw-r--r--src/adlmidi.cpp79
1 files changed, 11 insertions, 68 deletions
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index a7bab22..7aa9e8b 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -346,43 +346,6 @@ ADLMIDI_EXPORT void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo)
}
-#ifdef ADLMIDI_USE_DOSBOX_OPL
-
-#define ADLMIDI_CLAMP(V, MIN, MAX) std::max(std::min(V, (MAX)), (MIN))
-
-inline static void SendStereoAudio(MIDIplay::Setup &device,
- int &samples_requested,
- ssize_t &in_size,
- int *_in,
- ssize_t out_pos,
- short *_out)
-{
- if(!in_size) return;
-
- device.stored_samples = 0;
- ssize_t out;
- ssize_t offset;
- ssize_t pos = static_cast<ssize_t>(out_pos);
-
- for(ssize_t p = 0; p < in_size; ++p)
- {
- for(ssize_t w = 0; w < 2; ++w)
- {
- out = _in[p * 2 + w];
- offset = pos + p * 2 + w;
-
- if(offset < samples_requested)
- _out[offset] = static_cast<short>(ADLMIDI_CLAMP(out, static_cast<ssize_t>(INT16_MIN), static_cast<ssize_t>(INT16_MAX)));
- else
- {
- device.backup_samples[device.backup_samples_size] = static_cast<short>(out);
- device.backup_samples_size++;
- device.stored_samples++;
- }
- }
- }
-}
-#else
inline static void SendStereoAudio(MIDIplay::Setup &device,
int &samples_requested,
ssize_t &in_size,
@@ -409,7 +372,6 @@ inline static void SendStereoAudio(MIDIplay::Setup &device,
device.stored_samples += (ssize_t)appendSize;
}
}
-#endif
ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out)
@@ -460,70 +422,51 @@ ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out)
setup.delay -= eat_delay;
setup.carry += setup.PCM_RATE * eat_delay;
n_periodCountStereo = static_cast<ssize_t>(setup.carry);
- //n_periodCountPhys = n_periodCountStereo * 2;
setup.carry -= n_periodCountStereo;
if(setup.SkipForward > 0)
setup.SkipForward -= 1;
else
{
- #ifdef ADLMIDI_USE_DOSBOX_OPL
- std::vector<int> out_buf;
- #else
- std::vector<int16_t> out_buf;
- #endif
- out_buf.resize(1024, 0);
-
if((player->atEnd) && (setup.delay <= 0.0))
break;//Stop to fetch samples at reaching the song end with disabled loop
+ //! Count of stereo samples
ssize_t in_generatedStereo = (n_periodCountStereo > 512) ? 512 : n_periodCountStereo;
+ //! Total count of samples
ssize_t in_generatedPhys = in_generatedStereo * 2;
-
+ //! Unsigned total sample count
//fill buffer with zeros
- size_t in_countStereoU = static_cast<size_t>(in_generatedStereo * 2);
+ int16_t *out_buf = player->outBuf;
+ std::memset(out_buf, 0, static_cast<size_t>(in_generatedPhys) * sizeof(int16_t));
if(player->m_setup.NumCards == 1)
{
#ifdef ADLMIDI_USE_DOSBOX_OPL
- player->opl.cards[0].GenerateArr(out_buf.data(), &in_generatedStereo);
+ player->opl.cards[0].GenerateArr(out_buf, &in_generatedStereo);
in_generatedPhys = in_generatedStereo * 2;
#else
- OPL3_GenerateStream(&player->opl.cards[0], out_buf.data(), static_cast<Bit32u>(in_generatedStereo));
+ OPL3_GenerateStream(&player->opl.cards[0], out_buf, static_cast<Bit32u>(in_generatedStereo));
#endif
- /* Process it */
- SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf.data(), gotten_len, out);
}
else if(n_periodCountStereo > 0)
{
- #ifdef ADLMIDI_USE_DOSBOX_OPL
- std::vector<int32_t> in_mixBuffer;
- in_mixBuffer.resize(1024); //n_samples * 2
- ssize_t in_generatedStereo = n_periodCountStereo;
- #endif
- std::memset(out_buf.data(), 0, in_countStereoU * sizeof(short));
-
/* Generate data from every chip and mix result */
for(unsigned card = 0; card < player->m_setup.NumCards; ++card)
{
#ifdef ADLMIDI_USE_DOSBOX_OPL
- player->opl.cards[card].GenerateArr(in_mixBuffer.data(), &in_generatedStereo);
+ player->opl.cards[card].GenerateArrMix(out_buf, &in_generatedStereo);
in_generatedPhys = in_generatedStereo * 2;
- size_t in_samplesCount = static_cast<size_t>(in_generatedPhys);
- for(size_t a = 0; a < in_samplesCount; ++a)
- out_buf[a] += in_mixBuffer[a];
#else
- OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf.data(), static_cast<Bit32u>(in_generatedStereo));
+ OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf, static_cast<Bit32u>(in_generatedStereo));
#endif
}
-
- /* Process it */
- SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf.data(), gotten_len, out);
}
+ /* Process it */
+ SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf, gotten_len, out);
left -= (int)in_generatedPhys;
gotten_len += (in_generatedPhys) - setup.stored_samples;
- out_buf.clear();
}
setup.delay = player->Tick(eat_delay, setup.mindelay);