A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 107 lines 4.3 kB view raw
1--Bilgus 12-2016 2--revisited 8-2019 3require "actions" 4require "buttons" 5require "sound" 6require "audio" 7TIMEOUT = 0 8 9local SOUND_VOLUME = rb.sound_settings.SOUND_VOLUME 10rb.sound_settings = nil 11package.loaded["sound_defines"] = nil 12 13function say_msg(message, timeout) 14 rb.splash(1, message) 15 rb.sleep(timeout * rb.HZ) 16end 17 18function say_value(value,message,timeout) 19 local message = string.format(message .. "%d", value) 20 say_msg(message, timeout) 21end 22 23function ShowMainMenu() -- we invoke this function every time we want to display the main menu of the script 24local s = 0 25local mult = 1 26local unit = " Minutes" 27 28 29 while s == 0 or s == 5 do -- don't exit of program until user selects Exit 30 if mult < 1 then 31 mult = 1 32 s = 0 33 end 34 mainmenu = {"More", mult * 1 .. unit, mult * 5 .. unit, mult * 10 .. unit, mult * 15 .. unit, "Less", "Exit"} -- define the items of the menu 35 s = rb.do_menu("Reduce volume + sleep over", mainmenu, s, false) -- actually tell Rockbox to draw the menu 36 37 -- In the line above: "Test" is the title of the menu, mainmenu is an array with the items 38 -- of the menu, nil is a null value that needs to be there, and the last parameter is 39 -- whether the theme should be drawn on the menu or not. 40 -- the variable s will hold the index of the selected item on the menu. 41 -- the index is zero based. This means that the first item is 0, the second one is 1, etc. 42 if s == 0 then mult = mult + 1 43 elseif s == 1 then TIMEOUT = mult 44 elseif s == 2 then TIMEOUT = mult * 5 45 elseif s == 3 then TIMEOUT = mult * 10 46 elseif s == 4 then TIMEOUT = mult * 15 47 elseif s == 5 then mult = mult - 1 -- User selected to exit 48 elseif s == 6 then os.exit() -- User selected to exit 49 elseif s == -2 then os.exit() -- -2 index is returned from do_menu() when user presses the key to exit the menu (on iPods, it's the left key). 50 -- In this case, user probably wants to exit (or go back to last menu). 51 else rb.splash(2 * rb.HZ, "Error! Selected index: " .. s) -- something strange happened. The program shows this message when 52 -- the selected item is not on the index from 0 to 3 (in this case), and displays 53 -- the selected index. Having this type of error handling is not 54 -- required, but it might be nice to have Especially while you're still 55 -- developing the plugin. 56 end 57 end 58end 59 60ShowMainMenu() 61rb.set_sleeptimer_duration(TIMEOUT) 62rb.lcd_clear_display() 63rb.lcd_update() 64 65local volume = rb.sound_current(SOUND_VOLUME) 66local vol_min = rb.sound_min(SOUND_VOLUME) 67local volsteps = -(vol_min - volume) 68local seconds = (TIMEOUT * 60) / volsteps 69local sec_left = (TIMEOUT * 60) 70local hb = 0 71local action = rb.get_action(rb.contexts.CONTEXT_STD, 0) 72 if rb.audio_status() == 1 then 73 while ((volume > vol_min) and (action ~= rb.actions.ACTION_STD_CANCEL)) do 74 rb.lcd_clear_display() 75 say_value(volume,sec_left .. " Sec, Volume: ", 1) 76 local i = seconds * 2 77 while ((i > 0) and (action ~= rb.actions.ACTION_STD_CANCEL)) do 78 i = i - 1 79 rb.lcd_drawline(hb, 1, hb, 1) 80 rb.lcd_update() 81 if hb >= rb.LCD_WIDTH then 82 hb = 0 83 rb.lcd_clear_display() 84 say_value(volume,sec_left .. " Sec, Volume: ", 1) 85 end 86 hb = hb + 1 87 rb.sleep(rb.HZ / 2) 88 action = rb.get_action(rb.contexts.CONTEXT_STD, 0) 89 rb.yield() 90 end 91 volume = volume - 1 92 rb.sound_set(SOUND_VOLUME, volume); 93 sec_left = sec_left - seconds 94 95 end 96 rb.audio_stop() 97 rb.lcd_clear_display() 98 rb.lcd_update() 99 100 os.exit(1, "Playback Stopped") 101 102 else 103 rb.lcd_clear_display() 104 rb.lcd_update() 105 106 os.exit(2, "Nothing is playing") 107 end