A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 127 lines 3.8 kB view raw
1const std = @import("std"); 2 3pub const MAX_PATH = 260; 4pub const MAX_DIR_LEVELS = 10; 5 6const themable_icons = enum(c_int) { 7 NOICON = -2, 8 Icon_NOICON = -1, 9 Icon_Audio, 10 Icon_Folder, 11 Icon_Playlist, 12 Icon_Cursor, 13 Icon_Wps, 14 Icon_Firmware, 15 Icon_Font, 16 Icon_Language, 17 Icon_Config, 18 Icon_Plugin, 19 Icon_Bookmark, 20 Icon_Preset, 21 Icon_Queued, 22 Icon_Moving, 23 Icon_Keyboard, 24 Icon_Reverse_Cursor, 25 Icon_Questionmark, 26 Icon_Menu_setting, 27 Icon_Menu_functioncall, 28 Icon_Submenu, 29 Icon_Submenu_Entered, 30 Icon_Recording, 31 Icon_Voice, 32 Icon_General_settings_menu, 33 Icon_System_menu, 34 Icon_Playback_menu, 35 Icon_Display_menu, 36 Icon_Remote_Display_menu, 37 Icon_Radio_screen, 38 Icon_file_view_menu, 39 Icon_EQ, 40 Icon_Rockbox, 41 Icon_Last_Themeable, 42}; 43 44pub const browse_context = extern struct { 45 dirfilter: c_int, 46 flags: c_uint, // 'unsigned' is translated to 'c_uint' 47 title: [*c]const u8, // Nullable C string for the title 48 icon: themable_icons, // Enum 'themable_icons', assumed to be defined elsewhere 49 root: [*c]const u8, // Const C string for root directory path 50 selected: [*c]const u8, // Const C string for selected file name 51 buf: [*c]u8, // Buffer for the selected file 52 bufsize: usize, // Size of the buffer (translated to 'usize' for portability) 53}; 54 55const tree_cache = extern struct { 56 entries_handle: c_int, // Handle to the entry cache 57 name_buffer_handle: c_int, // Handle to the name cache 58 max_entries: c_int, // Maximum number of entries in the cache 59 name_buffer_size: c_int, // Size of the name buffer (in bytes) 60}; 61 62pub const tree_context = extern struct { 63 currdir: [MAX_PATH]u8, // Fixed-size array for the current directory 64 dirlevel: i32, // int in C is c_int in Zig 65 selected_item: i32, // Selected file/id3dbitem index 66 selected_item_history: [MAX_DIR_LEVELS]c_int, // History of selected items, fixed-size array 67 68 dirfilter: ?*c_int, // Nullable pointer to an int for file use 69 filesindir: i32, // Number of files in the directory cache 70 dirsindir: i32, // Directory use 71 dirlength: i32, // Total number of entries in directory 72 73 currtable: i32, 74 currextra: i32, 75 76 sort_dir: i32, // Directory sort order 77 out_of_tree: i32, // Shortcut from elsewhere 78 cache: tree_cache, // Struct tree_cache, defined elsewhere 79 80 dirfull: bool, 81 is_browsing: bool, 82 83 browse: ?*browse_context, // Pointer to browse_context, nullable 84}; 85pub const entry = extern struct { 86 name: ?*c_char, // Pointer to the name (nullable) 87 attr: c_int, // FAT attributes + file type flags 88 time_write: c_uint, // Last write time (unsigned) 89 customaction: c_int, // Custom action (for database use) 90}; 91 92extern fn tree_init() void; 93extern fn rockbox_browse(browse: ?*browse_context) c_int; 94extern fn rockbox_browse_at(path: [*]const u8) c_int; 95extern fn tree_get_context() *tree_context; 96extern fn tree_get_entries(t: *tree_context) *entry; 97extern fn tree_get_entry_at(t: *tree_context, index: c_int) *entry; 98 99pub fn _rockbox_browse() c_int { 100 var browse: browse_context = .{ 101 .dirfilter = 0, 102 .flags = 0, 103 .title = "demo", 104 .icon = themable_icons.Icon_NOICON, 105 .root = "/", 106 .selected = null, 107 .buf = null, 108 .bufsize = 0, 109 }; 110 return rockbox_browse(&browse); 111} 112 113pub fn _tree_get_context() tree_context { 114 const tc = tree_get_context(); 115 return tc.*; 116} 117 118pub fn _tree_get_entries() *entry { 119 const tc = tree_get_context(); 120 return tree_get_entries(tc); 121} 122 123pub fn _tree_get_entry_at(index: c_int) entry { 124 const tc = tree_get_context(); 125 const e = tree_get_entry_at(tc, index); 126 return e.*; 127}