#pragma once #include "config.h" #include #include #include "spi_master.h" #include "playlist.h" #include "data_sources.h" class Player; #include "controller.h" #define SCI_MODE 0x00 #define SCI_STATUS 0x01 #define SCI_BASS 0x02 #define SCI_CLOCKF 0x03 #define SCI_DECODE_TIME 0x04 #define SCI_AUDATA 0x05 #define SCI_VOL 0x0B #define SCI_WRAMADDR 0x07 #define SCI_WRAM 0x06 #define SCI_HDAT0 0x08 #define SCI_HDAT1 0x09 #define SCI_AIADDR 0x0A #define SCI_AICTRL0 0x0C #define SCI_AICTRL1 0x0D #define SCI_AICTRL2 0x0E #define SCI_AICTRL3 0x0F #define CMD_WRITE 0x02 #define CMD_READ 0x03 #define ADDR_ENDBYTE 0x1E06 #define SM_LAYER12 0x0001 #define SM_RESET 0x0004 #define SM_CANCEL 0x0008 #define SM_SDINEW 0x0800 #define SM_ADPCM 0x1000 #define SS_DO_NOT_JUMP 0x8000 class Player { private: enum state { uninitialized, idle, playing, stopping, sleeping, recording }; void _reset(); void _wait(); uint16_t _read_control_register(uint8_t address, bool do_wait=true); void _write_control_register(uint8_t address, uint16_t value, bool do_wait=true); void _write_direct(uint8_t address, uint16_t value); void _write_data(uint8_t* data); uint16_t _read_wram(uint16_t address); state _state = state::uninitialized; void _refill(); bool _refill_needed(); void _flush_and_cancel(); int8_t _get_endbyte(); void _flush(uint count, int8_t fill_byte); void _play_file(String filename, uint32_t offset); void _finish_playing(); void _finish_stopping(bool turn_speaker_off); void _mute(); void _unmute(); void _sleep(); void _wakeup(); void _record(); void _patch_adpcm(); void _speaker_off(); void _speaker_on(); SPISettings _spi_settings_slow = SPISettings(250000, MSBFIRST, SPI_MODE0); SPISettings _spi_settings_fast = SPISettings(4000000, MSBFIRST, SPI_MODE0); SPISettings* _spi_settings = &_spi_settings_slow; DataSource* _file; uint32_t _file_size = 0; uint8_t _buffer[32]; uint32_t _current_play_position = 0; Playlist* _current_playlist = NULL; uint _refills; uint8_t _volume; uint16_t _stop_delay; uint32_t _skip_to; SPIMaster* _spi; Controller* _controller; unsigned long _stopped_at; public: Player(SPIMaster* s); void init(); void register_controller(Controller* c); void vol_up(); void vol_down(); void track_next(); void track_prev(); void set_track(uint8_t track); bool is_playing(); bool play(); bool play(Playlist* p); void stop(bool turn_speaker_off=true); bool loop(); void set_volume(uint8_t vol, bool save = true); String position_json(); String json(); };