many changes
This commit is contained in:
@@ -1,13 +1,60 @@
|
||||
#ifndef VS1003_H
|
||||
#define VS1003_H
|
||||
|
||||
#include "../../io/fastGPIO.h"
|
||||
|
||||
#include "../../io/SoftSPI.h"
|
||||
#include "../../Debug.h"
|
||||
//#include "IPlayable.h"
|
||||
//#include "AudioData.h"
|
||||
#include "../../data/ChunkBuffer.h"
|
||||
#include "../../Platforms.h"
|
||||
|
||||
#if (PLATFORM == NODE_MCU) || (PLATFORM == WEMOS_D1_MINI)
|
||||
|
||||
#include "../../io/fastGPIO.h"
|
||||
|
||||
#define SPI_INIT() spi::init();
|
||||
#define SPI_WRITE_8(byte) spi::writeByte(byte)
|
||||
#define SPI_WRITE_16(word) spi::writeWord(word)
|
||||
#define SPI_READ_8(byte) spi::readByte(byte)
|
||||
#define SPI_READ_16(word) spi::readWord(word)
|
||||
#define SPI_READ_WRITE_8(byte) spi::readWriteByte(byte)
|
||||
#define SPI_READ_WRITE_16(word) spi::readWriteWord(word)
|
||||
#define SPI_DELAY() //os_delay_us(10)
|
||||
|
||||
#define CFG_DREG() GPIO16_INPUT_SET
|
||||
#define GET_DREQ() GPIO16_IN // PIN D0
|
||||
|
||||
#define MP3_CTRL_DESELECT() spi::chipDeselect();
|
||||
#define MP3_CTRL_SELECT() spi::chipSelect();
|
||||
|
||||
#define CFG_DATA_SELECT() GPIO5_OUTPUT_SET
|
||||
#define MP3_DATA_DESELECT() GPIO5_H
|
||||
#define MP3_DATA_SELECT() GPIO5_L
|
||||
|
||||
#elif (PLATFORM == WROOM32_DEVKIT)
|
||||
|
||||
#include "driver/gpio.h"
|
||||
|
||||
#define SPI_INIT() spi::init();
|
||||
#define SPI_WRITE_8(byte) spi::writeByte(byte)
|
||||
#define SPI_WRITE_16(word) spi::writeWord(word)
|
||||
#define SPI_READ_8(byte) spi::readByte(byte)
|
||||
#define SPI_READ_16(word) spi::readWord(word)
|
||||
#define SPI_READ_WRITE_8(byte) spi::readWriteByte(byte)
|
||||
#define SPI_READ_WRITE_16(word) spi::readWriteWord(word)
|
||||
#define SPI_DELAY() //os_delay_us(10)
|
||||
|
||||
#define CFG_DREG() gpio_set_direction(GPIO_NUM_26, GPIO_MODE_INPUT)
|
||||
#define GET_DREQ() gpio_get_level(GPIO_NUM_26)
|
||||
|
||||
#define MP3_CTRL_DESELECT() spi::chipDeselect();
|
||||
#define MP3_CTRL_SELECT() spi::chipSelect();
|
||||
|
||||
#define CFG_DATA_SELECT() gpio_set_direction(GPIO_NUM_33, GPIO_MODE_OUTPUT)
|
||||
#define MP3_DATA_DESELECT() gpio_set_level(GPIO_NUM_33, 1)
|
||||
#define MP3_DATA_SELECT() gpio_set_level(GPIO_NUM_33, 0)
|
||||
|
||||
#else
|
||||
#error "no platform"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* control a VS1003 audio chip attached to the SPI port
|
||||
@@ -18,24 +65,6 @@ private:
|
||||
|
||||
static constexpr const char* NAME = "VS1003";
|
||||
|
||||
//SoftSPI spi;
|
||||
#define SPI_INIT() spi::init();
|
||||
#define SPI_WRITE_8(byte) spi::writeByte(byte)
|
||||
#define SPI_WRITE_16(word) spi::writeWord(word)
|
||||
#define SPI_READ_8(byte) spi::readByte(byte)
|
||||
#define SPI_READ_16(word) spi::readWord(word)
|
||||
#define SPI_READ_WRITE_8(byte) spi::readWriteByte(byte)
|
||||
#define SPI_READ_WRITE_16(word) spi::readWriteWord(word)
|
||||
//#define SPI_DELAY() os_delay_us(10)
|
||||
#define SPI_DELAY() //os_delay_us(10)
|
||||
|
||||
#define GET_DREQ() GPIO16_IN // PIN D0
|
||||
|
||||
#define MP3_CTRL_DESELECT() spi::chipDeselect();
|
||||
#define MP3_CTRL_SELECT() spi::chipSelect();
|
||||
#define MP3_DATA_DESELECT() GPIO5_H
|
||||
#define MP3_DATA_SELECT() GPIO5_L
|
||||
|
||||
enum OP {
|
||||
WRITE = 0x2,
|
||||
READ = 0x3,
|
||||
@@ -107,8 +136,8 @@ public:
|
||||
|
||||
SPI_INIT();
|
||||
|
||||
GPIO5_OUTPUT_SET; // Pin D1 - XDCS
|
||||
GPIO16_INPUT_SET; // Pin D0 - DREQ
|
||||
CFG_DATA_SELECT(); // XDCS
|
||||
CFG_DREG(); // DREQ
|
||||
|
||||
this->state = PlayState::STOPPED;
|
||||
|
||||
@@ -134,6 +163,14 @@ public:
|
||||
return (255 - (values & 0xFF));
|
||||
}
|
||||
|
||||
void dbg() {
|
||||
debugMod1(NAME, "mode: %d", readRegister(Register::SCI_MODE));
|
||||
debugMod1(NAME, "vol: %d", readRegister(Register::SCI_VOL));
|
||||
debugMod1(NAME, "status: %d", readRegister(Register::SCI_STATUS));
|
||||
debugMod1(NAME, "clk: %d", readRegister(Register::SCI_CLOCKF));
|
||||
|
||||
}
|
||||
|
||||
// void play(AudioData ad) {
|
||||
// this->playable = ad;
|
||||
// this->state = PlayState::PLAYING;
|
||||
@@ -145,24 +182,25 @@ public:
|
||||
// this->state = PlayState::PLAYING;
|
||||
// }
|
||||
|
||||
void ICACHE_FLASH_ATTR record(RecordSource source) {
|
||||
/*
|
||||
void IN_FLASH record(RecordSource source) {
|
||||
|
||||
state = PlayState::RECORDING;
|
||||
writeRegister(Register::SCI_CLOCKF, 0x4430); /* 2.0x 12.288MHz */
|
||||
os_delay_us(100);
|
||||
writeRegister(Register::SCI_CLOCKF, 0x4430); // 2.0x 12.288MHz
|
||||
DELAY_US(100);
|
||||
|
||||
writeRegister(Register::SCI_AICTRL0, 12); /* Div -> 12=8kHz 8=12kHz 6=16kHz */
|
||||
os_delay_us(100);
|
||||
writeRegister(Register::SCI_AICTRL0, 12); // Div -> 12=8kHz 8=12kHz 6=16kHz
|
||||
DELAY_US(100);
|
||||
|
||||
writeRegister(Register::SCI_AICTRL1, 0); /* Auto gain */
|
||||
os_delay_us(100);
|
||||
writeRegister(Register::SCI_AICTRL1, 0); // Auto gain
|
||||
DELAY_US(100);
|
||||
|
||||
setVolume(255);
|
||||
|
||||
os_printf("mode: %d", readRegister(Register::SCI_MODE));
|
||||
|
||||
writeRegister(Register::SCI_MODE, readRegister(Register::SCI_MODE) | (int)Mode::SM_ADPCM | (int)Mode::SM_RESET);
|
||||
os_delay_us(100);
|
||||
DELAY_US(100);
|
||||
|
||||
os_printf("mode: %d", readRegister(Register::SCI_MODE));
|
||||
|
||||
@@ -174,11 +212,12 @@ public:
|
||||
// }
|
||||
|
||||
awaitDREQ();
|
||||
os_delay_us(100);
|
||||
DELAY_US(100);
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
PlayState ICACHE_FLASH_ATTR getState() const {
|
||||
PlayState IN_FLASH getState() const {
|
||||
return this->state;
|
||||
}
|
||||
|
||||
@@ -187,7 +226,7 @@ public:
|
||||
this->state = PlayState::PLAYING;
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR run() {
|
||||
size_t IN_FLASH run() {
|
||||
if(this->state == PlayState::PLAYING) {
|
||||
if (playBuf.empty()) {
|
||||
//uint8_t stopSequence[4] = {0};
|
||||
@@ -196,11 +235,13 @@ public:
|
||||
} else {
|
||||
//const ChunkBuffer::Data chunk = playBuf.get(32);
|
||||
//playChunk32(chunk.ptr, chunk.size);
|
||||
sendPlayBuffer();
|
||||
return sendPlayBuffer();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
uint32_t getRecordData(uint8_t* buffer, uint32_t maxLength) {
|
||||
|
||||
uint32_t available = this->getNumAvailableRecordBytes();
|
||||
@@ -237,6 +278,15 @@ public:
|
||||
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
uint16_t getSampleRate() const {
|
||||
return readRegister(Register::SCI_AUDATA) & 0xFFFE; // exclude last bit (mono/stereo)
|
||||
}
|
||||
|
||||
bool isStereo() const {
|
||||
return readRegister(Register::SCI_AUDATA) & 1;
|
||||
}
|
||||
|
||||
PlayBuf& getPlayBuffer() {
|
||||
@@ -255,7 +305,7 @@ private:
|
||||
return (uint32_t)readRegister(Register::SCI_HDAT1) * sizeof(uint16_t);
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR playChunk32(const uint8_t* buffer, const uint32_t len) const {
|
||||
void IN_FLASH playChunk32(const uint8_t* buffer, const uint32_t len) const {
|
||||
debugMod1(NAME, "playChunk32() len:%d", len);
|
||||
MP3_CTRL_DESELECT();
|
||||
MP3_DATA_SELECT();
|
||||
@@ -267,10 +317,10 @@ private:
|
||||
MP3_DATA_DESELECT();
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR sendPlayBuffer() {
|
||||
size_t IN_FLASH sendPlayBuffer() {
|
||||
MP3_CTRL_DESELECT();
|
||||
MP3_DATA_SELECT();
|
||||
int written = 0;
|
||||
size_t written = 0;
|
||||
while(canConsume() && !playBuf.empty()) {
|
||||
const uint8_t byte = playBuf.get();
|
||||
if (byte == -1) {break;}
|
||||
@@ -279,6 +329,7 @@ private:
|
||||
}
|
||||
if (written) {debugMod1(NAME, "sendPlayBuffer(): %d bytes", written);}
|
||||
MP3_DATA_DESELECT();
|
||||
return written;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -342,11 +393,11 @@ private:
|
||||
debugMod(NAME, "reset()");
|
||||
|
||||
writeRegister(SCI_MODE, (2052 | (uint16_t)modeMask)); // TODO: remove SM_TESTS
|
||||
os_delay_us(1);
|
||||
DELAY_US(1);
|
||||
awaitDREQ();
|
||||
writeRegister(SCI_CLOCKF, 0x9800);
|
||||
setVolume(0);
|
||||
os_delay_us(1);
|
||||
DELAY_US(1);
|
||||
|
||||
MP3_DATA_SELECT();
|
||||
SPI_WRITE_8(0);
|
||||
@@ -355,7 +406,7 @@ private:
|
||||
SPI_WRITE_8(0);
|
||||
MP3_DATA_DESELECT();
|
||||
|
||||
os_delay_us(100);
|
||||
DELAY_US(100);
|
||||
MP3_CTRL_DESELECT();
|
||||
|
||||
debugMod(NAME, "reset() complete");
|
||||
|
||||
Reference in New Issue
Block a user