i2s_position
This commit is contained in:
@@ -65,7 +65,7 @@
|
|||||||
<div id="snuffle" class="playerbytton active" data-name="snuffle"></div>
|
<div id="snuffle" class="playerbytton active" data-name="snuffle"></div>
|
||||||
<div id="sdposvalsend">0:00</div>
|
<div id="sdposvalsend">0:00</div>
|
||||||
</div>
|
</div>
|
||||||
<input type="range" id="sdpos" class="slider" name="sdpos" min="295903" max="595903" value="0">
|
<input type="range" id="sdpos" class="slider" name="sdpos" min="0" max="100" value="0">
|
||||||
</div>
|
</div>
|
||||||
<div class="infowrap">
|
<div class="infowrap">
|
||||||
<div class="infoitem">volume: <span id="volinfo">0</span></div>
|
<div class="infoitem">volume: <span id="volinfo">0</span></div>
|
||||||
|
|||||||
Binary file not shown.
@@ -1300,6 +1300,7 @@ int Audio::read_WAV_Header(uint8_t* data, size_t len) {
|
|||||||
if(m_streamType == ST_WEBFILE) m_audioDataSize = m_contentlength - headerSize;
|
if(m_streamType == ST_WEBFILE) m_audioDataSize = m_contentlength - headerSize;
|
||||||
}
|
}
|
||||||
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
||||||
|
if(audio_progress) audio_progress(headerSize, m_audioDataSize);
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
m_controlCounter = 100; // header succesfully read
|
m_controlCounter = 100; // header succesfully read
|
||||||
@@ -1371,6 +1372,7 @@ int Audio::read_FLAC_Header(uint8_t *data, size_t len) {
|
|||||||
m_audioDataStart = headerSize;
|
m_audioDataStart = headerSize;
|
||||||
m_audioDataSize = m_contentlength - m_audioDataStart;
|
m_audioDataSize = m_contentlength - m_audioDataStart;
|
||||||
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
||||||
|
if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize);
|
||||||
retvalue = 0;
|
retvalue = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1519,6 +1521,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
|
|||||||
AUDIO_INFO("file has no mp3 tag, skip metadata");
|
AUDIO_INFO("file has no mp3 tag, skip metadata");
|
||||||
m_audioDataSize = m_contentlength;
|
m_audioDataSize = m_contentlength;
|
||||||
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
||||||
|
if(audio_progress) audio_progress(295903, m_audioDataSize);
|
||||||
return -1; // error, no ID3 signature found
|
return -1; // error, no ID3 signature found
|
||||||
}
|
}
|
||||||
ID3version = *(data + 3);
|
ID3version = *(data + 3);
|
||||||
@@ -1733,6 +1736,7 @@ int Audio::read_ID3_Header(uint8_t *data, size_t len) {
|
|||||||
m_controlCounter = 100; // ok
|
m_controlCounter = 100; // ok
|
||||||
m_audioDataSize = m_contentlength - m_audioDataStart;
|
m_audioDataSize = m_contentlength - m_audioDataStart;
|
||||||
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
AUDIO_INFO("Audio-Length: %u", m_audioDataSize);
|
||||||
|
if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize);
|
||||||
if(APIC_seen && audio_id3image){
|
if(APIC_seen && audio_id3image){
|
||||||
cardLock(true);
|
cardLock(true);
|
||||||
size_t pos = audiofile.position();
|
size_t pos = audiofile.position();
|
||||||
@@ -1979,6 +1983,7 @@ int Audio::read_M4A_Header(uint8_t *data, size_t len) {
|
|||||||
if(m_controlCounter == M4A_MDAT) { // mdat
|
if(m_controlCounter == M4A_MDAT) { // mdat
|
||||||
m_audioDataSize = bigEndian(data, 4) -8; // length of this atom - strlen(M4A_MDAT)
|
m_audioDataSize = bigEndian(data, 4) -8; // length of this atom - strlen(M4A_MDAT)
|
||||||
AUDIO_INFO( "Audio-Length: %u",m_audioDataSize);
|
AUDIO_INFO( "Audio-Length: %u",m_audioDataSize);
|
||||||
|
if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize);
|
||||||
retvalue = 8;
|
retvalue = 8;
|
||||||
headerSize += 8;
|
headerSize += 8;
|
||||||
m_controlCounter = M4A_AMRDY; // last step before starting the audio
|
m_controlCounter = M4A_AMRDY; // last step before starting the audio
|
||||||
@@ -1990,6 +1995,7 @@ int Audio::read_M4A_Header(uint8_t *data, size_t len) {
|
|||||||
// m_contentlength = headerSize + m_audioDataSize; // after this mdat atom there may be other atoms
|
// m_contentlength = headerSize + m_audioDataSize; // after this mdat atom there may be other atoms
|
||||||
if(getDatamode() == AUDIO_LOCALFILE){
|
if(getDatamode() == AUDIO_LOCALFILE){
|
||||||
AUDIO_INFO("Content-Length: %u", m_contentlength);
|
AUDIO_INFO("Content-Length: %u", m_contentlength);
|
||||||
|
if(audio_progress) audio_progress(m_audioDataStart, m_audioDataSize);
|
||||||
}
|
}
|
||||||
m_controlCounter = M4A_OKAY; // that's all
|
m_controlCounter = M4A_OKAY; // that's all
|
||||||
return 0;
|
return 0;
|
||||||
@@ -4441,7 +4447,10 @@ bool Audio::setFilePos(uint32_t pos) {
|
|||||||
InBuff.resetBuffer();
|
InBuff.resetBuffer();
|
||||||
if(pos < m_audioDataStart) pos = m_audioDataStart; // issue #96
|
if(pos < m_audioDataStart) pos = m_audioDataStart; // issue #96
|
||||||
if(m_avr_bitrate) m_audioCurrentTime = ((pos-m_audioDataStart) / m_avr_bitrate) * 8; // #96
|
if(m_avr_bitrate) m_audioCurrentTime = ((pos-m_audioDataStart) / m_avr_bitrate) * 8; // #96
|
||||||
return audiofile.seek(pos);
|
cardLock(true);
|
||||||
|
uint32_t sk = audiofile.seek(pos);
|
||||||
|
cardLock(false);
|
||||||
|
return sk;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
bool Audio::audioFileSeek(const float speed) {
|
bool Audio::audioFileSeek(const float speed) {
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ extern __attribute__((weak)) void audio_lasthost(const char*);
|
|||||||
extern __attribute__((weak)) void audio_eof_speech(const char*);
|
extern __attribute__((weak)) void audio_eof_speech(const char*);
|
||||||
extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end
|
extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end
|
||||||
extern __attribute__((weak)) void audio_process_extern(int16_t* buff, uint16_t len, bool *continueI2S); // record audiodata or send via BT
|
extern __attribute__((weak)) void audio_process_extern(int16_t* buff, uint16_t len, bool *continueI2S); // record audiodata or send via BT
|
||||||
|
extern __attribute__((weak)) void audio_progress(uint32_t startpos, uint32_t endpos);
|
||||||
|
|
||||||
#define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);}
|
#define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ extern __attribute__((weak)) void audio_icyurl(const char*);
|
|||||||
extern __attribute__((weak)) void audio_icydescription(const char*);
|
extern __attribute__((weak)) void audio_icydescription(const char*);
|
||||||
extern __attribute__((weak)) void audio_lasthost(const char*);
|
extern __attribute__((weak)) void audio_lasthost(const char*);
|
||||||
extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end
|
extern __attribute__((weak)) void audio_eof_stream(const char*); // The webstream comes to an end
|
||||||
|
extern __attribute__((weak)) void audio_progress(uint32_t start, uint32_t durarion);
|
||||||
|
|
||||||
#define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);}
|
#define AUDIO_INFO(...) {char buff[512 + 64]; sprintf(buff,__VA_ARGS__); if(audio_info) audio_info(buff);}
|
||||||
|
|
||||||
|
|||||||
@@ -416,7 +416,11 @@ void NetServer::onWsMessage(void *arg, uint8_t *data, size_t len, uint8_t client
|
|||||||
if (strcmp(cmd, "sdpos") == 0) {
|
if (strcmp(cmd, "sdpos") == 0) {
|
||||||
if (config.store.play_mode==PM_SDCARD){
|
if (config.store.play_mode==PM_SDCARD){
|
||||||
config.sdResumePos = 0;
|
config.sdResumePos = 0;
|
||||||
player.play(config.store.lastStation, atoi(val));
|
if(!player.isRunning()){
|
||||||
|
player.play(config.store.lastStation, atoi(val)-player.sd_min);
|
||||||
|
}else{
|
||||||
|
player.setFilePos(atoi(val)-player.sd_min);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcmp(cmd, "balance") == 0) {
|
if (strcmp(cmd, "balance") == 0) {
|
||||||
@@ -583,7 +587,7 @@ void NetServer::requestOnChange(requestType_e request, uint8_t clientId) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GETMODE: sprintf (wsbuf, "{\"pmode\":\"%s\"}", network.status == CONNECTED ? "player" : "ap"); break;
|
case GETMODE: sprintf (wsbuf, "{\"pmode\":\"%s\"}", network.status == CONNECTED ? "player" : "ap"); break;
|
||||||
case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) requestOnChange(SDPOS, clientId); return; break;
|
case GETINDEX: requestOnChange(STATION, clientId); requestOnChange(TITLE, clientId); requestOnChange(VOLUME, clientId); requestOnChange(EQUALIZER, clientId); requestOnChange(BALANCE, clientId); requestOnChange(BITRATE, clientId); requestOnChange(MODE, clientId); if (config.store.play_mode==PM_SDCARD) { requestOnChange(SDPOS, clientId); requestOnChange(SDLEN, clientId); } return; break;
|
||||||
case GETSYSTEM: sprintf (wsbuf, "{\"sst\":%d,\"aif\":%d,\"vu\":%d,\"softr\":%d}", config.store.smartstart != 2, config.store.audioinfo, config.store.vumeter, config.store.softapdelay); break;
|
case GETSYSTEM: sprintf (wsbuf, "{\"sst\":%d,\"aif\":%d,\"vu\":%d,\"softr\":%d}", config.store.smartstart != 2, config.store.audioinfo, config.store.vumeter, config.store.softapdelay); break;
|
||||||
case GETSCREEN: sprintf (wsbuf, "{\"flip\":%d,\"inv\":%d,\"nump\":%d,\"tsf\":%d,\"tsd\":%d,\"dspon\":%d,\"br\":%d,\"con\":%d}", config.store.flipscreen, config.store.invertdisplay, config.store.numplaylist, config.store.fliptouch, config.store.dbgtouch, config.store.dspon, config.store.brightness, config.store.contrast); break;
|
case GETSCREEN: sprintf (wsbuf, "{\"flip\":%d,\"inv\":%d,\"nump\":%d,\"tsf\":%d,\"tsd\":%d,\"dspon\":%d,\"br\":%d,\"con\":%d}", config.store.flipscreen, config.store.invertdisplay, config.store.numplaylist, config.store.fliptouch, config.store.dbgtouch, config.store.dspon, config.store.brightness, config.store.contrast); break;
|
||||||
case GETTIMEZONE: sprintf (wsbuf, "{\"tzh\":%d,\"tzm\":%d,\"sntp1\":\"%s\",\"sntp2\":\"%s\"}", config.store.tzHour, config.store.tzMin, config.store.sntp1, config.store.sntp2); break;
|
case GETTIMEZONE: sprintf (wsbuf, "{\"tzh\":%d,\"tzm\":%d,\"sntp1\":\"%s\",\"sntp2\":\"%s\"}", config.store.tzHour, config.store.tzMin, config.store.sntp1, config.store.sntp2); break;
|
||||||
@@ -597,10 +601,12 @@ void NetServer::requestOnChange(requestType_e request, uint8_t clientId) {
|
|||||||
case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break;
|
case VOLUME: sprintf (wsbuf, "{\"vol\": %d}", config.store.volume); break;
|
||||||
case NRSSI: sprintf (wsbuf, "{\"rssi\": %d}", rssi); rssi = 255; break;
|
case NRSSI: sprintf (wsbuf, "{\"rssi\": %d}", rssi); rssi = 255; break;
|
||||||
case SDPOS: sprintf (wsbuf, "{\"sdpos\": %d,\"sdend\": %d,\"sdtpos\": %d,\"sdtend\": %d}", player.getFilePos(), player.getFileSize(), player.getAudioCurrentTime(), player.getAudioFileDuration()); break;
|
case SDPOS: sprintf (wsbuf, "{\"sdpos\": %d,\"sdend\": %d,\"sdtpos\": %d,\"sdtend\": %d}", player.getFilePos(), player.getFileSize(), player.getAudioCurrentTime(), player.getAudioFileDuration()); break;
|
||||||
|
case SDLEN: sprintf (wsbuf, "{\"sdmin\": %d,\"sdmax\": %d}", player.sd_min, player.sd_max); break;
|
||||||
case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break;
|
case BITRATE: sprintf (wsbuf, "{\"bitrate\": %d}", config.station.bitrate); break;
|
||||||
case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break;
|
case MODE: sprintf (wsbuf, "{\"mode\": \"%s\"}", player.mode == PLAYING ? "playing" : "stopped"); break;
|
||||||
case EQUALIZER: sprintf (wsbuf, "{\"bass\": %d, \"middle\": %d, \"trebble\": %d}", config.store.bass, config.store.middle, config.store.trebble); break;
|
case EQUALIZER: sprintf (wsbuf, "{\"bass\": %d, \"middle\": %d, \"trebble\": %d}", config.store.bass, config.store.middle, config.store.trebble); break;
|
||||||
case BALANCE: sprintf (wsbuf, "{\"balance\": %d}", config.store.balance); break;
|
case BALANCE: sprintf (wsbuf, "{\"balance\": %d}", config.store.balance); break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
if (strlen(wsbuf) > 0) {
|
if (strlen(wsbuf) > 0) {
|
||||||
if (clientId == 0) { websocket.textAll(wsbuf); }else{ websocket.text(clientId, wsbuf); }
|
if (clientId == 0) { websocket.textAll(wsbuf); }else{ websocket.text(clientId, wsbuf); }
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "ESPAsyncWebServer.h"
|
#include "ESPAsyncWebServer.h"
|
||||||
#include "AsyncUDP.h"
|
#include "AsyncUDP.h"
|
||||||
|
|
||||||
enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22 };
|
enum requestType_e : uint8_t { PLAYLIST=1, STATION=2, STATIONNAME=3, ITEM=4, TITLE=5, VOLUME=6, NRSSI=7, BITRATE=8, MODE=9, EQUALIZER=10, BALANCE=11, PLAYLISTSAVED=12, GETMODE=13, GETINDEX=14, GETACTIVE=15, GETSYSTEM=16, GETSCREEN=17, GETTIMEZONE=18, GETWEATHER=19, GETCONTROLS=20, DSPON=21, SDPOS=22, SDLEN=23 };
|
||||||
enum import_e : uint8_t { IMDONE=0, IMPL=1, IMWIFI=2 };
|
enum import_e : uint8_t { IMDONE=0, IMPL=1, IMWIFI=2 };
|
||||||
|
|
||||||
class NetServer {
|
class NetServer {
|
||||||
|
|||||||
@@ -149,8 +149,9 @@ void Player::play(uint16_t stationId, uint32_t filePos) {
|
|||||||
display.putRequest(NEWSTATION);
|
display.putRequest(NEWSTATION);
|
||||||
netserver.requestOnChange(STATION, 0);
|
netserver.requestOnChange(STATION, 0);
|
||||||
telnet.printf("##CLI.NAMESET#: %d %s\n", config.store.lastStation, config.station.name);
|
telnet.printf("##CLI.NAMESET#: %d %s\n", config.store.lastStation, config.station.name);
|
||||||
if (config.store.play_mode==PM_WEB?connecttohost(config.station.url):connecttoFS(SD,config.station.url,config.sdResumePos==0?filePos:config.sdResumePos)) {
|
if (config.store.play_mode==PM_WEB?connecttohost(config.station.url):connecttoFS(SD,config.station.url,config.sdResumePos==0?filePos:config.sdResumePos-player.sd_min)) {
|
||||||
mode = PLAYING;
|
mode = PLAYING;
|
||||||
|
if(config.store.play_mode==PM_SDCARD) config.sdResumePos = 0;
|
||||||
config.setTitle("");
|
config.setTitle("");
|
||||||
netserver.requestOnChange(TITLE, 0);
|
netserver.requestOnChange(TITLE, 0);
|
||||||
config.setSmartStart(1);
|
config.setSmartStart(1);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class Player: public Audio {
|
|||||||
void zeroRequest();
|
void zeroRequest();
|
||||||
SemaphoreHandle_t playmutex=NULL;
|
SemaphoreHandle_t playmutex=NULL;
|
||||||
bool lockOutput = true;
|
bool lockOutput = true;
|
||||||
|
uint32_t sd_min, sd_max;
|
||||||
public:
|
public:
|
||||||
Player();
|
Player();
|
||||||
void init();
|
void init();
|
||||||
|
|||||||
@@ -202,3 +202,8 @@ void audio_eof_mp3(const char *info){ //end of file
|
|||||||
config.sdResumePos = 0;
|
config.sdResumePos = 0;
|
||||||
player.play(random(1, config.store.countStation));
|
player.play(random(1, config.store.countStation));
|
||||||
}
|
}
|
||||||
|
void audio_progress(uint32_t startpos, uint32_t endpos){
|
||||||
|
player.sd_min = startpos;
|
||||||
|
player.sd_max = endpos;
|
||||||
|
netserver.requestOnChange(SDLEN, 0);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user