aboutsummaryrefslogtreecommitdiff
path: root/utils/midiplay
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2024-05-11 01:49:36 +0300
committerWohlstand <admin@wohlnet.ru>2024-05-11 01:49:36 +0300
commit119293f8ae3c154f3ed2ab37c43fe04941569961 (patch)
tree6ed4ac65710407173d952d7224434b7ac25c1c75 /utils/midiplay
parent63141d11132fedfd63860fc42e16de1f48312e01 (diff)
downloadlibADLMIDI-119293f8ae3c154f3ed2ab37c43fe04941569961.tar.gz
libADLMIDI-119293f8ae3c154f3ed2ab37c43fe04941569961.tar.bz2
libADLMIDI-119293f8ae3c154f3ed2ab37c43fe04941569961.zip
MidiPlay: Backported gaininig from OPNMIDI player
Diffstat (limited to 'utils/midiplay')
-rw-r--r--utils/midiplay/adlmidiplay.cpp98
1 files changed, 96 insertions, 2 deletions
diff --git a/utils/midiplay/adlmidiplay.cpp b/utils/midiplay/adlmidiplay.cpp
index 07b0ffc..779d55e 100644
--- a/utils/midiplay/adlmidiplay.cpp
+++ b/utils/midiplay/adlmidiplay.cpp
@@ -213,17 +213,89 @@ typedef std::deque<uint8_t> AudioBuff;
static AudioBuff g_audioBuffer;
static MutexType g_audioBuffer_lock;
static ADLMIDI_AudioFormat g_audioFormat;
+static float g_gaining = 2.0f;
+
+static void applyGain(uint8_t *buffer, size_t bufferSize)
+{
+ size_t i;
+
+ switch(g_audioFormat.type)
+ {
+ case ADLMIDI_SampleType_S8:
+ {
+ int8_t *buf = reinterpret_cast<int8_t *>(buffer);
+ size_t samples = bufferSize;
+ for(i = 0; i < samples; ++i)
+ *(buf++) *= g_gaining;
+ break;
+ }
+ case ADLMIDI_SampleType_U8:
+ {
+ uint8_t *buf = buffer;
+ size_t samples = bufferSize;
+ for(i = 0; i < samples; ++i)
+ {
+ int8_t s = static_cast<int8_t>(static_cast<int32_t>(*buf) + (-0x7f - 1)) * g_gaining;
+ *(buf++) = static_cast<uint8_t>(static_cast<int32_t>(s) - (-0x7f - 1));
+ }
+ break;
+ }
+ case ADLMIDI_SampleType_S16:
+ {
+ int16_t *buf = reinterpret_cast<int16_t *>(buffer);
+ size_t samples = bufferSize / g_audioFormat.containerSize;
+ for(i = 0; i < samples; ++i)
+ *(buf++) *= g_gaining;
+ break;
+ }
+ case ADLMIDI_SampleType_U16:
+ {
+ uint16_t *buf = reinterpret_cast<uint16_t *>(buffer);
+ size_t samples = bufferSize / g_audioFormat.containerSize;
+ for(i = 0; i < samples; ++i)
+ {
+ int16_t s = static_cast<int16_t>(static_cast<int32_t>(*buf) + (-0x7fff - 1)) * g_gaining;
+ *(buf++) = static_cast<uint16_t>(static_cast<int32_t>(s) - (-0x7fff - 1));
+ }
+ break;
+ }
+ case ADLMIDI_SampleType_S32:
+ {
+ int32_t *buf = reinterpret_cast<int32_t *>(buffer);
+ size_t samples = bufferSize / g_audioFormat.containerSize;
+ for(i = 0; i < samples; ++i)
+ *(buf++) *= g_gaining;
+ break;
+ }
+ case ADLMIDI_SampleType_F32:
+ {
+ float *buf = reinterpret_cast<float *>(buffer);
+ size_t samples = bufferSize / g_audioFormat.containerSize;
+ for(i = 0; i < samples; ++i)
+ *(buf++) *= g_gaining;
+ break;
+ }
+ default:
+ break;
+ }
+}
static void SDL_AudioCallbackX(void *, uint8_t *stream, int len)
{
+ unsigned ate = static_cast<unsigned>(len); // number of bytes
+
audio_lock();
//short *target = (short *) stream;
- g_audioBuffer_lock.Lock();
- unsigned ate = static_cast<unsigned>(len); // number of bytes
+ g_audioBuffer_lock.Lock();
+
if(ate > g_audioBuffer.size())
ate = (unsigned)g_audioBuffer.size();
+
for(unsigned a = 0; a < ate; ++a)
stream[a] = g_audioBuffer[a];
+
+ applyGain(stream, len);
+
g_audioBuffer.erase(g_audioBuffer.begin(), g_audioBuffer.begin() + ate);
g_audioBuffer_lock.Unlock();
audio_unlock();
@@ -1025,6 +1097,7 @@ int main(int argc, char **argv)
" -ea Enable the auto-arpeggio\n"
#ifndef HARDWARE_OPL3
" -fp Enables full-panning stereo support\n"
+ " --gain <value> Set the gaining factor (default 2.0)\n"
" --emu-nuked Uses Nuked OPL3 v 1.8 emulator\n"
" --emu-nuked7 Uses Nuked OPL3 v 1.7.4 emulator\n"
" --emu-dosbox Uses DosBox 0.74 OPL3 emulator\n"
@@ -1211,6 +1284,18 @@ int main(int argc, char **argv)
multibankFromEnbededTest = true;
else if(!std::strcmp("-s", argv[2]))
adl_setScaleModulators(myDevice, 1);//Turn on modulators scaling by volume
+#ifndef ADLMIDI_HW_OPL
+ else if(!std::strcmp("--gain", argv[2]))
+ {
+ if(argc <= 3)
+ {
+ printError("The option --gain requires an argument!\n");
+ return 1;
+ }
+ had_option = true;
+ g_gaining = std::atof(argv[3]);
+ }
+#endif // HARDWARE_OPL3
#ifdef HARDWARE_OPL3
else if(!std::strcmp("--time-freq", argv[2]))
@@ -1476,6 +1561,15 @@ int main(int argc, char **argv)
std::fprintf(stdout, " - Volume model: %s\n", volume_model_to_str(adl_getVolumeRangeModel(myDevice)));
std::fprintf(stdout, " - Channel allocation mode: %s\n", chanalloc_to_str(adl_getChannelAllocMode(myDevice)));
+#ifndef HARDWARE_OPL3
+# ifdef ADLMIDI_ENABLE_HW_SERIAL
+ if(!hwSerial)
+# endif
+ {
+ std::fprintf(stdout, " - Gain level: %g\n", g_gaining);
+ }
+#endif
+
int songsCount = adl_getSongsCount(myDevice);
if(songNumLoad >= 0)
std::fprintf(stdout, " - Attempt to load song number: %d / %d\n", songNumLoad, songsCount);