diff --git a/scriptmodules/supplementary/bgm123.sh b/scriptmodules/supplementary/bgm123.sh index 67a87545..6494e68f 100644 --- a/scriptmodules/supplementary/bgm123.sh +++ b/scriptmodules/supplementary/bgm123.sh @@ -13,65 +13,84 @@ rp_module_id="bgm123" rp_module_desc="Straightforward background music player using mpg123" rp_module_help="Place your MP3 files in $datadir/bgm" rp_module_section="exp" -rp_module_flags="!all rpi" +rp_module_flags="" + +function _get_vars_bgm123() { + case "$1" in + autostart) echo "$configdir/all/autostart.sh" ;; + bashrc) echo "$home/.bashrc" ;; + onstart) echo "$configdir/all/runcommand-onstart.sh" ;; + onend) echo "$configdir/all/runcommand-onend.sh" ;; + autoconf) echo "$configdir/all/$md_id.cfg" ;; + menudir) echo "$datadir/retropiemenu" ;; + init) echo "$md_inst/bgm_start.sh" ;; + killscript) echo "$md_inst/bgm_stop.sh" ;; + fadescript) echo "$md_inst/bgm_fade.sh" ;; + esac +} function depends_bgm123() { getDepends mpg123 } -function _autostart_bgm123() { - echo "$configdir/all/autostart.sh" -} +function install_bin_bgm123() { + local autoconf="$(_get_vars_bgm123 autoconf)" + local menudir="$(_get_vars_bgm123 menudir)" + local file + local scripts=( + 'bgm_start.sh' + 'bgm_stop.sh' + 'bgm_fade.sh' + ) + + # copy scripts and include config + for file in "${scripts[@]}"; do + cp "$md_data/$file" "$md_inst" + sed -i 's|.*#autoconf.*|source "'"$autoconf"'" #autoconf|' "$md_inst/$file" + done -function _bashrc_bgm123() { - echo "$home/.bashrc" + # create rp menu items + cp -f "$md_data/icon.png" "$menudir/icons/$md_id.png" + touch "$menudir/$md_id.rp" + chown -R $user:$user "$menudir" } -function _onstart_bgm123() { - echo "$configdir/all/runcommand-onstart.sh" -} +function configure_bgm123() { + local autostart="$(_get_vars_bgm123 autostart)" + local bashrc="$(_get_vars_bgm123 bashrc)" + local onstart="$(_get_vars_bgm123 onstart)" + local onend="$(_get_vars_bgm123 onend)" + local autoconf="$(_get_vars_bgm123 autoconf)" + local menudir="$(_get_vars_bgm123 menudir)" + local share="$datadir/bgm" + local file -function _onend_bgm123() { - echo "$configdir/all/runcommand-onend.sh" -} + # find gamelist + local gamelist="$menudir/gamelist.xml" + [[ -f "$gamelist" ]] || gamelist="$configdir/all/emulationstation/gamelists/retropie/gamelist.xml" -function _gamelist_bgm123() { - local xmlfile="$datadir/retropiemenu/gamelist.xml" - [[ -f "$xmlfile" ]] || xmlfile="$configdir/all/emulationstation/gamelists/retropie/gamelist.xml" - echo "$xmlfile" -} + if [[ "$md_mode" == "remove" ]]; then + # remove menu items and network share -function install_bin_bgm123() { - local autostart - autostart="$(_autostart_bgm123)" - local bashrc - bashrc="$(_bashrc_bgm123)" - local onstart - onstart="$(_onstart_bgm123)" - local onend - onend="$(_onend_bgm123)" - local gamelist - gamelist="$(_gamelist_bgm123)" - - local scriptname="bgm_vol_fade.sh" - local share="$datadir/bgm" - local file + rm -f "$menudir/$md_id.rp" "$menudir/icons/$md_id.png" + xmlstarlet ed -L -d "/gameList/game[contains(path,'$md_id.rp')]" "$gamelist" + toggle_bgm123 "off" + remove_share_samba "bgm" + restart_samba + + return + fi + + # preserve original file versions for file in "$autostart" "$bashrc" "$onstart" "$onend"; do - # preserve original file versions if [[ -f "$file" && ! -f "$file.old.$md_id" ]]; then cp -v "$file" "$file.old.$md_id" chown $user:$user "$file.old.$md_id" fi done - cp "$md_data/$scriptname" "$md_inst" - chmod +x "$md_inst/$scriptname" - - touch "$datadir/retropiemenu/$md_id.rp" - cp "$md_data/icon.png" "$datadir/retropiemenu/icons/$md_id.png" - chown -R $user:$user "$datadir/retropiemenu" - + # add gamelist entry if ! grep "./$md_id.rp" "$gamelist" >/dev/null; then xmlstarlet ed -L -s "/gameList" -t elem -n "gameTMP" \ -s "//gameTMP" -t elem -n path -v "./$md_id.rp" \ @@ -82,132 +101,145 @@ function install_bin_bgm123() { "$gamelist" fi + # create user config + local tmp="$(mktemp)" + iniConfig "=" '"' "$tmp" + echo '# Configuration file for bgm123' > "$tmp" + iniSet "status" "enabled" + iniSet "mixer_channel" "HDMI" + iniSet "music_player" "mpg123" + iniSet "music_dir" "$share" + iniSet "mapped_volume" "enabled" + copyDefaultConfig "$tmp" "$autoconf" + rm -f "$tmp" + + # check for enable + iniConfig "=" '"' "$autoconf" + iniGet "status" + [[ "$ini_value" == "enabled" ]] && toggle_bgm123 on + + # add music dir and network share mkUserDir "$share" add_share_samba "bgm" "$share" restart_samba } -function disable_bgm123() { - local autostart - autostart="$(_autostart_bgm123)" - local bashrc - bashrc="$(_bashrc_bgm123)" - local onstart - onstart="$(_onstart_bgm123)" - local onend - onend="$(_onend_bgm123)" +function toggle_bgm123() { + local autostart="$(_get_vars_bgm123 autostart)" + local bashrc="$(_get_vars_bgm123 bashrc)" + local onstart="$(_get_vars_bgm123 onstart)" + local onend="$(_get_vars_bgm123 onend)" + local init="$(_get_vars_bgm123 init)" + local killscript="$(_get_vars_bgm123 killscript)" + local fadescript="$(_get_vars_bgm123 fadescript)" local file - # kill player now since .bashrc won't do it later - (vcgencmd force_audio hdmi 0) >/dev/null - pkill mpg123 - + # backup files and attempt to remove any existing bgm config for file in "$autostart" "$bashrc" "$onstart" "$onend"; do if [[ -f "$file" ]]; then - # backup file and attempt to remove any existing bgm config cp -f "$file" "$file.bak" chown $user:$user "$file.bak" sed -i '/#bgm/d' "$file" - - # if file is now empty, remove it - [[ ! -s "$file" ]] && rm -f "$file" fi done -} -function remove_bgm123() { - local gamelist - gamelist="$(_gamelist_bgm123)" + # enable with toggle "on" or "enable(d)" + # disable with anything else + if [[ "$1" == "on" || "$1" == "enable"?("d") ]]; then + for file in "$autostart" "$bashrc" "$onstart" "$onend"; do + touch "$file" + chown $user:$user "$file" + done - rm -f "$datadir/retropiemenu/$md_id.rp" "$datadir/retropiemenu/icons/$md_id.png" - xmlstarlet ed -L -d "/gameList/game[contains(path,'$md_id.rp')]" "$gamelist" - - disable_bgm123 - remove_share_samba "bgm" - restart_samba -} + echo "$(echo -e 'while pgrep omxplayer >/dev/null; do sleep 1; done #bgm123\n(sleep 10; bash "'"$init"'") & #bgm123'; cat $autostart)" > "$autostart" + echo '[[ "$(tty)" == "/dev/tty1" ]] && (bash "'"$killscript"'" &) #bgm123' >> "$bashrc" + echo "$(echo 'bash "'"$fadescript"'" -STOP & #bgm123'; cat $onstart)" > "$onstart" + echo '(sleep 1; bash "'"$fadescript"'" -CONT) & #bgm123' >> "$onend" -function enable_bgm123() { - local autostart - autostart="$(_autostart_bgm123)" - local bashrc - bashrc="$(_bashrc_bgm123)" - local onstart - onstart="$(_onstart_bgm123)" - local onend - onend="$(_onend_bgm123)" - - local fadescript="$md_inst/bgm_vol_fade.sh" - local file - - disable_bgm123 - - for file in "$autostart" "$bashrc" "$onstart" "$onend"; do - touch "$file" - chown $user:$user "$file" - done + printMsgs "console" "Background music enabled." + else + # kill player now since .bashrc won't do it later + su "$user" -c "bash $killscript" - echo -e "$(echo -e 'while pgrep omxplayer >/dev/null; do sleep 1; done #bgm123\n((vcgencmd force_audio hdmi 1) >/dev/null; sleep 8; mpg123 -Z "'$datadir'/bgm/"*.[mM][pP]3 >/dev/null 2>&1) & #bgm123'; cat $autostart)" > "$autostart" - echo -e '[[ "$(tty)" == "/dev/tty1" ]] && ((vcgencmd force_audio hdmi 0) >/dev/null; pkill mpg123) #bgm123' >> "$bashrc" - echo -e '"'"$fadescript"'" -STOP & #bgm123' >> "$onstart" - echo -e '(sleep 1; "'"$fadescript"'" -CONT) & #bgm123' >> "$onend" -} + for file in "$onstart" "$onend"; do + # if file is now empty, remove it + [[ -f "$file" && ! -s "$file" ]] && rm -f "$file" + done -function configure_bgm123() { - [[ "$md_mode" == "install" ]] && enable_bgm123 + printMsgs "console" "Background music disabled." + fi } -function play_pause_bgm123() { - if pgrep mpg123 >/dev/null; then - su "$user" -c "$md_inst/bgm_vol_fade.sh &" - else - su "$user" -c "((vcgencmd force_audio hdmi 1) >/dev/null; sleep 1; mpg123 -Z $datadir/bgm/*.[mM][pP]3 >/dev/null 2>&1) &" - fi +# dummy enable/disable functions for CLI +function disable_bgm123() { + toggle_bgm123 off } -function next_track_bgm123() { - pkill mpg123 - su "$user" -c "((vcgencmd force_audio hdmi 1) >/dev/null; sleep 1; mpg123 -Z $datadir/bgm/*.[mM][pP]3 >/dev/null 2>&1) &" +function enable_bgm123() { + toggle_bgm123 on } function gui_bgm123() { - local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --menu "Choose an option for $md_id" 22 86 16) + local autoconf="$(_get_vars_bgm123 autoconf)" + iniConfig "=" '"' "$autoconf" + + local autostart="$(_get_vars_bgm123 autostart)" + local init="$(_get_vars_bgm123 init)" + local killscript="$(_get_vars_bgm123 killscript)" + local fadescript="$(_get_vars_bgm123 fadescript)" + + local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --menu "Configuration for $md_id. Please choose an option." 22 86 16) while true; do - local enabled=0 - grep '#bgm123' "$configdir/all/autostart.sh" >/dev/null && enabled=1 - local options=() - if [[ "$enabled" -eq 1 ]]; then - options+=( - E "Enable or disable background music (currently: Enabled)" - ) - if pgrep emulationstatio >/dev/null; then - options+=( - P "Play / pause" - N "Next track" - ) - fi - else + # check if bgm code is actually enabled in autostart + local status="disabled" + grep '#bgm123' "$autostart" >/dev/null && status="enabled" + + local mapped + iniGet "mapped_volume" && mapped="$ini_value" + + local options=( + 1 "Enable or disable background music (currently: ${status^})" + 2 "Enable or disable mapped volume profile (currently: ${mapped^})" + ) + if [[ "$status" == "enabled" ]] && pgrep emulationstatio >/dev/null; then options+=( - E "Enable or disable background music (currently: Disabled)" + P "Play / pause" + N "Next track" ) fi + local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) if [[ -n "$choice" ]]; then case "$choice" in - E) - if [[ "$enabled" -eq 1 ]]; then - disable_bgm123 + 1) + if [[ "$status" == "enabled" ]]; then + toggle_bgm123 off + iniSet "status" "disabled" printMsgs "dialog" "Background music disabled." else - enable_bgm123 + toggle_bgm123 on + iniSet "status" "enabled" printMsgs "dialog" "Background music enabled." fi ;; + 2) + if [[ "$mapped" == "enabled" ]]; then + iniSet "mapped_volume" "disabled" + printMsgs "dialog" "Mapped volume disabled." + else + iniSet "mapped_volume" "enabled" + printMsgs "dialog" "Mapped volume enabled." + fi + ;; P) - play_pause_bgm123 + if pgrep mpg123 >/dev/null; then + su "$user" -c "bash $fadescript &" + else + su "$user" -c "bash $init &" + fi ;; N) - next_track_bgm123 + su "$user" -c "(bash $killscript; sleep 1; bash $init) &" ;; esac else diff --git a/scriptmodules/supplementary/bgm123/bgm_vol_fade.sh b/scriptmodules/supplementary/bgm123/bgm_fade.sh similarity index 67% rename from scriptmodules/supplementary/bgm123/bgm_vol_fade.sh rename to scriptmodules/supplementary/bgm123/bgm_fade.sh index d374057e..1ed1184c 100644 --- a/scriptmodules/supplementary/bgm123/bgm_vol_fade.sh +++ b/scriptmodules/supplementary/bgm123/bgm_fade.sh @@ -9,6 +9,8 @@ # https://github.com/crcerror/RetroPie-Shares/blob/master/BGM_vol_fade.sh # +source #autoconf + # avoid multiple starts wait=0 while [[ "$(pgrep -c -f $(basename $0))" -gt 1 ]]; do @@ -18,11 +20,17 @@ while [[ "$(pgrep -c -f $(basename $0))" -gt 1 ]]; do done # get mixer channel and player name -readonly MIXER_CHANNEL="HDMI" -readonly MUSIC_PLAYER="mpg123" +readonly MIXER_CHANNEL="$mixer_channel" +readonly MUSIC_PLAYER="$music_player" + +# command for amixer (use -M for mapped volume) +# don't quote $MIXER in commands when -M (or any params) are used +MIXER="amixer" +[[ "$mapped_volume" == "enabled" ]] && MIXER="amixer -M" +readonly MIXER # get mixer volume -readonly VOLUME_RAW="$(amixer -M get $MIXER_CHANNEL | grep -o '...%')" +readonly VOLUME_RAW="$($MIXER get $MIXER_CHANNEL | grep -o '...%')" readonly MIXER_VOLUME="${VOLUME_RAW//[![:digit:]]}" # get player status @@ -35,30 +43,32 @@ fade_volume="" volume_step="" function setStep() { + # set dynamic step size for true volume case "$fade_volume" in [1-4][0-9]|50) volume_step="5" ;; [5-7][0-9]|80) volume_step="3" ;; - [8-9][0-9]|100) volume_step="2" ;; + [8-9][0-9]|100) volume_step="1" ;; *) volume_step="5" ;; esac } function volumeZero() { - amixer -q -M set "$MIXER_CHANNEL" 0% + $MIXER -q set "$MIXER_CHANNEL" 0% } function volumeReset() { - amixer -q -M set "$MIXER_CHANNEL" "${MIXER_VOLUME}%" + $MIXER -q set "$MIXER_CHANNEL" "${MIXER_VOLUME}%" } # if flag -(s)top, or status=(r)unning or interruptable (s)leep if [[ "${PLAYER_STATUS,,}" == *s* || "${PLAYER_STATUS,,}" == *r* ]]; then # fade out and stop player fade_volume="$MIXER_VOLUME" + volume_step="$[$MIXER_VOLUME /20]" until [[ "$fade_volume" -le 10 ]]; do - setStep + [[ "$mapped_volume" == "enabled" ]] || setStep fade_volume="$[$fade_volume -$volume_step]" - amixer -q -M set "$MIXER_CHANNEL" "${fade_volume}%" + $MIXER -q set "$MIXER_CHANNEL" "${fade_volume}%" sleep 0.1 done volumeZero @@ -73,10 +83,11 @@ elif [[ "${PLAYER_STATUS,,}" == *t* ]]; then sleep 0.5 pkill -CONT "$MUSIC_PLAYER" fade_volume="10" + volume_step="$[$MIXER_VOLUME /20]" until [[ "$fade_volume" -ge "$MIXER_VOLUME" ]]; do - setStep + [[ "$mapped_volume" == "enabled" ]] || setStep fade_volume="$[$fade_volume +$volume_step]" - amixer -q -M set "$MIXER_CHANNEL" "${fade_volume}%" + $MIXER -q set "$MIXER_CHANNEL" "${fade_volume}%" sleep 0.2 done volumeReset diff --git a/scriptmodules/supplementary/bgm123/bgm_start.sh b/scriptmodules/supplementary/bgm123/bgm_start.sh new file mode 100644 index 00000000..c3ad1ea2 --- /dev/null +++ b/scriptmodules/supplementary/bgm123/bgm_start.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# bgm123 init script for RetroPie + +source #autoconf + +vcgencmd force_audio hdmi 1 >/dev/null && sleep 0.1 +pgrep emulationstatio >/dev/null && mpg123 -Z "$music_dir/"*.[mM][pP]3 >/dev/null 2>&1 diff --git a/scriptmodules/supplementary/bgm123/bgm_stop.sh b/scriptmodules/supplementary/bgm123/bgm_stop.sh new file mode 100644 index 00000000..2c776ac3 --- /dev/null +++ b/scriptmodules/supplementary/bgm123/bgm_stop.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# bgm123 kill script for RetroPie + +source #autoconf + +vcgencmd force_audio hdmi 0 >/dev/null && sleep 0.1 +pkill -9 "$music_player"