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:
parent
d702d06f34
commit
ebc321c381
@ -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,6 +496,7 @@ namespace olc
|
|||||||
bool SOUND::DestroyAudio()
|
bool SOUND::DestroyAudio()
|
||||||
{
|
{
|
||||||
m_bAudioThreadActive = false;
|
m_bAudioThreadActive = false;
|
||||||
|
if(m_AudioThread.joinable())
|
||||||
m_AudioThread.join();
|
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,6 +657,7 @@ namespace olc
|
|||||||
bool SOUND::DestroyAudio()
|
bool SOUND::DestroyAudio()
|
||||||
{
|
{
|
||||||
m_bAudioThreadActive = false;
|
m_bAudioThreadActive = false;
|
||||||
|
if(m_AudioThread.joinable())
|
||||||
m_AudioThread.join();
|
m_AudioThread.join();
|
||||||
snd_pcm_drain(m_pPCM);
|
snd_pcm_drain(m_pPCM);
|
||||||
snd_pcm_close(m_pPCM);
|
snd_pcm_close(m_pPCM);
|
||||||
@ -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,6 +779,7 @@ namespace olc
|
|||||||
bool SOUND::DestroyAudio()
|
bool SOUND::DestroyAudio()
|
||||||
{
|
{
|
||||||
m_bAudioThreadActive = false;
|
m_bAudioThreadActive = false;
|
||||||
|
if(m_AudioThread.joinable())
|
||||||
m_AudioThread.join();
|
m_AudioThread.join();
|
||||||
|
|
||||||
alDeleteBuffers(m_nBlockCount, m_pBuffers);
|
alDeleteBuffers(m_nBlockCount, m_pBuffers);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user