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
pull/121/head
Javidx9 5 years ago committed by GitHub
parent d702d06f34
commit ebc321c381
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      Extensions/olcPGEX_Sound.h

@ -3,7 +3,7 @@
+-------------------------------------------------------------+
| OneLoneCoder Pixel Game Engine Extension |
| Sound - v0.3 |
| Sound - v0.4 |
+-------------------------------------------------------------+
What is this?
@ -74,7 +74,7 @@
#include <istream>
#include <cstring>
#include <climits>
#include <condition_variable>
#include <algorithm>
#undef min
#undef max
@ -294,8 +294,8 @@ namespace olc
if (pack != nullptr)
{
olc::ResourcePack::sEntry entry = pack->GetStreamBuffer(sWavFile);
std::istream is(&entry);
olc::ResourceBuffer rb = pack->GetFileBuffer(sWavFile);
std::istream is(&rb);
return ReadWave(is);
}
else
@ -496,6 +496,7 @@ namespace olc
bool SOUND::DestroyAudio()
{
m_bAudioThreadActive = false;
if(m_AudioThread.joinable())
m_AudioThread.join();
return false;
}
@ -523,6 +524,9 @@ namespace olc
float fMaxSample = (float)nMaxSample;
short nPreviousSample = 0;
auto tp1 = std::chrono::system_clock::now();
auto tp2 = std::chrono::system_clock::now();
while (m_bAudioThreadActive)
{
// Wait for block to become available
@ -551,19 +555,26 @@ namespace olc
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)
{
// User Process
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;
nPreviousSample = nNewSample;
}
m_fGlobalTime = m_fGlobalTime + fTimeStep;
}
m_fGlobalTime = m_fGlobalTime + fTimeStep * (float)m_nBlockSamples;
// Send block to sound device
waveOutPrepareHeader(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);
// 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_rate(m_pPCM, params, m_nSampleRate, 0);
snd_pcm_hw_params_set_channels(m_pPCM, params, m_nChannels);
@ -645,6 +657,7 @@ namespace olc
bool SOUND::DestroyAudio()
{
m_bAudioThreadActive = false;
if(m_AudioThread.joinable())
m_AudioThread.join();
snd_pcm_drain(m_pPCM);
snd_pcm_close(m_pPCM);
@ -683,14 +696,14 @@ namespace olc
// User Process
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;
nPreviousSample = nNewSample;
}
m_fGlobalTime = m_fGlobalTime + fTimeStep;
}
m_fGlobalTime = m_fGlobalTime + fTimeStep * (float)m_nBlockSamples;
// Send block to sound device
snd_pcm_uframes_t nLeft = m_nBlockSamples;
short *pBlockPos = m_pBlockMemory;
@ -766,6 +779,7 @@ namespace olc
bool SOUND::DestroyAudio()
{
m_bAudioThreadActive = false;
if(m_AudioThread.joinable())
m_AudioThread.join();
alDeleteBuffers(m_nBlockCount, m_pBuffers);

Loading…
Cancel
Save