Skip to content

Commit f0a929e

Browse files
Audio Player app: separate player screen
1 parent 9b4cc3f commit f0a929e

File tree

1 file changed

+55
-21
lines changed
  • internal_filesystem/apps/com.micropythonos.musicplayer/assets

1 file changed

+55
-21
lines changed

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

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
import uos
33
import _thread
44

5-
from mpos.apps import Activity
5+
from mpos.apps import Activity, Intent
66
import mpos.sdcard
77
import mpos.ui
88

99
class MusicPlayer(Activity):
1010

1111
# Widgets:
1212
file_explorer = None
13-
_slider_label = None
14-
_slider = None
1513

1614
def onCreate(self):
1715
screen = lv.obj()
@@ -21,19 +19,6 @@ def onCreate(self):
2119
self.file_explorer.explorer_open_dir('M:/')
2220
self.file_explorer.align(lv.ALIGN.CENTER, 0, 0)
2321
self.file_explorer.add_event_cb(self.file_explorer_event_cb, lv.EVENT.ALL, None)
24-
self._slider_label=lv.label(screen)
25-
self._slider_label.set_text(f"Volume: 100%")
26-
self._slider_label.align(lv.ALIGN.TOP_MID,0,lv.pct(4))
27-
self._slider=lv.slider(screen)
28-
self._slider.set_range(0,100)
29-
self._slider.set_value(100,False)
30-
self._slider.set_width(lv.pct(80))
31-
self._slider.align_to(self._slider_label,lv.ALIGN.OUT_BOTTOM_MID,0,10)
32-
def volume_slider_changed(e):
33-
volume_int = self._slider.get_value()
34-
self._slider_label.set_text(f"Volume: {volume_int}%")
35-
# TODO: set volume using AudioPlayer.set_volume(volume_int)
36-
self._slider.add_event_cb(volume_slider_changed,lv.EVENT.VALUE_CHANGED,None)
3722
self.setContentView(screen)
3823

3924
def onResume(self, screen):
@@ -52,12 +37,14 @@ def file_explorer_event_cb(self, event):
5237
fullpath = f"{clean_path}{file}"
5338
print(f"Selected: {fullpath}")
5439
if fullpath.lower().endswith('.wav'):
55-
_thread.stack_size(mpos.apps.good_stack_size())
56-
_thread.start_new_thread(self.play_wav, (fullpath,))
40+
self.destination = FullscreenPlayer
41+
self.startActivity(Intent(activity_class=FullscreenPlayer).putExtra("filename", fullpath))
5742
else:
5843
print("INFO: ignoring unsupported file format")
5944

60-
def find_data_chunk(self, f):
45+
class AudioPlayer:
46+
47+
def find_data_chunk(f):
6148
"""Skip chunks until 'data' is found. Returns (data_start_pos, data_size)."""
6249
# Go back to start
6350
f.seek(0)
@@ -100,15 +87,15 @@ def find_data_chunk(self, f):
10087
pos += 1
10188
raise ValueError("No 'data' chunk found")
10289

103-
def play_wav(self, filename):
90+
def play_wav(filename):
10491
"""Play large WAV files robustly with chunk skipping and streaming."""
10592
try:
10693
with open(filename, 'rb') as f:
10794
stat = uos.stat(filename)
10895
file_size = stat[6]
10996
print(f"File size: {file_size} bytes")
11097

111-
data_start, data_size, sample_rate = self.find_data_chunk(f)
98+
data_start, data_size, sample_rate = AudioPlayer.find_data_chunk(f)
11299
print(f"Found 'data' chunk: {data_size} bytes at {sample_rate} Hz")
113100

114101
if data_size > file_size - data_start:
@@ -150,3 +137,50 @@ def play_wav(self, filename):
150137
i2s.deinit()
151138
except:
152139
pass
140+
141+
142+
143+
class FullscreenPlayer(Activity):
144+
# No __init__() so super.__init__() will be called automatically
145+
146+
# Widgets:
147+
_filename_label = None
148+
_slider_label = None
149+
_slider = None
150+
151+
# Internal state:
152+
_filename = None
153+
154+
def onCreate(self):
155+
self._filename = self.getIntent().extras.get("filename")
156+
qr_screen = lv.obj()
157+
#qr_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
158+
#qr_screen.set_scroll_dir(lv.DIR.NONE)
159+
self._slider_label=lv.label(qr_screen)
160+
self._slider_label.set_text(f"Volume: 100%")
161+
self._slider_label.align(lv.ALIGN.TOP_MID,0,lv.pct(4))
162+
self._slider=lv.slider(qr_screen)
163+
self._slider.set_range(0,100)
164+
self._slider.set_value(100,False)
165+
self._slider.set_width(lv.pct(80))
166+
self._slider.align(lv.ALIGN.LEFT_MID,0,0)
167+
def volume_slider_changed(e):
168+
volume_int = self._slider.get_value()
169+
self._slider_label.set_text(f"Volume: {volume_int}%")
170+
# TODO: set volume using AudioPlayer.set_volume(volume_int)
171+
self._slider.add_event_cb(volume_slider_changed,lv.EVENT.VALUE_CHANGED,None)
172+
self._filename_label = lv.label(qr_screen)
173+
self._filename_label.align_to(self._slider,lv.ALIGN.OUT_BOTTOM_MID,0,10)
174+
self._filename_label.set_text(self._filename)
175+
focusgroup = lv.group_get_default()
176+
if focusgroup:
177+
focusgroup.add_obj(qr_screen)
178+
self.setContentView(qr_screen)
179+
180+
def onResume(self, screen):
181+
if not self._filename:
182+
print("Not playing any file...")
183+
else:
184+
print("Starting thread to play file {self._filename}")
185+
_thread.stack_size(mpos.apps.good_stack_size())
186+
_thread.start_new_thread(AudioPlayer.play_wav, (self._filename,))

0 commit comments

Comments
 (0)