mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
using PPSSPP's locks
This commit is contained in:
parent
43a0d5f60f
commit
a151b5beb6
2 changed files with 16 additions and 12 deletions
|
@ -28,10 +28,11 @@
|
||||||
#include "ChunkFile.h"
|
#include "ChunkFile.h"
|
||||||
#include "FixedSizeQueue.h"
|
#include "FixedSizeQueue.h"
|
||||||
#include "Common/Thread.h"
|
#include "Common/Thread.h"
|
||||||
|
#include "Common/Atomics.h"
|
||||||
|
|
||||||
// Should be used to lock anything related to the outAudioQueue.
|
// Should be used to lock anything related to the outAudioQueue.
|
||||||
std::atomic<bool> audioQueueLock;
|
//atomic locks are used on the lock. TODO: make this lock-free
|
||||||
|
volatile u32 audioQueueLocked;
|
||||||
|
|
||||||
int eventAudioUpdate = -1;
|
int eventAudioUpdate = -1;
|
||||||
int eventHostAudioUpdate = -1;
|
int eventHostAudioUpdate = -1;
|
||||||
|
@ -58,7 +59,7 @@ FixedSizeQueue<s16, 512 * 16> outAudioQueue;
|
||||||
|
|
||||||
|
|
||||||
bool __gainAudioQueueLock();
|
bool __gainAudioQueueLock();
|
||||||
|
void __releaseAcquiredLock();
|
||||||
|
|
||||||
static inline s16 clamp_s16(int i) {
|
static inline s16 clamp_s16(int i) {
|
||||||
if (i > 32767)
|
if (i > 32767)
|
||||||
|
@ -114,7 +115,8 @@ void __AudioInit() {
|
||||||
mixBuffer = new s32[hwBlockSize * 2];
|
mixBuffer = new s32[hwBlockSize * 2];
|
||||||
memset(mixBuffer, 0, hwBlockSize * 2 * sizeof(s32));
|
memset(mixBuffer, 0, hwBlockSize * 2 * sizeof(s32));
|
||||||
|
|
||||||
audioQueueLock.store(false);
|
//set the lock to false initially
|
||||||
|
Common::AtomicStore(audioQueueLocked, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __AudioDoState(PointerWrap &p) {
|
void __AudioDoState(PointerWrap &p) {
|
||||||
|
@ -137,7 +139,7 @@ void __AudioDoState(PointerWrap &p) {
|
||||||
outAudioQueue.DoState(p);
|
outAudioQueue.DoState(p);
|
||||||
|
|
||||||
//release the atomic lock
|
//release the atomic lock
|
||||||
audioQueueLock.store(false);
|
__releaseAcquiredLock();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +362,7 @@ void __AudioUpdate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
//release the atomic lock
|
//release the atomic lock
|
||||||
audioQueueLock.store(false);
|
__releaseAcquiredLock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,7 +392,7 @@ int __AudioMix(short *outstereo, int numFrames)
|
||||||
}
|
}
|
||||||
|
|
||||||
//release the atomic lock
|
//release the atomic lock
|
||||||
audioQueueLock.store(false);
|
__releaseAcquiredLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
int remains = (int)(numFrames * 2 - sz1 - sz2);
|
int remains = (int)(numFrames * 2 - sz1 - sz2);
|
||||||
|
@ -405,11 +407,15 @@ int __AudioMix(short *outstereo, int numFrames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool __gainAudioQueueLock(){
|
inline bool __gainAudioQueueLock(){
|
||||||
if(audioQueueLock.load(std::memory_order::memory_order_relaxed) == true){
|
if(Common::AtomicLoad(audioQueueLocked) == 1){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
audioQueueLock.store(true, std::memory_order::memory_order_relaxed );
|
Common::AtomicStore(audioQueueLocked, 1);
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void __releaseAcquiredLock(){
|
||||||
|
Common::AtomicStore(audioQueueLocked, 0);
|
||||||
|
}
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "sceAudio.h"
|
#include "sceAudio.h"
|
||||||
#include <atomic>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Easy interface for sceAudio to write to, to keep the complexity in check.
|
// Easy interface for sceAudio to write to, to keep the complexity in check.
|
||||||
|
|
Loading…
Add table
Reference in a new issue