Merge pull request #1646 from cigumo/ios-audio-interruption-handling

adds iOS audio interruption handling and recovery
This commit is contained in:
Alex Szpakowski
2020-12-18 22:53:02 -04:00
committed by GitHub
7 changed files with 130 additions and 0 deletions
+6
View File
@@ -291,6 +291,12 @@ public:
**/
static bool setMixWithSystem(bool mix);
/**
* Pause/resume audio context
*/
virtual void pauseContext() = 0;
virtual void resumeContext() = 0;
private:
static StringMap<DistanceModel, DISTANCE_MAX_ENUM>::Entry distanceModelEntries[];
+9
View File
@@ -203,6 +203,15 @@ bool Audio::isEFXsupported() const
return false;
}
void Audio::pauseContext()
{
}
void Audio::resumeContext()
{
}
} // null
} // audio
} // love
+3
View File
@@ -86,6 +86,9 @@ public:
int getMaxSourceEffects() const;
bool isEFXsupported() const;
void pauseContext();
void resumeContext();
private:
float volume;
DistanceModel distanceModel;
+23
View File
@@ -26,6 +26,10 @@
#include <cstdlib>
#include <iostream>
#ifdef LOVE_IOS
#include "common/ios.h"
#endif
namespace love
{
namespace audio
@@ -189,10 +193,18 @@ Audio::Audio()
poolThread = new PoolThread(pool);
poolThread->start();
#ifdef LOVE_IOS
love::ios::initAudioSessionInterruptionHandler();
#endif
}
Audio::~Audio()
{
#ifdef LOVE_IOS
love::ios::destroyAudioSessionInterruptionHandler();
#endif
poolThread->setFinish();
poolThread->wait();
@@ -293,6 +305,17 @@ std::vector<love::audio::Source*> Audio::pause()
return Source::pause(pool);
}
void Audio::pauseContext()
{
alcMakeContextCurrent(nullptr);
}
void Audio::resumeContext()
{
if (context && alcGetCurrentContext() != context)
alcMakeContextCurrent(context);
}
void Audio::setVolume(float volume)
{
alListenerf(AL_GAIN, volume);
+2
View File
@@ -95,6 +95,8 @@ public:
void pause(love::audio::Source *source);
void pause(const std::vector<love::audio::Source*> &sources);
std::vector<love::audio::Source*> pause();
void pauseContext();
void resumeContext();
void setVolume(float volume);
float getVolume() const;