#pragma once #include "config.h" #include #include #include #include #include "spi_master.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, system_sound_while_playing, system_sound_while_stopped, sleeping, recording }; struct album_state { uint8_t index; uint32_t position; }; void _check_system_sound(String filename); void _reset(); void _init(); void _wait(); uint16_t _read_control_register(uint8_t address); void _write_control_register(uint8_t address, uint16_t value); 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 _set_last_track(const char* album, uint8_t track, uint32_t position); std::map _last_tracks; String _random_album(); void _play_file(String filename, uint32_t offset); uint32_t _id3_tag_offset(File f); 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(); void _fill_id_to_folder_map(); String _foldername_for_id(String id); SPISettings _spi_settings_slow = SPISettings(250000, MSBFIRST, SPI_MODE0); SPISettings _spi_settings_fast = SPISettings(4000000, MSBFIRST, SPI_MODE0); SPISettings* _spi_settings = &_spi_settings_slow; std::list _files_in_dir(String dir); String _find_album_dir(String album); File _file; uint8_t _buffer[32]; String _playing_album; uint8_t _playing_index; uint8_t _playing_album_songs; uint32_t _current_play_position; uint _refills; uint8_t _volume; uint16_t _stop_delay; uint32_t _skip_to; SPIMaster* _spi; unsigned long _stopped_at; public: std::map id_to_folder_map; Player(SPIMaster* s); void vol_up(); void vol_down(); void track_next(); void track_prev(); bool is_playing(); bool play_id(String id); bool play_album(String album); void play_random_album(); bool play_song(String album, uint8_t song_index, uint32_t offset=0); void play_system_sound(String filename); void stop(bool turn_speaker_off=true); bool loop(); void set_volume(uint8_t vol, bool save = true); std::list ls(String path, bool withFiles=true, bool withDirs=true, bool withHidden=false); String album() { return _playing_album; } uint8_t track() { return _playing_index; } uint32_t position() { return _current_play_position; } uint8_t volume() { return _volume; } };