mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-10 05:27:01 +03:00
cspot duration
This commit is contained in:
@@ -32,9 +32,9 @@ message Artist {
|
|||||||
message Track {
|
message Track {
|
||||||
optional bytes gid = 1;
|
optional bytes gid = 1;
|
||||||
optional string name = 2;
|
optional string name = 2;
|
||||||
|
optional sint32 duration = 0x7;
|
||||||
optional Album album = 0x3;
|
optional Album album = 0x3;
|
||||||
repeated Artist artist = 0x4;
|
repeated Artist artist = 0x4;
|
||||||
optional sint32 duration = 0x7;
|
|
||||||
repeated Restriction restriction = 0xb;
|
repeated Restriction restriction = 0xb;
|
||||||
repeated AudioFile file = 0xc;
|
repeated AudioFile file = 0xc;
|
||||||
repeated Track alternative = 0xd;
|
repeated Track alternative = 0xd;
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ void AudioChunkManager::close() {
|
|||||||
|
|
||||||
void AudioChunkManager::runTask() {
|
void AudioChunkManager::runTask() {
|
||||||
std::scoped_lock lock(this->runningMutex);
|
std::scoped_lock lock(this->runningMutex);
|
||||||
this->isRunning = true;
|
this->isRunning = true;
|
||||||
while (isRunning) {
|
while (isRunning) {
|
||||||
std::pair<std::vector<uint8_t>, bool> audioPair;
|
std::pair<std::vector<uint8_t>, bool> audioPair;
|
||||||
if (this->audioChunkDataQueue.wtpop(audioPair, 100)) {
|
if (this->audioChunkDataQueue.wtpop(audioPair, 100)) {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ template int64_t PbReader::decodeFixed();
|
|||||||
|
|
||||||
template uint32_t PbReader::decodeVarInt();
|
template uint32_t PbReader::decodeVarInt();
|
||||||
template int64_t PbReader::decodeVarInt();
|
template int64_t PbReader::decodeVarInt();
|
||||||
|
template int32_t PbReader::decodeVarInt();
|
||||||
template bool PbReader::decodeVarInt();
|
template bool PbReader::decodeVarInt();
|
||||||
|
|
||||||
void PbReader::resetMaxPosition()
|
void PbReader::resetMaxPosition()
|
||||||
|
|||||||
@@ -91,6 +91,10 @@ void decodeField(std::shared_ptr<PbReader> reader, AnyRef any)
|
|||||||
{
|
{
|
||||||
*any.as<int64_t>() = reader->decodeVarInt<int64_t>();
|
*any.as<int64_t>() = reader->decodeVarInt<int64_t>();
|
||||||
}
|
}
|
||||||
|
else if (any.is<int32_t>())
|
||||||
|
{
|
||||||
|
*any.as<int32_t>() = reader->decodeVarInt<int32_t>();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
reader->skip();
|
reader->skip();
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ void SpircController::subscribe() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpircController::setPause(bool isPaused, bool notifyPlayer) {
|
void SpircController::setPause(bool isPaused, bool notifyPlayer) {
|
||||||
sendEvent(CSpotEventType::PLAY_PAUSE, isPaused);
|
sendEvent(CSpotEventType::PLAY_PAUSE, isPaused);
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
CSPOT_LOG(debug, "External pause command");
|
CSPOT_LOG(debug, "External pause command");
|
||||||
if (notifyPlayer) player->pause();
|
if (notifyPlayer) player->pause();
|
||||||
@@ -55,29 +55,29 @@ void SpircController::disconnect(void) {
|
|||||||
player->cancelCurrentTrack();
|
player->cancelCurrentTrack();
|
||||||
state->setActive(false);
|
state->setActive(false);
|
||||||
notify();
|
notify();
|
||||||
// Send the event at the end at it might be a last gasp
|
// Send the event at the end at it might be a last gasp
|
||||||
sendEvent(CSpotEventType::DISC);
|
sendEvent(CSpotEventType::DISC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpircController::playToggle() {
|
void SpircController::playToggle() {
|
||||||
if (state->innerFrame.state->status.value() == PlayStatus::kPlayStatusPause) {
|
if (state->innerFrame.state->status.value() == PlayStatus::kPlayStatusPause) {
|
||||||
setPause(false);
|
setPause(false);
|
||||||
} else {
|
} else {
|
||||||
setPause(true);
|
setPause(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpircController::adjustVolume(int by) {
|
void SpircController::adjustVolume(int by) {
|
||||||
if (state->innerFrame.device_state->volume.has_value()) {
|
if (state->innerFrame.device_state->volume.has_value()) {
|
||||||
int volume = state->innerFrame.device_state->volume.value() + by;
|
int volume = state->innerFrame.device_state->volume.value() + by;
|
||||||
if (volume < 0) volume = 0;
|
if (volume < 0) volume = 0;
|
||||||
else if (volume > MAX_VOLUME) volume = MAX_VOLUME;
|
else if (volume > MAX_VOLUME) volume = MAX_VOLUME;
|
||||||
setVolume(volume);
|
setVolume(volume);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpircController::setVolume(int volume) {
|
void SpircController::setVolume(int volume) {
|
||||||
setRemoteVolume(volume);
|
setRemoteVolume(volume);
|
||||||
player->setVolume(volume);
|
player->setVolume(volume);
|
||||||
configMan->save();
|
configMan->save();
|
||||||
}
|
}
|
||||||
@@ -111,21 +111,21 @@ void SpircController::handleFrame(std::vector<uint8_t> &data) {
|
|||||||
// Pause the playback if another player took control
|
// Pause the playback if another player took control
|
||||||
if (state->isActive() &&
|
if (state->isActive() &&
|
||||||
state->remoteFrame.device_state->is_active.value()) {
|
state->remoteFrame.device_state->is_active.value()) {
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MessageType::kMessageTypeSeek: {
|
case MessageType::kMessageTypeSeek: {
|
||||||
CSPOT_LOG(debug, "Seek command");
|
CSPOT_LOG(debug, "Seek command");
|
||||||
sendEvent(CSpotEventType::SEEK, (int) state->remoteFrame.position.value());
|
sendEvent(CSpotEventType::SEEK, (int) state->remoteFrame.position.value());
|
||||||
state->updatePositionMs(state->remoteFrame.position.value());
|
state->updatePositionMs(state->remoteFrame.position.value());
|
||||||
this->player->seekMs(state->remoteFrame.position.value());
|
this->player->seekMs(state->remoteFrame.position.value());
|
||||||
notify();
|
notify();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MessageType::kMessageTypeVolume:
|
case MessageType::kMessageTypeVolume:
|
||||||
sendEvent(CSpotEventType::VOLUME, (int) state->remoteFrame.volume.value());
|
sendEvent(CSpotEventType::VOLUME, (int) state->remoteFrame.volume.value());
|
||||||
setVolume(state->remoteFrame.volume.value());
|
setVolume(state->remoteFrame.volume.value());
|
||||||
break;
|
break;
|
||||||
case MessageType::kMessageTypePause:
|
case MessageType::kMessageTypePause:
|
||||||
setPause(true);
|
setPause(true);
|
||||||
@@ -134,11 +134,11 @@ void SpircController::handleFrame(std::vector<uint8_t> &data) {
|
|||||||
setPause(false);
|
setPause(false);
|
||||||
break;
|
break;
|
||||||
case MessageType::kMessageTypeNext:
|
case MessageType::kMessageTypeNext:
|
||||||
sendEvent(CSpotEventType::NEXT);
|
sendEvent(CSpotEventType::NEXT);
|
||||||
nextSong();
|
nextSong();
|
||||||
break;
|
break;
|
||||||
case MessageType::kMessageTypePrev:
|
case MessageType::kMessageTypePrev:
|
||||||
sendEvent(CSpotEventType::PREV);
|
sendEvent(CSpotEventType::PREV);
|
||||||
prevSong();
|
prevSong();
|
||||||
break;
|
break;
|
||||||
case MessageType::kMessageTypeLoad: {
|
case MessageType::kMessageTypeLoad: {
|
||||||
@@ -182,7 +182,7 @@ void SpircController::handleFrame(std::vector<uint8_t> &data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpircController::loadTrack(uint32_t position_ms, bool isPaused) {
|
void SpircController::loadTrack(uint32_t position_ms, bool isPaused) {
|
||||||
sendEvent(CSpotEventType::LOAD, (int) position_ms);
|
sendEvent(CSpotEventType::LOAD, (int) position_ms);
|
||||||
state->setPlaybackState(PlaybackState::Loading);
|
state->setPlaybackState(PlaybackState::Loading);
|
||||||
std::function<void()> loadedLambda = [=]() {
|
std::function<void()> loadedLambda = [=]() {
|
||||||
// Loading finished, notify that playback started
|
// Loading finished, notify that playback started
|
||||||
@@ -201,7 +201,7 @@ void SpircController::sendEvent(CSpotEventType eventType, std::variant<TrackInfo
|
|||||||
if (eventHandler != nullptr) {
|
if (eventHandler != nullptr) {
|
||||||
CSpotEvent event = {
|
CSpotEvent event = {
|
||||||
.eventType = eventType,
|
.eventType = eventType,
|
||||||
.data = data,
|
.data = data,
|
||||||
};
|
};
|
||||||
|
|
||||||
eventHandler(event);
|
eventHandler(event);
|
||||||
@@ -217,9 +217,9 @@ void SpircController::setEventHandler(cspotEventHandler callback) {
|
|||||||
info.artist = track.artist;
|
info.artist = track.artist;
|
||||||
info.imageUrl = track.imageUrl;
|
info.imageUrl = track.imageUrl;
|
||||||
info.name = track.name;
|
info.name = track.name;
|
||||||
info.duration = track.duration;
|
info.duration = track.duration;
|
||||||
|
|
||||||
this->sendEvent(CSpotEventType::TRACK_INFO, info);
|
this->sendEvent(CSpotEventType::TRACK_INFO, info);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ void SpotifyTrack::trackInformationCallback(std::unique_ptr<MercuryResponse> res
|
|||||||
trackInfo = decodePb<Track>(response->parts[0]);
|
trackInfo = decodePb<Track>(response->parts[0]);
|
||||||
|
|
||||||
CSPOT_LOG(info, "Track name: %s", trackInfo.name.value().c_str());
|
CSPOT_LOG(info, "Track name: %s", trackInfo.name.value().c_str());
|
||||||
|
CSPOT_LOG(info, "Track duration: %d", trackInfo.duration.value());
|
||||||
|
|
||||||
CSPOT_LOG(debug, "trackInfo.restriction.size() = %d", trackInfo.restriction.size());
|
CSPOT_LOG(debug, "trackInfo.restriction.size() = %d", trackInfo.restriction.size());
|
||||||
int altIndex = 0;
|
int altIndex = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user