srctree

Andrew Kelley parent af9a47ba 4223a56c
sending the waveforms to the client

client/main.zig added: 20, removed: 7, total 13
@@ -4,6 +4,7 @@ const assert = std.debug.assert;
const gpa = std.heap.wasm_allocator;
const protocol = @import("shared").protocol;
const Db = @import("shared").Db;
const Twi = @import("shared").Twi;
 
const js = struct {
extern "js" fn log(ptr: [*]const u8, len: usize) void;
@@ -59,7 +60,7 @@ fn Slice(T: type) type {
}
 
var db = Db.empty;
var message_buffer: std.ArrayListAlignedUnmanaged(u8, @alignOf(u32)) = .{};
var message_buffer: std.ArrayListAlignedUnmanaged(u8, @alignOf(u64)) = .{};
/// Nanoseconds.
var server_base_timestamp: i64 = 0;
/// Milliseconds.
@@ -89,11 +90,15 @@ fn currentTimeMessage(msg_bytes: []u8) void {
server_base_timestamp = @bitCast(msg_bytes[1..][0..8].*);
}
 
const waveform_size_bytes = Db.waveform_width / Twi.slice_len * 3 * @sizeOf(u64);
 
fn fullLibraryMessage(msg_bytes: []u8) error{OutOfMemory}!void {
const Header = protocol.FullLibraryHeader;
const header: Header = @bitCast(msg_bytes[0..@sizeOf(Header)].*);
 
const files_start = @sizeOf(Header);
const waveforms_start = @sizeOf(Header);
const waveforms_end = waveforms_start + header.files_len * waveform_size_bytes;
const files_start = waveforms_end;
const files_end = files_start + header.files_len * @sizeOf(Db.File);
const directories_start = files_end;
const directories_end = directories_start + header.flags.directories_len * @sizeOf(Db.Path);
@@ -101,10 +106,11 @@ fn fullLibraryMessage(msg_bytes: []u8) error{OutOfMemory}!void {
const albums_end = albums_start + header.albums_len * @sizeOf(Db.Album);
const string_bytes = msg_bytes[albums_end..][0..header.string_bytes_len];
 
const waveforms: []const u64 = @alignCast(std.mem.bytesAsSlice(u64, msg_bytes[waveforms_start..waveforms_end]));
const files: []const Db.File = @alignCast(std.mem.bytesAsSlice(Db.File, msg_bytes[files_start..files_end]));
const directories: []const Db.Path = @alignCast(std.mem.bytesAsSlice(Db.Path, msg_bytes[directories_start..directories_end]));
const albums: []const Db.Album = @alignCast(std.mem.bytesAsSlice(Db.Album, msg_bytes[albums_start..albums_end]));
try updateDb(files, directories, albums, string_bytes);
try updateDb(waveforms, files, directories, albums, string_bytes);
}
 
fn playQueueMessage(msg_bytes: []u8) error{OutOfMemory}!void {
@@ -155,11 +161,13 @@ fn playQueueMessage(msg_bytes: []u8) error{OutOfMemory}!void {
}
 
fn updateDb(
waveforms: []const u64,
files: []const Db.File,
directories: []const Db.Path,
albums: []const Db.Album,
string_bytes: []const u8,
) !void {
try db.waveforms.appendSlice(gpa, waveforms);
try db.string_bytes.appendSlice(gpa, string_bytes);
 
try db.files.entries.resize(gpa, files.len);
 
server/main.zig added: 20, removed: 7, total 13
@@ -290,10 +290,12 @@ pub const Server = struct {
const timestamp_message: protocol.CurrentTime = .{ .base = s.now() };
try ws.writeMessage(std.mem.asBytes(&timestamp_message));
 
const waveforms = std.mem.sliceAsBytes(s.db.waveforms.items);
const files = std.mem.sliceAsBytes(s.db.files.keys());
const directories = std.mem.sliceAsBytes(s.db.directories.keys());
const albums = std.mem.sliceAsBytes(s.db.albums.keys());
const string_bytes = s.db.string_bytes.items;
 
const Header = protocol.FullLibraryHeader;
const header: Header = .{
.files_len = @intCast(s.db.files.entries.len),
@@ -318,6 +320,7 @@ pub const Server = struct {
{
const iovecs = [_]std.posix.iovec_const{
.{ .base = std.mem.asBytes(&header), .len = @sizeOf(Header) },
.{ .base = waveforms.ptr, .len = waveforms.len },
.{ .base = files.ptr, .len = files.len },
.{ .base = directories.ptr, .len = directories.len },
.{ .base = albums.ptr, .len = albums.len },
 
shared/protocol.zig added: 20, removed: 7, total 13
@@ -17,6 +17,7 @@ pub const CurrentTime = extern struct {
/// diffs from this data.
///
/// Trailing:
/// * waveform for each files_len
/// * file for each files_len
/// * directory for each directories_len
/// * album for each albums_len
 
shared/root.zig added: 20, removed: 7, total 13
@@ -1,2 +1,3 @@
pub const Db = @import("Db.zig");
pub const protocol = @import("protocol.zig");
pub const Twi = @import("Twi");