aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-09-06 14:40:34 +0200
committerdec05eba <dec05eba@protonmail.com>2022-09-06 14:40:34 +0200
commit4917c0406cd4b38167a52dbd8247bba706fa49a7 (patch)
tree543bdefa68562216a75152c9c10f05c99c34615a /src
parentf490abb67e855cfcd3fee3ce6a36d4cdb718abbd (diff)
Fix crackling audio with pipewire and only add empty audio packets until the first packet arrives
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 99e626f..d170dc5 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1322,6 +1322,7 @@ int main(int argc, char **argv) {
std::deque<uint8_t*> buffered_audio;
std::mutex buffered_audio_mutex;
std::condition_variable buffered_audio_cv;
+ bool got_first_batch = false;
// TODO: Make the sound device read async instead of using a thread
std::thread sound_read_thread([&](){
@@ -1344,9 +1345,13 @@ int main(int argc, char **argv) {
uint8_t *audio_buffer;
bool free_audio;
{
- // TODO: Not a good solution to lack of audio as it causes dropped frames, but it's better then complete audio desync
+ // TODO: Not a good solution to lack of audio as it causes dropped frames, but it's better then complete audio desync.
+ // The first packet is delayed for some reason...
std::unique_lock<std::mutex> lock(buffered_audio_mutex);
- buffered_audio_cv.wait_for(lock, std::chrono::milliseconds(30), [&]{ return !running || !buffered_audio.empty(); });
+ if(got_first_batch)
+ buffered_audio_cv.wait(lock, [&]{ return !running || !buffered_audio.empty(); });
+ else
+ buffered_audio_cv.wait_for(lock, std::chrono::milliseconds(21), [&]{ return !running || !buffered_audio.empty(); });
if(!running)
break;
@@ -1357,6 +1362,7 @@ int main(int argc, char **argv) {
audio_buffer = buffered_audio.front();
buffered_audio.pop_front();
free_audio = true;
+ got_first_batch = true;
}
}