Create wesnoth.music_list.previous, along with the __cfg field for tracks (#1728)
This commit is contained in:
parent
015fede311
commit
ad5bbd4131
3 changed files with 48 additions and 0 deletions
|
@ -13,6 +13,7 @@ See the COPYING file for more details.
|
|||
|
||||
#include "lua_audio.hpp"
|
||||
|
||||
#include "log.hpp"
|
||||
#include "lua/lua.h"
|
||||
#include "lua/lauxlib.h"
|
||||
#include "scripting/lua_common.hpp"
|
||||
|
@ -22,12 +23,18 @@ See the COPYING file for more details.
|
|||
#include "preferences/general.hpp"
|
||||
#include <set>
|
||||
|
||||
static lg::log_domain log_audio("audio");
|
||||
#define DBG_AUDIO LOG_STREAM(debug, log_audio)
|
||||
#define LOG_AUDIO LOG_STREAM(info, log_audio)
|
||||
#define ERR_AUDIO LOG_STREAM(err, log_audio)
|
||||
|
||||
static const char* Track = "music track";
|
||||
|
||||
class lua_music_track {
|
||||
std::shared_ptr<sound::music_track> track;
|
||||
public:
|
||||
explicit lua_music_track(int i) : track(sound::get_track(i)) {}
|
||||
explicit lua_music_track(std::shared_ptr<sound::music_track> new_track) : track(new_track) {}
|
||||
bool valid() const {
|
||||
return track && track->valid();
|
||||
}
|
||||
|
@ -51,6 +58,12 @@ static lua_music_track* push_track(lua_State* L, int i) {
|
|||
return trk;
|
||||
}
|
||||
|
||||
static lua_music_track* push_track(lua_State* L, std::shared_ptr<sound::music_track> new_track) {
|
||||
lua_music_track* trk = new(L) lua_music_track(new_track);
|
||||
luaL_setmetatable(L, Track);
|
||||
return trk;
|
||||
}
|
||||
|
||||
static lua_music_track* get_track(lua_State* L, int i) {
|
||||
return static_cast<lua_music_track*>(luaL_checkudata(L, i, Track));
|
||||
}
|
||||
|
@ -71,10 +84,17 @@ static int impl_music_get(lua_State* L) {
|
|||
return 1;
|
||||
}
|
||||
const char* m = luaL_checkstring(L, 2);
|
||||
|
||||
if(strcmp(m, "current") == 0) {
|
||||
push_track(L, sound::get_current_track());
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(strcmp(m, "previous") == 0) {
|
||||
push_track(L, sound::get_previous_music_track());
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(strcmp(m, "current_i") == 0) {
|
||||
size_t i = sound::get_current_track();
|
||||
if(i == sound::get_num_tracks()) {
|
||||
|
@ -227,6 +247,17 @@ static int impl_track_get(lua_State* L) {
|
|||
return_int_attrib("ms_after", track->ms_after());
|
||||
return_string_attrib("name", track->id());
|
||||
return_string_attrib("title", track->title());
|
||||
|
||||
return_cfg_attrib("__cfg",
|
||||
cfg["append"]=track->append();
|
||||
cfg["shuffle"]=track->shuffle();
|
||||
cfg["immediate"]=track->immediate();
|
||||
cfg["once"]=track->play_once();
|
||||
cfg["ms_before"]=track->ms_before();
|
||||
cfg["ms_after"]=track->ms_after();
|
||||
cfg["name"]=track->id();
|
||||
cfg["title"]=track->title());
|
||||
|
||||
return luaW_getmetafield(L, 1, m);
|
||||
}
|
||||
|
||||
|
|
|
@ -177,6 +177,7 @@ std::vector<std::string> played_before;
|
|||
std::vector<std::shared_ptr<sound::music_track>> current_track_list;
|
||||
std::shared_ptr<sound::music_track> current_track;
|
||||
unsigned int current_track_index = 0;
|
||||
std::shared_ptr<sound::music_track> previous_track;
|
||||
|
||||
std::vector<std::shared_ptr<sound::music_track>>::const_iterator find_track(const sound::music_track& track)
|
||||
{
|
||||
|
@ -193,6 +194,14 @@ unsigned int get_current_track()
|
|||
{
|
||||
return current_track_index;
|
||||
}
|
||||
std::shared_ptr<music_track> get_previous_music_track()
|
||||
{
|
||||
return previous_track;
|
||||
}
|
||||
void set_previous_track(std::shared_ptr<music_track> track)
|
||||
{
|
||||
previous_track = track;
|
||||
}
|
||||
|
||||
unsigned int get_num_tracks()
|
||||
{
|
||||
|
@ -541,6 +550,7 @@ void stop_UI_sound()
|
|||
|
||||
void play_music_once(const std::string& file)
|
||||
{
|
||||
set_previous_track(current_track);
|
||||
current_track = std::make_shared<music_track>(file);
|
||||
current_track->set_play_once(true);
|
||||
current_track_index = current_track_list.size();
|
||||
|
@ -566,6 +576,7 @@ void play_music()
|
|||
|
||||
void play_track(unsigned int i)
|
||||
{
|
||||
set_previous_track(current_track);
|
||||
if(i >= current_track_list.size()) {
|
||||
current_track = choose_track();
|
||||
} else {
|
||||
|
@ -655,6 +666,7 @@ void play_music_config(const config& music_node, int i)
|
|||
|
||||
// If they say play once, we don't alter playlist.
|
||||
if(track.play_once()) {
|
||||
set_previous_track(current_track);
|
||||
current_track = std::make_shared<music_track>(track);
|
||||
current_track_index = current_track_list.size();
|
||||
play_music();
|
||||
|
@ -690,6 +702,7 @@ void play_music_config(const config& music_node, int i)
|
|||
|
||||
// They can tell us to start playing this list immediately.
|
||||
if(track.immediate()) {
|
||||
set_previous_track(current_track);
|
||||
current_track = *iter;
|
||||
current_track_index = iter - current_track_list.begin();
|
||||
play_music();
|
||||
|
@ -703,6 +716,7 @@ void music_thinker::process(events::pump_info& info)
|
|||
if(preferences::music_on()) {
|
||||
if(!music_start_time && !current_track_list.empty() && !Mix_PlayingMusic()) {
|
||||
// Pick next track, add ending time to its start time.
|
||||
set_previous_track(current_track);
|
||||
current_track = choose_track();
|
||||
music_start_time = info.ticks();
|
||||
no_fading = true;
|
||||
|
@ -774,6 +788,7 @@ void commit_music_changes()
|
|||
}
|
||||
|
||||
// FIXME: we don't pause ms_before on this first track. Should we?
|
||||
set_previous_track(current_track);
|
||||
current_track = choose_track();
|
||||
play_music();
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "events.hpp"
|
||||
#include "sound_music_track.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
|
@ -104,6 +105,7 @@ void set_bell_volume(int vol);
|
|||
void set_UI_volume(int vol);
|
||||
|
||||
unsigned int get_current_track();
|
||||
std::shared_ptr<sound::music_track> get_previous_music_track();
|
||||
unsigned int get_num_tracks();
|
||||
void remove_track(unsigned int i);
|
||||
void play_track(unsigned int i);
|
||||
|
|
Loading…
Add table
Reference in a new issue