Skip to content

Commit 4afcd04

Browse files
Music Player app: scale volume
1 parent b056c77 commit 4afcd04

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

internal_filesystem/apps/com.micropythonos.musicplayer/assets/audio_player.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import machine
12
import os
23
import time
34

@@ -96,13 +97,12 @@ def play_wav(cls, filename):
9697
ibuf=32000
9798
)
9899
except Exception as e:
99-
print("Warning: error initializing I2S audio device, simulating playback...")
100+
print(f"Warning: simulating playback due to error initializing I2S audio device: {e}")
100101

101102
print(f"Playing {data_size} bytes (vol {cls._volume}%) …")
102103
f.seek(data_start)
103104

104105
chunk_size = 4096 # 4 KB → safe on ESP32
105-
scale = cls._volume / 100.0 # float 0.0-1.0
106106

107107
total = 0
108108
while total < data_size:
@@ -112,13 +112,14 @@ def play_wav(cls, filename):
112112
break
113113

114114
# ---- on-the-fly volume scaling (16-bit little-endian) ----
115-
if scale < 1.0:
116-
# convert bytes → array of signed ints → scale → back to bytes
117-
import array
118-
samples = array.array('h', raw) # 'h' = signed short
119-
for i in range(len(samples)):
120-
samples[i] = int(samples[i] * scale)
121-
raw = samples.tobytes()
115+
scale = cls._volume / 100.0 # float 0.0-1.0
116+
if scale < 0.9:
117+
scaled = bytearray(len(raw))
118+
for i in range(0, len(raw), 2):
119+
sample = int.from_bytes(raw[i:i+2], 'little', True)
120+
sample = int(sample * scale)
121+
scaled[i:i+2] = sample.to_bytes(2, 'little', True)
122+
raw = bytes(scaled)
122123
# ---------------------------------------------------------
123124

124125
if cls._i2s:

internal_filesystem/apps/com.micropythonos.musicplayer/assets/music_player.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ def onCreate(self):
5959
self._filename = self.getIntent().extras.get("filename")
6060
qr_screen = lv.obj()
6161
self._slider_label=lv.label(qr_screen)
62-
self._slider_label.set_text(f"Volume: 100%")
62+
self._slider_label.set_text(f"Volume: {AudioPlayer.get_volume()}%")
6363
self._slider_label.align(lv.ALIGN.TOP_MID,0,lv.pct(4))
6464
self._slider=lv.slider(qr_screen)
6565
self._slider.set_range(0,100)
66-
self._slider.set_value(100,False)
67-
self._slider.set_width(lv.pct(80))
66+
self._slider.set_value(AudioPlayer.get_volume(), False)
67+
self._slider.set_width(lv.pct(90))
6868
self._slider.align_to(self._slider_label,lv.ALIGN.OUT_BOTTOM_MID,0,10)
6969
def volume_slider_changed(e):
7070
volume_int = self._slider.get_value()
7171
self._slider_label.set_text(f"Volume: {volume_int}%")
72-
# TODO: set volume using AudioPlayer.set_volume(volume_int)
72+
AudioPlayer.set_volume(volume_int)
7373
self._slider.add_event_cb(volume_slider_changed,lv.EVENT.VALUE_CHANGED,None)
7474
self._filename_label = lv.label(qr_screen)
7575
self._filename_label.align(lv.ALIGN.CENTER,0,0)

0 commit comments

Comments
 (0)