A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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}