Comments (4)
SoundCard heavily depends on the operating systems' native audio APIs. In some APIs, SoundCard's functions will be called by the APIs on their own thread. Some APIs require SoundCard's functions to run at least once per block. If these requirements are not honored, you will get partial data, overflows, or crashes.
Async is nice if all of your functions are happy to wait arbitrary lengths of time for their time to run. Audio is not such a case. Audio is not asynchronous, but concurrent. Audio is inherently real-time. If you don't provide audio data on time, every time, then you won't have any audio to play and you'll hear popping and clicking. If you don't fetch your audio data in time, it will overflow and be lost forever.
Thus, SoundCard can not use async. If you need to do something else while SoundCard is doing it's thing, you can try doing it in a thread. But beware that you don't starve SoundCard's thread or you'll lose data. If that's a problem, run the audio processing in its own process.
That's just the reality of doing audio in Python. Sadly.
from soundcard.
I see, interesting, thanks for the explanation!
That's just the reality of doing audio in Python.
Well, if one only cared about Linux, couldn't one wrap PulseAudio's native async interface in Python using the Python async framework?
from soundcard.
Well, if one only cared about Linux, couldn't one wrap PulseAudio's native async interface in Python using the Python async framework?
Not at all. Pulseaudio is not "async" in the Python sense. It is not cooperative multitasking, where each concurrent process willingly relinquishes control at somewhat regular intervals. Instead, you have to register callbacks, which are called by Pulseaudio when it requires data or has data available.
Which is in fact what SoundCard is doing on Linux.
But, again, the problem is not any one API, it's audio in general. Audio is inherently real-time. You need to provide your data on time, every time. Thus, any cooperative scheme (i.e. async) is simply not viable. If pulse needs audio data, it needs your audio data now. It can not wait for another async function to give up control of its own volition.
As Python is, for the purpose of audio processing, single-threaded, this is only possible with preemptive multitasking, i.e. threads. With threads, the audio engine can interrupt every other thread when the data is available, and resume them when the data has been dealt with. It does not need to wait for the next await
.
from soundcard.
Ahh, I see! Ok, that explains how the nature of Python plays into it. :) Thanks again!
from soundcard.
Related Issues (20)
- Why won't it save my audio when I use this with SoundFile? HOT 4
- OSError: ctypes.util.find_library() did not manage to locate a library called 'harfbuzz' please help in windows HOT 2
- Does anyone know how to make this work? HOT 1
- Wav file is empty after recording is saved to file HOT 5
- how to end playback in advance? HOT 2
- Need help with settings HOT 6
- MacOS: Empty result for all_speakers/all_microphones HOT 28
- Record audio unlimited HOT 6
- get mac audio output level HOT 1
- Queation: Is that possible to record based on a button click? HOT 1
- Data loss while recording HOT 4
- Cannot record sound with loopback if silence at start HOT 10
- loopback record audio from speaker return zero array HOT 5
- Problem with the player HOT 1
- how to get non numpy "raw" mono data from the record() method HOT 2
- pluseaudio.py line 3 `import collections` set --> `import collections.abc as collections` HOT 7
- Using version 0.4.2, when recording Xiaomi microphones on Win11, the response was that there was no valid sound in the data, HOT 4
- Empty result for all_speakers/all_microphones on Ubuntu OS HOT 6
- Approach for recording using jack soundcard HOT 1
- [Report] soundcard with synthplayer module on macos. HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from soundcard.