openal updated in Windows

This commit is contained in:
John Preston 2015-06-03 15:18:46 +03:00
parent 16aafe28d5
commit c40758f30d
3 changed files with 42 additions and 39 deletions

View File

@ -21,6 +21,9 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org
#include <AL/al.h> #include <AL/al.h>
#include <AL/alc.h> #include <AL/alc.h>
#define AL_ALEXT_PROTOTYPES
#include <AL/alext.h>
extern "C" { extern "C" {
#include <libavcodec/avcodec.h> #include <libavcodec/avcodec.h>
@ -197,7 +200,7 @@ void audioInit() {
if (!_checkALError()) return audioFinish(); if (!_checkALError()) return audioFinish();
player = new AudioPlayer(); player = new AudioPlayer();
alcSuspendContext(audioContext); alcDevicePauseSOFT(audioDevice);
av_register_all(); av_register_all();
avcodec_register_all(); avcodec_register_all();
@ -209,7 +212,7 @@ void audioInit() {
void audioPlayNotify() { void audioPlayNotify() {
if (!audioPlayer()) return; if (!audioPlayer()) return;
audioPlayer()->processContext(); audioPlayer()->resumeDevice();
alSourcePlay(notifySource); alSourcePlay(notifySource);
emit audioPlayer()->faderOnTimer(); emit audioPlayer()->faderOnTimer();
} }
@ -373,7 +376,7 @@ void AudioPlayer::pauseresume() {
updateCurrentStarted(); updateCurrentStarted();
} }
_data[_current].state = AudioPlayerResuming; _data[_current].state = AudioPlayerResuming;
processContext(); resumeDevice();
alSourcePlay(_data[_current].source); alSourcePlay(_data[_current].source);
break; break;
case AudioPlayerStarting: case AudioPlayerStarting:
@ -403,8 +406,8 @@ void AudioPlayer::clearStoppedAtStart(AudioData *audio) {
} }
} }
void AudioPlayer::processContext() { void AudioPlayer::resumeDevice() {
_fader->processContext(); _fader->resumeDevice();
} }
AudioCapture::AudioCapture() : _capture(new AudioCaptureInner(&_captureThread)) { AudioCapture::AudioCapture() : _capture(new AudioCaptureInner(&_captureThread)) {
@ -450,17 +453,17 @@ AudioCapture *audioCapture() {
return capture; return capture;
} }
AudioPlayerFader::AudioPlayerFader(QThread *thread) : _timer(this), _suspendFlag(false), _suspended(true) { AudioPlayerFader::AudioPlayerFader(QThread *thread) : _timer(this), _pauseFlag(false), _paused(true) {
moveToThread(thread); moveToThread(thread);
_timer.moveToThread(thread); _timer.moveToThread(thread);
_suspendTimer.moveToThread(thread); _pauseTimer.moveToThread(thread);
_timer.setSingleShot(true); _timer.setSingleShot(true);
connect(&_timer, SIGNAL(timeout()), this, SLOT(onTimer())); connect(&_timer, SIGNAL(timeout()), this, SLOT(onTimer()));
_suspendTimer.setSingleShot(true); _pauseTimer.setSingleShot(true);
connect(&_suspendTimer, SIGNAL(timeout()), this, SLOT(onSuspendTimer())); connect(&_pauseTimer, SIGNAL(timeout()), this, SLOT(onPauseTimer()));
connect(this, SIGNAL(stopSuspend()), this, SLOT(onSuspendTimerStop()), Qt::QueuedConnection); connect(this, SIGNAL(stopPauseDevice()), this, SLOT(onPauseTimerStop()), Qt::QueuedConnection);
} }
void AudioPlayerFader::onInit() { void AudioPlayerFader::onInit() {
@ -556,36 +559,36 @@ void AudioPlayerFader::onTimer() {
} }
if (hasFading) { if (hasFading) {
_timer.start(AudioFadeTimeout); _timer.start(AudioFadeTimeout);
processContext(); resumeDevice();
} else if (hasPlaying) { } else if (hasPlaying) {
_timer.start(AudioCheckPositionTimeout); _timer.start(AudioCheckPositionTimeout);
processContext(); resumeDevice();
} else { } else {
QMutexLocker lock(&_suspendMutex); QMutexLocker lock(&_pauseMutex);
_suspendFlag = true; _pauseFlag = true;
_suspendTimer.start(AudioSuspendTimeout); _pauseTimer.start(AudioPauseDeviceTimeout);
} }
} }
void AudioPlayerFader::onSuspendTimer() { void AudioPlayerFader::onPauseTimer() {
QMutexLocker lock(&_suspendMutex); QMutexLocker lock(&_pauseMutex);
if (_suspendFlag) { if (_pauseFlag) {
_suspended = true; _paused = true;
alcSuspendContext(audioContext); alcDevicePauseSOFT(audioDevice);
} }
} }
void AudioPlayerFader::onSuspendTimerStop() { void AudioPlayerFader::onPauseTimerStop() {
if (_suspendTimer.isActive()) _suspendTimer.stop(); if (_pauseTimer.isActive()) _pauseTimer.stop();
} }
void AudioPlayerFader::processContext() { void AudioPlayerFader::resumeDevice() {
QMutexLocker lock(&_suspendMutex); QMutexLocker lock(&_pauseMutex);
_suspendFlag = false; _pauseFlag = false;
emit stopSuspend(); emit stopPauseDevice();
if (_suspended) { if (_paused) {
_suspended = false; _paused = false;
alcProcessContext(audioContext); alcDeviceResumeSOFT(audioDevice);
} }
} }
@ -1111,7 +1114,7 @@ void AudioPlayerLoaders::onLoad(AudioData *audio) {
alGetSourcei(m.source, AL_SOURCE_STATE, &state); alGetSourcei(m.source, AL_SOURCE_STATE, &state);
if (_checkALError()) { if (_checkALError()) {
if (state != AL_PLAYING) { if (state != AL_PLAYING) {
voice->processContext(); voice->resumeDevice();
alSourcePlay(m.source); alSourcePlay(m.source);
emit needToCheck(); emit needToCheck();
} }

View File

@ -50,7 +50,7 @@ public:
void currentState(AudioData **audio, AudioPlayerState *state = 0, int64 *position = 0, int64 *duration = 0, int32 *frequency = 0); void currentState(AudioData **audio, AudioPlayerState *state = 0, int64 *position = 0, int64 *duration = 0, int32 *frequency = 0);
void clearStoppedAtStart(AudioData *audio); void clearStoppedAtStart(AudioData *audio);
void processContext(); void resumeDevice();
~AudioPlayer(); ~AudioPlayer();
@ -150,7 +150,7 @@ class AudioPlayerFader : public QObject {
public: public:
AudioPlayerFader(QThread *thread); AudioPlayerFader(QThread *thread);
void processContext(); void resumeDevice();
signals: signals:
@ -159,20 +159,20 @@ signals:
void audioStopped(AudioData *audio); void audioStopped(AudioData *audio);
void needToPreload(AudioData *audio); void needToPreload(AudioData *audio);
void stopSuspend(); void stopPauseDevice();
public slots: public slots:
void onInit(); void onInit();
void onTimer(); void onTimer();
void onSuspendTimer(); void onPauseTimer();
void onSuspendTimerStop(); void onPauseTimerStop();
private: private:
QTimer _timer, _suspendTimer; QTimer _timer, _pauseTimer;
QMutex _suspendMutex; QMutex _pauseMutex;
bool _suspendFlag, _suspended; bool _pauseFlag, _paused;
}; };

View File

@ -97,7 +97,7 @@ enum {
AudioVoiceMsgChannels = 2, // stereo AudioVoiceMsgChannels = 2, // stereo
AudioVoiceMsgBufferSize = 1024 * 1024, // 1 Mb buffers AudioVoiceMsgBufferSize = 1024 * 1024, // 1 Mb buffers
AudioVoiceMsgInMemory = 1024 * 1024, // 1 Mb audio is hold in memory and auto loaded AudioVoiceMsgInMemory = 1024 * 1024, // 1 Mb audio is hold in memory and auto loaded
AudioSuspendTimeout = 3000, // suspend in 3 secs after playing is over AudioPauseDeviceTimeout = 3000, // pause in 3 secs after playing is over
StickerInMemory = 256 * 1024, // 128 Kb stickers hold in memory, auto loaded and displayed inline StickerInMemory = 256 * 1024, // 128 Kb stickers hold in memory, auto loaded and displayed inline
StickerMaxSize = 2048, // 2048x2048 is a max image size for sticker StickerMaxSize = 2048, // 2048x2048 is a max image size for sticker