122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| #include "config.h"
 | |
| #include <SPI.h>
 | |
| #include <SD.h>
 | |
| #include <list>
 | |
| #include <map>
 | |
| #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<String, album_state> _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<String> _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<String, String> 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<String> 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; }
 | |
| };
 |