A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 244 lines 9.3 kB view raw
1/*************************************************************************** 2 * __________ __ ___ 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * 9 * Copyright (C) 2014 by Ilia Sergachev: Initial Rockbox port to iBasso DX50 10 * Copyright (C) 2014 by Mario Basister: iBasso DX90 port 11 * Copyright (C) 2014 by Simon Rothen: Initial Rockbox repository submission, additional features 12 * Copyright (C) 2014 by Udo Schläpfer: Code clean up, additional features 13 * 14 * This program is free software; you can redistribute it and/or 15 * modify it under the terms of the GNU General Public License 16 * as published by the Free Software Foundation; either version 2 17 * of the License, or (at your option) any later version. 18 * 19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20 * KIND, either express or implied. 21 * 22 ****************************************************************************/ 23 24 25#include <stdio.h> 26#include <string.h> 27#include <stdlib.h> 28 29#include "config.h" 30#include "action.h" 31#include "button.h" 32#include "settings.h" 33 34 35/* 36 Button Code Definitions for iBasso DX50 & DX90. 37 38 The format of the list is as follows 39 40 { Action Code, Button code, Prereq button code } 41 42 If there's no need to check the previous button's value, use BUTTON_NONE. 43 CAVEAT: The action without prereq button code will allways be choosen if it has a 44 lower index in the list. 45 Insert LAST_ITEM_IN_LIST at the end of each mapping 46*/ 47 48 49static const struct button_mapping button_context_standard[] = 50{ 51 { ACTION_STD_CONTEXT, BUTTON_PLAY | BUTTON_REPEAT, BUTTON_PLAY }, 52 { ACTION_STD_OK, BUTTON_PLAY | BUTTON_REL, BUTTON_PLAY }, 53 { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, 54 { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, 55 { ACTION_STD_PREVREPEAT, BUTTON_LEFT | BUTTON_REPEAT, BUTTON_NONE }, 56 { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT | BUTTON_REPEAT, BUTTON_NONE }, 57 { ACTION_STD_CANCEL, BUTTON_POWER, BUTTON_NONE }, 58 59 LAST_ITEM_IN_LIST 60}; 61 62 63static const struct button_mapping button_context_wps[] = 64{ 65 { ACTION_WPS_MENU, BUTTON_POWER, BUTTON_NONE }, 66 { ACTION_WPS_CONTEXT, BUTTON_PLAY | BUTTON_REPEAT, BUTTON_NONE }, 67 { ACTION_WPS_PLAY, BUTTON_PLAY | BUTTON_REL, BUTTON_NONE }, 68 { ACTION_WPS_SEEKBACK, BUTTON_LEFT | BUTTON_REPEAT, BUTTON_NONE }, 69 { ACTION_WPS_SEEKFWD, BUTTON_RIGHT | BUTTON_REPEAT, BUTTON_NONE }, 70 { ACTION_WPS_STOPSEEK, BUTTON_LEFT | BUTTON_REL, BUTTON_LEFT | BUTTON_REPEAT }, 71 { ACTION_WPS_STOPSEEK, BUTTON_RIGHT | BUTTON_REL, BUTTON_RIGHT | BUTTON_REPEAT }, 72 { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT | BUTTON_REL, BUTTON_NONE }, 73 { ACTION_WPS_SKIPPREV, BUTTON_LEFT | BUTTON_REL, BUTTON_NONE }, 74 { ACTION_WPS_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 75 { ACTION_WPS_VOLUP, BUTTON_VOL_UP | BUTTON_REPEAT, BUTTON_NONE }, 76 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 77 { ACTION_WPS_VOLDOWN, BUTTON_VOL_DOWN | BUTTON_REPEAT, BUTTON_NONE }, 78 79 LAST_ITEM_IN_LIST 80}; 81 82 83static const struct button_mapping button_context_list[] = 84{ 85 { ACTION_LIST_VOLUP, BUTTON_VOL_UP | BUTTON_REPEAT, BUTTON_NONE }, 86 { ACTION_LIST_VOLUP, BUTTON_VOL_UP, BUTTON_NONE }, 87 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 88 { ACTION_LIST_VOLDOWN, BUTTON_VOL_DOWN | BUTTON_REPEAT, BUTTON_NONE }, 89 90 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 91}; 92 93 94static const struct button_mapping button_context_tree[] = 95{ 96 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 97}; 98 99 100static const struct button_mapping button_context_listtree_scroll_with_combo[] = 101{ 102 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM | CONTEXT_TREE), 103}; 104 105 106static const struct button_mapping button_context_listtree_scroll_without_combo[] = 107{ 108 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM | CONTEXT_TREE), 109}; 110 111 112static const struct button_mapping button_context_settings[] = 113{ 114 { ACTION_SETTINGS_INC, BUTTON_VOL_UP | BUTTON_REL, BUTTON_NONE }, 115 { ACTION_SETTINGS_INCREPEAT, BUTTON_VOL_UP | BUTTON_REPEAT, BUTTON_NONE }, 116 { ACTION_SETTINGS_DEC, BUTTON_VOL_DOWN | BUTTON_REL, BUTTON_NONE }, 117 { ACTION_SETTINGS_DECREPEAT, BUTTON_VOL_DOWN | BUTTON_REPEAT, BUTTON_NONE }, 118 119 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 120}; 121 122 123static const struct button_mapping button_context_settings_right_is_inc[] = 124{ 125 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 126}; 127 128 129static const struct button_mapping button_context_mainmenu[] = 130{ 131 { ACTION_TREE_WPS, BUTTON_POWER, BUTTON_NONE }, 132 133 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_TREE), 134}; 135 136 137static const struct button_mapping button_context_yesno[] = 138{ 139 { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, 140 { ACTION_YESNO_ACCEPT, BUTTON_LEFT, BUTTON_NONE }, 141 142 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), 143}; 144 145 146static const struct button_mapping button_context_colorchooser[] = 147{ 148 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), 149}; 150 151 152static const struct button_mapping button_context_eq[] = 153{ 154 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), 155}; 156 157 158static const struct button_mapping button_context_keyboard[] = 159{ 160 { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, 161 { ACTION_KBD_LEFT, BUTTON_LEFT | BUTTON_REPEAT, BUTTON_NONE }, 162 { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, 163 { ACTION_KBD_RIGHT, BUTTON_RIGHT | BUTTON_REPEAT, BUTTON_NONE }, 164 { ACTION_KBD_CURSOR_LEFT, BUTTON_PLAY | BUTTON_LEFT, BUTTON_NONE }, 165 { ACTION_KBD_CURSOR_LEFT, BUTTON_PLAY | BUTTON_LEFT | BUTTON_REPEAT, BUTTON_NONE }, 166 { ACTION_KBD_CURSOR_RIGHT, BUTTON_PLAY | BUTTON_RIGHT, BUTTON_NONE }, 167 { ACTION_KBD_CURSOR_RIGHT, BUTTON_PLAY | BUTTON_RIGHT | BUTTON_REPEAT, BUTTON_NONE }, 168 { ACTION_KBD_SELECT, BUTTON_PLAY, BUTTON_NONE }, 169 { ACTION_KBD_UP, BUTTON_VOL_UP, BUTTON_NONE }, 170 { ACTION_KBD_UP, BUTTON_VOL_UP | BUTTON_REPEAT, BUTTON_NONE }, 171 { ACTION_KBD_DOWN, BUTTON_VOL_DOWN, BUTTON_NONE }, 172 { ACTION_KBD_DOWN, BUTTON_VOL_DOWN | BUTTON_REPEAT, BUTTON_NONE }, 173 174 LAST_ITEM_IN_LIST 175}; 176 177 178 179static const struct button_mapping button_context_bmark[] = 180{ 181 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), 182}; 183 184 185static const struct button_mapping button_context_time[] = 186{ 187 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS), 188}; 189 190 191static const struct button_mapping button_context_quickscreen[] = 192{ 193 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 194}; 195 196 197static const struct button_mapping button_context_pitchscreen[] = 198{ 199 { ACTION_PS_INC_SMALL, BUTTON_VOL_UP | BUTTON_REL, BUTTON_NONE }, 200 { ACTION_PS_DEC_SMALL, BUTTON_VOL_DOWN |BUTTON_REL, BUTTON_NONE }, 201 { ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE }, 202 203 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) 204}; 205 206 207static const struct button_mapping button_context_radio[] = 208{ 209 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) 210}; 211 212 213const struct button_mapping* target_get_context_mapping(int context) 214{ 215 switch(context) 216 { 217 case CONTEXT_STD: { return button_context_standard; } 218 case CONTEXT_WPS: { return button_context_wps; } 219 case CONTEXT_LIST: { return button_context_list; } 220 case CONTEXT_MAINMENU: { return button_context_mainmenu; } 221 case CONTEXT_CUSTOM | CONTEXT_TREE: { return button_context_tree; } 222 case CONTEXT_SETTINGS: { return button_context_settings; } 223 case CONTEXT_SETTINGS_COLOURCHOOSER: { return button_context_colorchooser; } 224 case CONTEXT_SETTINGS_EQ: { return button_context_eq; } 225 case CONTEXT_SETTINGS_TIME: { return button_context_time; } 226 case CONTEXT_KEYBOARD: { return button_context_keyboard; } 227 case CONTEXT_FM: { return button_context_radio; } 228 case CONTEXT_BOOKMARKSCREEN: { return button_context_bmark; } 229 case CONTEXT_QUICKSCREEN: { return button_context_quickscreen; } 230 case CONTEXT_PITCHSCREEN: { return button_context_pitchscreen; } 231 case CONTEXT_CUSTOM | CONTEXT_SETTINGS: 232 case CONTEXT_SETTINGS_RECTRIGGER: { return button_context_settings_right_is_inc; } 233 case CONTEXT_TREE: 234 { 235 if(global_settings.hold_lr_for_scroll_in_list) 236 { 237 return button_context_listtree_scroll_without_combo; 238 } 239 return button_context_listtree_scroll_with_combo; 240 } 241 } 242 243 return button_context_standard; 244}