Skip to content

Commit e4f6585

Browse files
Update AudioFlinger docs
1 parent d89a787 commit e4f6585

File tree

1 file changed

+56
-20
lines changed

1 file changed

+56
-20
lines changed

docs/frameworks/audioflinger.md

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,32 @@ AudioFlinger provides:
2525

2626
## Quick Start
2727

28+
### Initialization
29+
30+
AudioFlinger uses a singleton pattern. Initialize it once at startup with your hardware configuration:
31+
32+
```python
33+
from mpos.audio.audioflinger import AudioFlinger
34+
35+
# Initialize with I2S and buzzer (typical Fri3d badge setup)
36+
i2s_pins = {'sck': 2, 'ws': 47, 'sd': 16, 'sd_in': 15}
37+
buzzer = machine.PWM(machine.Pin(46))
38+
AudioFlinger(i2s_pins=i2s_pins, buzzer_instance=buzzer)
39+
40+
# After initialization, use class methods directly (no .get() needed)
41+
AudioFlinger.play_wav("music.wav")
42+
AudioFlinger.set_volume(70)
43+
```
44+
2845
### Playing WAV Files
2946

3047
```python
3148
from mpos import Activity
32-
import mpos.audio.audioflinger as AudioFlinger
49+
from mpos.audio.audioflinger import AudioFlinger
3350

3451
class MusicPlayerActivity(Activity):
3552
def onCreate(self):
36-
# Play a music file
53+
# Play a music file (class method - no .get() needed)
3754
success = AudioFlinger.play_wav(
3855
"M:/sdcard/music/song.wav",
3956
stream_type=AudioFlinger.STREAM_MUSIC,
@@ -53,6 +70,8 @@ class MusicPlayerActivity(Activity):
5370
### Playing RTTTL Ringtones
5471

5572
```python
73+
from mpos.audio.audioflinger import AudioFlinger
74+
5675
# Play notification sound via buzzer
5776
rtttl = "Nokia:d=4,o=5,b=225:8e6,8d6,8f#,8g#,8c#6,8b,d,8p,8b,8a,8c#,8e"
5877
AudioFlinger.play_rtttl(
@@ -75,6 +94,8 @@ Nokia:d=4,o=5,b=225:8e6,8d6,8f#,8g#
7594
### Volume Control
7695

7796
```python
97+
from mpos.audio.audioflinger import AudioFlinger
98+
7899
# Set volume (0-100)
79100
AudioFlinger.set_volume(70)
80101

@@ -97,7 +118,7 @@ AudioFlinger supports recording audio from an I2S microphone to WAV files.
97118
### Basic Recording
98119

99120
```python
100-
import mpos.audio.audioflinger as AudioFlinger
121+
from mpos.audio.audioflinger import AudioFlinger
101122

102123
# Check if microphone is available
103124
if AudioFlinger.has_microphone():
@@ -149,7 +170,7 @@ if AudioFlinger.is_playing():
149170

150171
```python
151172
from mpos import Activity
152-
import mpos.audio.audioflinger as AudioFlinger
173+
from mpos.audio.audioflinger import AudioFlinger
153174
import lvgl as lv
154175
import time
155176

@@ -233,6 +254,8 @@ AudioFlinger implements a 3-tier priority-based audio focus system inspired by A
233254
### Example: Priority in Action
234255

235256
```python
257+
from mpos.audio.audioflinger import AudioFlinger
258+
236259
# Start playing music (priority 0)
237260
AudioFlinger.play_wav("music.wav", stream_type=AudioFlinger.STREAM_MUSIC)
238261

@@ -300,7 +323,7 @@ Audio device preference is configured in the Settings app under **"Advanced Sett
300323

301324
```python
302325
from mpos import Activity
303-
import mpos.audio.audioflinger as AudioFlinger
326+
from mpos.audio.audioflinger import AudioFlinger
304327
import lvgl as lv
305328

306329
class SimpleMusicPlayerActivity(Activity):
@@ -472,6 +495,8 @@ Check if buzzer is available for RTTTL playback.
472495
4. Use equal or higher priority stream type
473496

474497
```python
498+
from mpos.audio.audioflinger import AudioFlinger
499+
475500
# Check if playback was rejected
476501
success = AudioFlinger.play_wav("sound.wav", stream_type=AudioFlinger.STREAM_MUSIC)
477502
if not success:
@@ -582,25 +607,32 @@ ffmpeg -i input.wav -acodec pcm_s16le -ar 22050 -ac 1 output.wav
582607
**Possible causes:**
583608

584609
1. **No microphone available**
585-
```python
586-
if not AudioFlinger.has_microphone():
587-
print("No microphone on this device")
588-
```
610+
```python
611+
from mpos.audio.audioflinger import AudioFlinger
612+
613+
if not AudioFlinger.has_microphone():
614+
print("No microphone on this device")
615+
```
589616

590617
2. **Currently playing audio**
591-
```python
592-
# I2S can only be TX or RX, not both
593-
if AudioFlinger.is_playing():
594-
AudioFlinger.stop()
595-
time.sleep_ms(100) # Wait for cleanup
596-
AudioFlinger.record_wav("recording.wav")
597-
```
618+
```python
619+
from mpos.audio.audioflinger import AudioFlinger
620+
import time
621+
622+
# I2S can only be TX or RX, not both
623+
if AudioFlinger.is_playing():
624+
AudioFlinger.stop()
625+
time.sleep_ms(100) # Wait for cleanup
626+
AudioFlinger.record_wav("recording.wav")
627+
```
598628

599629
3. **Already recording**
600-
```python
601-
if AudioFlinger.is_recording():
602-
print("Already recording")
603-
```
630+
```python
631+
from mpos.audio.audioflinger import AudioFlinger
632+
633+
if AudioFlinger.is_recording():
634+
print("Already recording")
635+
```
604636

605637
4. **Wrong board** - Waveshare doesn't have a microphone
606638

@@ -635,6 +667,8 @@ ffmpeg -i input.wav -acodec pcm_s16le -ar 44100 -ac 2 output.wav
635667
AudioFlinger runs in a separate thread, so playback doesn't block the UI:
636668

637669
```python
670+
from mpos.audio.audioflinger import AudioFlinger
671+
638672
# This doesn't block - returns immediately
639673
AudioFlinger.play_wav("long_song.wav", stream_type=AudioFlinger.STREAM_MUSIC)
640674

@@ -663,6 +697,8 @@ On desktop builds (Linux/macOS), AudioFlinger provides simulated recording for t
663697
This allows testing the Sound Recorder app and other recording features without hardware.
664698

665699
```python
700+
from mpos.audio.audioflinger import AudioFlinger
701+
666702
# Desktop simulation is automatic when machine.I2S is not available
667703
# The generated WAV file contains a 440Hz tone
668704
AudioFlinger.record_wav("test.wav", duration_ms=5000)

0 commit comments

Comments
 (0)