A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 141 lines 4.8 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2014 Franklin Wei, Benjamin Brown 11 * Copyright (C) 2004 Gregory Montoir 12 * 13 * This program is free software; you can redistribute it and/or 14 * modify it under the terms of the GNU General Public License 15 * as published by the Free Software Foundation; either version 2 16 * of the License, or (at your option) any later version. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 23#include "serializer.h" 24#include "file.h" 25 26 27void ser_create(struct Serializer* c, File *stream, enum Mode mode, uint8_t *ptrBlock, uint16_t saveVer) 28{ 29 c->_stream = stream; 30 c->_mode = mode; 31 c->_ptrBlock = ptrBlock; 32 c->_saveVer = saveVer; 33} 34 35void ser_saveOrLoadEntries(struct Serializer* c, struct Entry *entry) { 36 debug(DBG_SER, "ser_saveOrLoadEntries() _mode=%d", c->_mode); 37 c->_bytesCount = 0; 38 switch (c->_mode) { 39 case SM_SAVE: 40 ser_saveEntries(c, entry); 41 break; 42 case SM_LOAD: 43 ser_loadEntries(c, entry); 44 break; 45 } 46 debug(DBG_SER, "ser_saveOrLoadEntries() _bytesCount=%d", c->_bytesCount); 47} 48 49void ser_saveEntries(struct Serializer* c, struct Entry *entry) { 50 debug(DBG_SER, "ser_saveEntries()"); 51 for (; entry->type != SET_END; ++entry) { 52 if (entry->maxVer == CUR_VER) { 53 switch (entry->type) { 54 case SET_INT: 55 ser_saveInt(c, entry->size, entry->data); 56 c->_bytesCount += entry->size; 57 break; 58 case SET_ARRAY: 59 if (entry->size == SES_INT8) { 60 file_write(c->_stream, entry->data, entry->n); 61 c->_bytesCount += entry->n; 62 } else { 63 uint8_t *p = (uint8_t *)entry->data; 64 for (int i = 0; i < entry->n; ++i) { 65 ser_saveInt(c, entry->size, p); 66 p += entry->size; 67 c->_bytesCount += entry->size; 68 } 69 } 70 break; 71 case SET_PTR: 72 file_writeUint32BE(c->_stream, *(uint8_t **)(entry->data) - c->_ptrBlock); 73 c->_bytesCount += 4; 74 break; 75 case SET_END: 76 break; 77 } 78 } 79 } 80} 81 82void ser_loadEntries(struct Serializer* c, struct Entry *entry) { 83 debug(DBG_SER, "ser_loadEntries()"); 84 for (; entry->type != SET_END; ++entry) { 85 if (c->_saveVer >= entry->minVer && c->_saveVer <= entry->maxVer) { 86 switch (entry->type) { 87 case SET_INT: 88 ser_loadInt(c, entry->size, entry->data); 89 c->_bytesCount += entry->size; 90 break; 91 case SET_ARRAY: 92 if (entry->size == SES_INT8) { 93 file_read(c->_stream, entry->data, entry->n); 94 c->_bytesCount += entry->n; 95 } else { 96 uint8_t *p = (uint8_t *)entry->data; 97 for (int i = 0; i < entry->n; ++i) { 98 ser_loadInt(c, entry->size, p); 99 p += entry->size; 100 c->_bytesCount += entry->size; 101 } 102 } 103 break; 104 case SET_PTR: 105 *(uint8_t **)(entry->data) = c->_ptrBlock + file_readUint32BE(c->_stream); 106 c->_bytesCount += 4; 107 break; 108 case SET_END: 109 break; 110 } 111 } 112 } 113} 114 115void ser_saveInt(struct Serializer* c, uint8_t es, void *p) { 116 switch (es) { 117 case 1: 118 file_writeByte(c->_stream, *(uint8_t *)p); 119 break; 120 case 2: 121 file_writeUint16BE(c->_stream, *(uint16_t *)p); 122 break; 123 case 4: 124 file_writeUint32BE(c->_stream, *(uint32_t *)p); 125 break; 126 } 127} 128 129void ser_loadInt(struct Serializer* c, uint8_t es, void *p) { 130 switch (es) { 131 case 1: 132 *(uint8_t *)p = file_readByte(c->_stream); 133 break; 134 case 2: 135 *(uint16_t *)p = file_readUint16BE(c->_stream); 136 break; 137 case 4: 138 *(uint32_t *)p = file_readUint32BE(c->_stream); 139 break; 140 } 141}