Create wesnoth.music_list.previous, along with the __cfg field for tracks (#1728)

This commit is contained in:
Pentarctagon 2017-05-29 07:51:06 -05:00 committed by Celtic Minstrel
parent 015fede311
commit ad5bbd4131
3 changed files with 48 additions and 0 deletions

View file

@ -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);
}

View file

@ -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();
}

View file

@ -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);