22import uos
33import _thread
44
5- from mpos .apps import Activity
5+ from mpos .apps import Activity , Intent
66import mpos .sdcard
77import mpos .ui
88
99class 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