playQueue: Finished refactoring

This commit is contained in:
2026-02-14 16:45:33 +10:00
parent 9ae53e0824
commit 2853898145
2 changed files with 90 additions and 44 deletions

View File

@@ -20,69 +20,105 @@
#include "playQueue.hpp" #include "playQueue.hpp"
// C++ interface for storing song queue data (C interface is in the header) // C++ interface for storing song queue data (C interface is in the header)
class SongObject { class OSSPQ_SongObject {
public: public:
std::string title; std::string title;
std::string album;
std::string artist; std::string artist;
std::string id; std::string id;
std::string streamUrl;
std::string coverArtUrl;
long duration; long duration;
int mode;
}; };
// NOTE: Acronym is OpenSubsonicPlayerQueue // NOTE: Acronym is OpenSubsonicPlayerQueue
std::deque<SongObject> OSSPQ_Items; std::deque<OSSPQ_SongObject> OSSPQ_SongQueue;
int internal_OSSPQ_AppendToEnd(char* title, char* artist, char* id, long duration) { int OSSPQ_AppendToEnd(char* title, char* album, char* artist, char* id, char* streamUrl, char* coverArtUrl, long duration, int mode) {
// Append a new song to the end of the queue OSSPQ_SongObject songObject;
printf("Title: %s\nArtist: %s\nID: %s\nDuration: %ld\n", title, artist, id, duration);
// TODO: Find a neater way of converting a C string to a C++ string?? if (mode == OSSPQ_MODE_OPENSUBSONIC || mode == OSSPQ_MODE_LOCALFILE) {
std::string cpp_title(title); // Both Local File and OpenSubsonic playback both take the same arguments
std::string cpp_artist(artist); if (mode == OSSPQ_MODE_OPENSUBSONIC) {
std::string cpp_id(id); printf("[OSSPQ] Appending OpenSubsonic Song: %s by %s.\n", title, artist);
SongObject songObject; } else if (mode == OSSPQ_MODE_LOCALFILE) {
songObject.title = cpp_title; printf("[OSSPQ] Appending Local Song: %s by %s.\n", title, artist);
songObject.artist = cpp_artist; }
songObject.id = cpp_id;
songObject.duration = duration; songObject.title = title;
OSSPQ_Items.push_back(songObject); songObject.album = album;
songObject.artist = artist;
songObject.id = id;
songObject.streamUrl = streamUrl;
songObject.coverArtUrl = coverArtUrl;
songObject.duration = duration;
songObject.mode = mode;
} else if (mode == OSSPQ_MODE_INTERNETRADIO) {
printf("[OSSPQ] Appending Internet Radio Station: %s.\n", title);
songObject.title = title;
songObject.id = id;
songObject.streamUrl = streamUrl;
}
OSSPQ_SongQueue.push_back(songObject);
return 0; return 0;
} }
OSSPQ_SongStruct* internal_OSSPQ_PopFromFront() { OSSPQ_SongStruct* OSSPQ_PopFromFront() {
if (OSSPQ_Items.empty()) { // Check if song queue is empty, if not, then pop oldest
// No items in play queue if (OSSPQ_SongQueue.empty()) {
return NULL; return NULL;
} }
OSSPQ_SongObject songObject = OSSPQ_SongQueue.front();
OSSPQ_SongQueue.pop_front();
// Pull the first song off the song queue // Allocate, initialize, and fill C compatible song object
SongObject songObject = OSSPQ_Items.front(); OSSPQ_SongStruct* songObjectC = (OSSPQ_SongStruct*)malloc(sizeof(OSSPQ_SongStruct));
OSSPQ_Items.pop_front(); songObjectC->title = NULL;
songObjectC->album = NULL;
songObjectC->artist = NULL;
songObjectC->id = NULL;
songObjectC->streamUrl = NULL;
songObjectC->coverArtUrl = NULL;
songObjectC->duration = 0;
songObjectC->mode = 0;
// Move song data into a C readable format if (songObject.mode == OSSPQ_MODE_OPENSUBSONIC || songObject.mode == OSSPQ_MODE_LOCALFILE) {
// NOTE: I am initializing the variables to a known value just in case there is missing information in songObject songObjectC->title = strdup(songObject.title.c_str());
OSSPQ_SongStruct* playQueueObject = (OSSPQ_SongStruct*)malloc(sizeof(OSSPQ_SongStruct)); songObjectC->album = strdup(songObject.album.c_str());
playQueueObject->title = NULL; songObjectC->artist = strdup(songObject.artist.c_str());
playQueueObject->artist = NULL; songObjectC->id = strdup(songObject.id.c_str());
playQueueObject->id = NULL; songObjectC->streamUrl = strdup(songObject.streamUrl.c_str());
playQueueObject->duration = 0; songObjectC->coverArtUrl = strdup(songObject.coverArtUrl.c_str());
songObjectC->duration = songObject.duration;
playQueueObject->title = strdup(songObject.title.c_str()); songObjectC->mode = songObject.mode;
playQueueObject->artist = strdup(songObject.artist.c_str()); } else if (songObject.mode == OSSPQ_MODE_INTERNETRADIO) {
playQueueObject->id = strdup(songObject.id.c_str()); songObjectC->title = strdup(songObject.title.c_str());
playQueueObject->duration = songObject.duration; songObjectC->id = strdup(songObject.id.c_str());
return playQueueObject; songObjectC->streamUrl = strdup(songObject.streamUrl.c_str());
}
return songObjectC;
} }
void internal_OSSPQ_FreeSongObject(OSSPQ_SongStruct* songObject) { void OSSPQ_FreeSongObjectC(OSSPQ_SongStruct* songObjectC) {
if (songObject->title != NULL) { free(songObject->title); } printf("[OSSPQ] Freeing SongObjectC.\n");
if (songObject->artist != NULL) { free(songObject->artist); } if (songObjectC->title != NULL) { free(songObjectC->title); }
if (songObject->id != NULL) { free(songObject->id); } if (songObjectC->album != NULL) { free(songObjectC->album); }
if (songObject != NULL) { free(songObject); } if (songObjectC->artist != NULL) { free(songObjectC->artist); }
if (songObjectC->id != NULL) { free(songObjectC->id); }
if (songObjectC->streamUrl != NULL) { free(songObjectC->streamUrl); }
if (songObjectC->coverArtUrl != NULL) { free(songObjectC->coverArtUrl); }
if (songObjectC != NULL) { free(songObjectC); }
} }
// TODO Bullshit functions for dealing with Imgui
char* internal_OSSPQ_GetTitleAtIndex(int idx) { char* internal_OSSPQ_GetTitleAtIndex(int idx) {
return (char*)OSSPQ_Items[idx].title.c_str(); return (char*)OSSPQ_SongQueue[idx].title.c_str();
} }
int internal_OSSPQ_GetItemCount() { int internal_OSSPQ_GetItemCount() {
return OSSPQ_Items.size(); return OSSPQ_SongQueue.size();
} }

View File

@@ -7,6 +7,10 @@
#ifndef _PLAYQUEUE_H #ifndef _PLAYQUEUE_H
#define _PLAYQUEUE_H #define _PLAYQUEUE_H
#define OSSPQ_MODE_OPENSUBSONIC 101
#define OSSPQ_MODE_LOCALFILE 102
#define OSSPQ_MODE_INTERNETRADIO 103
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif // __cplusplus #endif // __cplusplus
@@ -14,14 +18,20 @@ extern "C" {
// C interface for sending song queue data (C++ interface is in the C++ file) // C interface for sending song queue data (C++ interface is in the C++ file)
typedef struct { typedef struct {
char* title; char* title;
char* album;
char* artist; char* artist;
char* id; char* id;
char* streamUrl;
char* coverArtUrl;
long duration; long duration;
int mode;
} OSSPQ_SongStruct; } OSSPQ_SongStruct;
int internal_OSSPQ_AppendToEnd(char* title, char* artist, char* id, long duration); int OSSPQ_AppendToEnd(char* title, char* album, char* artist, char* id, char* streamUrl, char* coverArtUrl, long duration, int mode);
OSSPQ_SongStruct* internal_OSSPQ_PopFromFront(); OSSPQ_SongStruct* OSSPQ_PopFromFront();
void internal_OSSPQ_FreeSongObject(OSSPQ_SongStruct* songObject); void OSSPQ_FreeSongObjectC(OSSPQ_SongStruct* songObjectC);
// TODO
char* internal_OSSPQ_GetTitleAtIndex(int idx); char* internal_OSSPQ_GetTitleAtIndex(int idx);
int internal_OSSPQ_GetItemCount(); int internal_OSSPQ_GetItemCount();