Merge pull request #549 from Salanto/asset-packet-musiclist
Music list streaming support over ASSet packet
This commit is contained in:
commit
97f3d7a8bc
@ -501,6 +501,16 @@ public:
|
|||||||
// The file name of the log file in base/logs.
|
// The file name of the log file in base/logs.
|
||||||
QString log_filename;
|
QString log_filename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A QString of an URL that defines the content repository
|
||||||
|
* send by the server.
|
||||||
|
*
|
||||||
|
* @details Introduced in Version 2.9.2.
|
||||||
|
* Addresses the issue of contenturl devlivery for WebAO
|
||||||
|
* without relying on someone adding the link manually.
|
||||||
|
*/
|
||||||
|
QString asset_url;
|
||||||
|
|
||||||
void initBASS();
|
void initBASS();
|
||||||
static void load_bass_opus_plugin();
|
static void load_bass_opus_plugin();
|
||||||
static void CALLBACK BASSreset(HSTREAM handle, DWORD channel, DWORD data,
|
static void CALLBACK BASSreset(HSTREAM handle, DWORD channel, DWORD data,
|
||||||
|
@ -25,7 +25,7 @@ public:
|
|||||||
int loop_end[4] = {0, 0, 0, 0};
|
int loop_end[4] = {0, 0, 0, 0};
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void play(QString p_song, int channel = 0, bool loop = false,
|
int play(QString p_song, int channel = 0, bool loop = false,
|
||||||
int effect_flags = 0);
|
int effect_flags = 0);
|
||||||
void stop(int channel = 0);
|
void stop(int channel = 0);
|
||||||
|
|
||||||
|
@ -13,12 +13,12 @@ AOMusicPlayer::~AOMusicPlayer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOMusicPlayer::play(QString p_song, int channel, bool loop,
|
int AOMusicPlayer::play(QString p_song, int channel, bool loop,
|
||||||
int effect_flags)
|
int effect_flags)
|
||||||
{
|
{
|
||||||
channel = channel % m_channelmax;
|
channel = channel % m_channelmax;
|
||||||
if (channel < 0) // wtf?
|
if (channel < 0) // wtf?
|
||||||
return;
|
return BASS_ERROR_NOCHAN;
|
||||||
QString f_path = ao_app->get_music_path(p_song);
|
QString f_path = ao_app->get_music_path(p_song);
|
||||||
|
|
||||||
unsigned int flags = BASS_STREAM_PRESCAN | BASS_STREAM_AUTOFREE |
|
unsigned int flags = BASS_STREAM_PRESCAN | BASS_STREAM_AUTOFREE |
|
||||||
@ -125,6 +125,7 @@ void AOMusicPlayer::play(QString p_song, int channel, bool loop,
|
|||||||
|
|
||||||
this->set_looping(loop, channel); // Have to do this here due to any
|
this->set_looping(loop, channel); // Have to do this here due to any
|
||||||
// crossfading-related changes, etc.
|
// crossfading-related changes, etc.
|
||||||
|
return BASS_ErrorGetCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AOMusicPlayer::stop(int channel)
|
void AOMusicPlayer::stop(int channel)
|
||||||
|
@ -3789,6 +3789,11 @@ void Courtroom::handle_song(QStringList *p_contents)
|
|||||||
if (f_contents.size() < 2)
|
if (f_contents.size() < 2)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bool ok; // Used for charID, channel, effect check
|
||||||
|
bool looping = false; // No loop due to outdated server using serverside looping
|
||||||
|
int channel = 0; // Channel 0 is 'master music', other for ambient
|
||||||
|
int effect_flags = 0; // No effects by default - vanilla functionality
|
||||||
|
|
||||||
QString f_song = f_contents.at(0);
|
QString f_song = f_contents.at(0);
|
||||||
QString f_song_clear = f_song.left(f_song.lastIndexOf("."));
|
QString f_song_clear = f_song.left(f_song.lastIndexOf("."));
|
||||||
if (f_song.startsWith("http")) {
|
if (f_song.startsWith("http")) {
|
||||||
@ -3796,69 +3801,43 @@ void Courtroom::handle_song(QStringList *p_contents)
|
|||||||
QString f_song_decoded = QUrl::fromPercentEncoding(f_song_bytearray);
|
QString f_song_decoded = QUrl::fromPercentEncoding(f_song_bytearray);
|
||||||
f_song_clear = f_song_decoded.left(f_song_decoded.lastIndexOf("."));
|
f_song_clear = f_song_decoded.left(f_song_decoded.lastIndexOf("."));
|
||||||
}
|
}
|
||||||
f_song_clear = f_song_clear.right(f_song_clear.length() -
|
f_song_clear = f_song_clear.right(f_song_clear.length() - (f_song_clear.lastIndexOf("/") + 1));
|
||||||
(f_song_clear.lastIndexOf("/") + 1));
|
|
||||||
int n_char = f_contents.at(1).toInt();
|
|
||||||
|
|
||||||
// Assume the song doesn't loop unless told otherwise (due to most outdated
|
int n_char = f_contents.at(1).toInt(&ok);
|
||||||
// servers handling looping through serverside)
|
if (!ok)
|
||||||
bool looping = false;
|
return;
|
||||||
// Channel 0 is the 'master music', other channels would commonly be used for
|
|
||||||
// ambience
|
|
||||||
int channel = 0;
|
|
||||||
// No effects assumed by default - vanilla functionality
|
|
||||||
int effect_flags = 0;
|
|
||||||
|
|
||||||
if (n_char < 0 || n_char >= char_list.size()) {
|
if (p_contents->length() > 3 && p_contents->at(3) == "1")
|
||||||
int channel = 0;
|
looping = true;
|
||||||
if (p_contents->length() > 3 && p_contents->at(3) == "1")
|
|
||||||
looping = true;
|
|
||||||
|
|
||||||
if (p_contents->length() >
|
if (p_contents->length() > 4) {
|
||||||
4) // eyyy we want to change this song's CHANNEL huh
|
// eyyy we want to change this song's CHANNEL huh
|
||||||
channel = p_contents->at(4).toInt(); // let the music player handle it if
|
// let the music player handle it if it's bigger than the channel list
|
||||||
// it's bigger than the channel list
|
channel = p_contents->at(4).toInt(&ok);
|
||||||
|
if (!ok)
|
||||||
if (p_contents->length() > 5) // Flags provided to us by server such as Fade
|
return;
|
||||||
// In, Fade Out, Sync Pos etc.
|
|
||||||
{
|
|
||||||
effect_flags = p_contents->at(5).toInt();
|
|
||||||
}
|
|
||||||
music_player->play(f_song, channel, looping, effect_flags);
|
|
||||||
if (f_song == "~stop.mp3")
|
|
||||||
ui_music_name->setText(tr("None"));
|
|
||||||
else if (channel == 0) {
|
|
||||||
if (file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && !f_song.startsWith("http"))
|
|
||||||
ui_music_name->setText(f_song_clear);
|
|
||||||
else if (f_song.startsWith("http"))
|
|
||||||
ui_music_name->setText(tr("[STREAM] %1").arg(f_song_clear));
|
|
||||||
else
|
|
||||||
ui_music_name->setText(tr("[MISSING] %1").arg(f_song_clear));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
if (p_contents->length() > 5) {
|
||||||
|
// Flags provided to us by server such as Fade In, Fade Out, Sync Pos etc.
|
||||||
|
effect_flags = p_contents->at(5).toInt(&ok);
|
||||||
|
if (!ok)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && !f_song.startsWith("http")
|
||||||
|
&& f_song != "~stop.mp3" && !ao_app->asset_url.isEmpty()) {
|
||||||
|
f_song = (ao_app->asset_url + "sounds/music/" + f_song).toLower();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_stop = (f_song == "~stop.mp3");
|
||||||
|
if (n_char >= 0 && n_char < char_list.size()) {
|
||||||
QString str_char = char_list.at(n_char).name;
|
QString str_char = char_list.at(n_char).name;
|
||||||
QString str_show = ao_app->get_showname(str_char);
|
QString str_show = ao_app->get_showname(str_char);
|
||||||
|
|
||||||
if (p_contents->length() > 2) {
|
if (p_contents->length() > 2) {
|
||||||
if (p_contents->at(2) != "") {
|
if (p_contents->at(2) != "") {
|
||||||
str_show = p_contents->at(2);
|
str_show = p_contents->at(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p_contents->length() > 3 && p_contents->at(3) == "1") {
|
|
||||||
looping = true;
|
|
||||||
}
|
|
||||||
if (p_contents->length() >
|
|
||||||
4) // eyyy we want to change this song's CHANNEL huh
|
|
||||||
channel = p_contents->at(4).toInt(); // let the music player handle it if
|
|
||||||
// it's bigger than the channel list
|
|
||||||
|
|
||||||
if (p_contents->length() > 5) // Flags provided to us by server such as Fade
|
|
||||||
// In, Fade Out, Sync Pos etc.
|
|
||||||
{
|
|
||||||
effect_flags = p_contents->at(5).toInt();
|
|
||||||
}
|
|
||||||
bool is_stop = f_song == "~stop.mp3";
|
|
||||||
if (!mute_map.value(n_char)) {
|
if (!mute_map.value(n_char)) {
|
||||||
if (is_stop) {
|
if (is_stop) {
|
||||||
log_ic_text(str_char, str_show, "", tr("has stopped the music"));
|
log_ic_text(str_char, str_show, "", tr("has stopped the music"));
|
||||||
@ -3868,19 +3847,30 @@ void Courtroom::handle_song(QStringList *p_contents)
|
|||||||
log_ic_text(str_char, str_show, f_song, tr("has played a song"));
|
log_ic_text(str_char, str_show, f_song, tr("has played a song"));
|
||||||
append_ic_text(f_song_clear, str_show, tr("has played a song"));
|
append_ic_text(f_song_clear, str_show, tr("has played a song"));
|
||||||
}
|
}
|
||||||
music_player->play(f_song, channel, looping, effect_flags);
|
|
||||||
if (is_stop)
|
|
||||||
ui_music_name->setText(tr("None"));
|
|
||||||
else if (channel == 0) {
|
|
||||||
if (file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && !f_song.startsWith("http"))
|
|
||||||
ui_music_name->setText(f_song_clear);
|
|
||||||
else if (f_song.startsWith("http"))
|
|
||||||
ui_music_name->setText(tr("[STREAM] %1").arg(f_song_clear));
|
|
||||||
else
|
|
||||||
ui_music_name->setText(tr("[MISSING] %1").arg(f_song_clear));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int error_code = music_player->play(f_song, channel, looping, effect_flags);
|
||||||
|
|
||||||
|
if (is_stop) {
|
||||||
|
ui_music_name->setText(tr("None"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error_code == BASS_ERROR_HANDLE) { // Cheap hack to see if file missing
|
||||||
|
ui_music_name->setText(tr("[MISSING] %1").arg(f_song_clear));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f_song.startsWith("http") && channel == 0) {
|
||||||
|
ui_music_name->setText(tr("[STREAM] %1").arg(f_song_clear));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel == 0){
|
||||||
|
ui_music_name->setText(f_song_clear);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Courtroom::handle_wtce(QString p_wtce, int variant)
|
void Courtroom::handle_wtce(QString p_wtce, int variant)
|
||||||
|
@ -703,6 +703,16 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
w_courtroom->on_authentication_state_received(authenticated);
|
w_courtroom->on_authentication_state_received(authenticated);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//AssetURL Packet
|
||||||
|
else if (header == "ASS") {
|
||||||
|
if (f_contents.size() > 1 || f_contents.size() == 0) { // This can never be more than one link.
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
QUrl t_asset_url = QUrl::fromPercentEncoding(f_contents.at(0).toUtf8());
|
||||||
|
if (t_asset_url.isValid())
|
||||||
|
asset_url = t_asset_url.toString();
|
||||||
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
||||||
delete p_packet;
|
delete p_packet;
|
||||||
|
Loading…
Reference in New Issue
Block a user