Updated Sound PGEX See Notes

NOTE! On Windows works for 64-bit builds - Sound PGEX overhaul is way overdue. Also fixed an incompatibility bug with PGE2.0
This commit is contained in:
Javidx9 2020-05-05 18:02:50 +01:00 committed by GitHub
parent d702d06f34
commit ebc321c381
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,7 +3,7 @@
+-------------------------------------------------------------+ +-------------------------------------------------------------+
| OneLoneCoder Pixel Game Engine Extension | | OneLoneCoder Pixel Game Engine Extension |
| Sound - v0.3 | | Sound - v0.4 |
+-------------------------------------------------------------+ +-------------------------------------------------------------+
What is this? What is this?
@ -74,7 +74,7 @@
#include <istream> #include <istream>
#include <cstring> #include <cstring>
#include <climits> #include <climits>
#include <condition_variable>
#include <algorithm> #include <algorithm>
#undef min #undef min
#undef max #undef max
@ -294,8 +294,8 @@ namespace olc
if (pack != nullptr) if (pack != nullptr)
{ {
olc::ResourcePack::sEntry entry = pack->GetStreamBuffer(sWavFile); olc::ResourceBuffer rb = pack->GetFileBuffer(sWavFile);
std::istream is(&entry); std::istream is(&rb);
return ReadWave(is); return ReadWave(is);
} }
else else
@ -496,7 +496,8 @@ namespace olc
bool SOUND::DestroyAudio() bool SOUND::DestroyAudio()
{ {
m_bAudioThreadActive = false; m_bAudioThreadActive = false;
m_AudioThread.join(); if(m_AudioThread.joinable())
m_AudioThread.join();
return false; return false;
} }
@ -523,6 +524,9 @@ namespace olc
float fMaxSample = (float)nMaxSample; float fMaxSample = (float)nMaxSample;
short nPreviousSample = 0; short nPreviousSample = 0;
auto tp1 = std::chrono::system_clock::now();
auto tp2 = std::chrono::system_clock::now();
while (m_bAudioThreadActive) while (m_bAudioThreadActive)
{ {
// Wait for block to become available // Wait for block to become available
@ -551,19 +555,26 @@ namespace olc
return fmax(fSample, -fMax); return fmax(fSample, -fMax);
}; };
tp2 = std::chrono::system_clock::now();
std::chrono::duration<float> elapsedTime = tp2 - tp1;
tp1 = tp2;
// Our time per frame coefficient
float fElapsedTime = elapsedTime.count();
for (unsigned int n = 0; n < m_nBlockSamples; n += m_nChannels) for (unsigned int n = 0; n < m_nBlockSamples; n += m_nChannels)
{ {
// User Process // User Process
for (unsigned int c = 0; c < m_nChannels; c++) for (unsigned int c = 0; c < m_nChannels; c++)
{ {
nNewSample = (short)(clip(GetMixerOutput(c, m_fGlobalTime, fTimeStep), 1.0) * fMaxSample); nNewSample = (short)(clip(GetMixerOutput(c, m_fGlobalTime + fTimeStep * (float)n, fTimeStep), 1.0) * fMaxSample);
m_pBlockMemory[nCurrentBlock + n + c] = nNewSample; m_pBlockMemory[nCurrentBlock + n + c] = nNewSample;
nPreviousSample = nNewSample; nPreviousSample = nNewSample;
} }
m_fGlobalTime = m_fGlobalTime + fTimeStep;
} }
m_fGlobalTime = m_fGlobalTime + fTimeStep * (float)m_nBlockSamples;
// Send block to sound device // Send block to sound device
waveOutPrepareHeader(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR)); waveOutPrepareHeader(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR));
waveOutWrite(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR)); waveOutWrite(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR));
@ -610,6 +621,7 @@ namespace olc
snd_pcm_hw_params_any(m_pPCM, params); snd_pcm_hw_params_any(m_pPCM, params);
// Set other parameters // Set other parameters
snd_pcm_hw_params_set_access(m_pPCM, params, SND_PCM_ACCESS_RW_INTERLEAVED);
snd_pcm_hw_params_set_format(m_pPCM, params, SND_PCM_FORMAT_S16_LE); snd_pcm_hw_params_set_format(m_pPCM, params, SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_rate(m_pPCM, params, m_nSampleRate, 0); snd_pcm_hw_params_set_rate(m_pPCM, params, m_nSampleRate, 0);
snd_pcm_hw_params_set_channels(m_pPCM, params, m_nChannels); snd_pcm_hw_params_set_channels(m_pPCM, params, m_nChannels);
@ -645,7 +657,8 @@ namespace olc
bool SOUND::DestroyAudio() bool SOUND::DestroyAudio()
{ {
m_bAudioThreadActive = false; m_bAudioThreadActive = false;
m_AudioThread.join(); if(m_AudioThread.joinable())
m_AudioThread.join();
snd_pcm_drain(m_pPCM); snd_pcm_drain(m_pPCM);
snd_pcm_close(m_pPCM); snd_pcm_close(m_pPCM);
return false; return false;
@ -683,14 +696,14 @@ namespace olc
// User Process // User Process
for (unsigned int c = 0; c < m_nChannels; c++) for (unsigned int c = 0; c < m_nChannels; c++)
{ {
nNewSample = (short)(clip(GetMixerOutput(c, m_fGlobalTime, fTimeStep), 1.0) * fMaxSample); nNewSample = (short)(GetMixerOutput(c, m_fGlobalTime + fTimeStep * (float)n, fTimeStep), 1.0) * fMaxSample;
m_pBlockMemory[n + c] = nNewSample; m_pBlockMemory[n + c] = nNewSample;
nPreviousSample = nNewSample; nPreviousSample = nNewSample;
} }
m_fGlobalTime = m_fGlobalTime + fTimeStep;
} }
m_fGlobalTime = m_fGlobalTime + fTimeStep * (float)m_nBlockSamples;
// Send block to sound device // Send block to sound device
snd_pcm_uframes_t nLeft = m_nBlockSamples; snd_pcm_uframes_t nLeft = m_nBlockSamples;
short *pBlockPos = m_pBlockMemory; short *pBlockPos = m_pBlockMemory;
@ -766,7 +779,8 @@ namespace olc
bool SOUND::DestroyAudio() bool SOUND::DestroyAudio()
{ {
m_bAudioThreadActive = false; m_bAudioThreadActive = false;
m_AudioThread.join(); if(m_AudioThread.joinable())
m_AudioThread.join();
alDeleteBuffers(m_nBlockCount, m_pBuffers); alDeleteBuffers(m_nBlockCount, m_pBuffers);
delete[] m_pBuffers; delete[] m_pBuffers;