You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
6.8 KiB
234 lines
6.8 KiB
-- Audio lib
|
|
local _, app = ...;
|
|
local api = {};
|
|
app.Audio = api;
|
|
|
|
-- Sound Pack Management
|
|
local EventHandlers, SoundPacks, CurrentSoundPack = {}, {}, nil;
|
|
function api:ActivateSoundPack(name, noerror)
|
|
local t = type(name);
|
|
if t == "string" then
|
|
local soundPack = SoundPacks[name];
|
|
if not soundPack then
|
|
if noerror then
|
|
return;
|
|
else
|
|
error("SoundPack '" .. name .. "' not found. Use AllTheThings.Audio:CreateSoundPack first!");
|
|
end
|
|
end
|
|
CurrentSoundPack = soundPack;
|
|
elseif t == "table" then
|
|
CurrentSoundPack = api:CreateSoundPack(name.name, name);
|
|
elseif noerror then
|
|
return;
|
|
else
|
|
error("SoundPack '" .. tostring(name) .. "' is invalid!");
|
|
end
|
|
AllTheThingsSavedVariables.CurrentSoundPack = CurrentSoundPack.name;
|
|
for i,handler in ipairs(EventHandlers) do
|
|
pcall(handler, "Activated", CurrentSoundPack);
|
|
end
|
|
return CurrentSoundPack;
|
|
end
|
|
function api:CreateSoundPack(name, sounds)
|
|
if not name or type(name) ~= "string" then
|
|
error("SoundPack '" .. tostring(name) .. "' is invalid!");
|
|
end
|
|
local soundPack = SoundPacks[name];
|
|
if not soundPack then
|
|
SoundPacks[name] = sounds;
|
|
elseif soundPack ~= sounds then
|
|
error("Sound Pack '" .. name .. "' is already in use by another sound pack.");
|
|
end
|
|
sounds.name = name;
|
|
for i,handler in ipairs(EventHandlers) do
|
|
pcall(handler, "Created", sounds);
|
|
end
|
|
return sounds;
|
|
end
|
|
function api:GetActiveSoundPack()
|
|
return CurrentSoundPack;
|
|
end
|
|
function api:GetAllSoundPacks()
|
|
return SoundPacks;
|
|
end
|
|
function api:GetSoundPack(name)
|
|
return SoundPacks[name];
|
|
end
|
|
function api:RegisterForSoundPackEvents(handler)
|
|
if type(handler) ~= "function" then
|
|
error("Invalid event handler '" .. tostring(handler) .. "'");
|
|
end
|
|
tinsert(EventHandlers, handler);
|
|
end
|
|
function api:ReloadSoundPack()
|
|
api:ActivateSoundPack(AllTheThingsSavedVariables.CurrentSoundPack or "Default", true);
|
|
end
|
|
local DefaultSoundPack = api:CreateSoundPack("Default", {
|
|
COMPLETE = {
|
|
app.asset("complete1.ogg"),
|
|
},
|
|
DEATH = {
|
|
app.asset("death.ogg"),
|
|
},
|
|
FANFARE = {
|
|
app.asset("fanfare1.ogg"),
|
|
app.asset("fanfare2.ogg"),
|
|
app.asset("fanfare3.ogg"),
|
|
app.asset("fanfare4.ogg"),
|
|
app.asset("fanfare5.ogg"),
|
|
app.asset("fanfare6.ogg"),
|
|
},
|
|
MOUNTFANFARE = {
|
|
app.asset("mountfanfare1.ogg"),
|
|
},
|
|
RAREFIND = {
|
|
app.asset("rarefind1.wav"),
|
|
},
|
|
REMOVE = {
|
|
app.asset("remove1.ogg"),
|
|
},
|
|
REPORT = {}, -- Only specifying the REPORT table prevents any report sound from playing
|
|
});
|
|
CurrentSoundPack = DefaultSoundPack;
|
|
|
|
-- Some extra Sound Packs
|
|
api:CreateSoundPack("Default (With Report Sounds)", {
|
|
REPORT = {
|
|
app.asset("report1.ogg"),
|
|
},
|
|
});
|
|
|
|
-- Play Audio API
|
|
local SoundDelays = setmetatable({}, {
|
|
__index = function(t, key)
|
|
return 0;
|
|
end
|
|
});
|
|
local function PlayAudio(soundType, setting)
|
|
if not setting or app.Settings:GetTooltipSetting(setting) then
|
|
-- Don't spam the users. It's nice sometimes, but let's put a delay of at least 1 second on there.
|
|
local now = time();
|
|
if SoundDelays[soundType] < now then
|
|
local targetAudio = CurrentSoundPack[soundType] or DefaultSoundPack[soundType];
|
|
if targetAudio then
|
|
local audioCount = #targetAudio;
|
|
if audioCount > 0 then
|
|
SoundDelays[soundType] = now + 1;
|
|
local soundFile = targetAudio[math.random(1, audioCount)];
|
|
if soundFile then
|
|
(type(soundFile) == "string" and PlaySoundFile or PlaySound)(soundFile, app.Settings:GetTooltipSetting("Channel"));
|
|
app.PrintDebug("PlayAudio",soundFile)
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function api:PlayCompleteSound()
|
|
PlayAudio("COMPLETE", "Celebrate");
|
|
end
|
|
function api:PlayDeathSound()
|
|
PlayAudio("DEATH", "PlayDeathSound");
|
|
end
|
|
function api:PlayFanfare()
|
|
PlayAudio("FANFARE", "Celebrate");
|
|
end
|
|
function api:PlayMountFanfare()
|
|
if not PlayAudio("MOUNTFANFARE", "Celebrate") then
|
|
PlayAudio("FANFARE", "Celebrate")
|
|
end
|
|
end
|
|
function api:PlayRareFindSound()
|
|
PlayAudio("RAREFIND", "RareFind");
|
|
end
|
|
function api:PlayRemoveSound()
|
|
PlayAudio("REMOVE", "Warn:Removed");
|
|
end
|
|
function api:PlayReportSound()
|
|
if app.Settings:GetTooltipSetting("Warn:Removed") or app.Settings:GetTooltipSetting("Celebrate") or app.Contributor then
|
|
PlayAudio("REPORT");
|
|
end
|
|
end
|
|
|
|
-- Deprecated functions (they will still work for now)
|
|
-- Crieve NOTE: Not sure if that comment above also applies to the following functions too.
|
|
|
|
-- Accepts various 'type' values to insert a Sound into the respective table
|
|
function app.AddSound(tableName, sound)
|
|
local soundType = type(sound);
|
|
if soundType ~= "string" and soundType ~= "number" then
|
|
error("Sound must be either a string FilePath ('Interface/...') or a FileDataID number");
|
|
end
|
|
tableName = (tableName or ""):upper();
|
|
if not DefaultSoundPack[tableName] then -- If it isn't in the default sound pack, it's not valid for any Sound Pack for ATT.
|
|
error("Sound table '".. tableName .. "' is not valid");
|
|
end
|
|
local deprecatedSoundPack = SoundPacks.Modified or api:CreateSoundPack("Modified", {});
|
|
local soundTable = deprecatedSoundPack[tableName];
|
|
if not soundTable then
|
|
soundTable = {};
|
|
for i,snd in ipairs(DefaultSoundPack[tableName]) do
|
|
tinsert(soundTable, snd);
|
|
end
|
|
deprecatedSoundPack[tableName] = soundTable;
|
|
end
|
|
tinsert(soundTable, sound);
|
|
end
|
|
-- Allows clearing the Sounds for a given 'type' of Sound
|
|
function app.ClearSounds(tableName)
|
|
tableName = (tableName or ""):upper();
|
|
if not DefaultSoundPack[tableName] then -- If it isn't in the default sound pack, it's not valid for any Sound Pack for ATT.
|
|
error("Sound table '".. tableName .. "' is not valid");
|
|
end
|
|
local deprecatedSoundPack = SoundPacks.Modified or api:CreateSoundPack("Modified", {});
|
|
local soundTable = deprecatedSoundPack[tableName];
|
|
if not soundTable then
|
|
deprecatedSoundPack[tableName] = {};
|
|
else
|
|
wipe(soundTable);
|
|
end
|
|
end
|
|
|
|
-- Note that any enabled sound table will completely replace the Default sounds for that table
|
|
local AprilFoolsSoundPack = api:CreateSoundPack("April Fools Sounds", {
|
|
COMPLETE = {
|
|
49371,
|
|
49372,
|
|
},
|
|
DEATH = {
|
|
20278,
|
|
},
|
|
FANFARE = {
|
|
app.asset("ffdamnson.ogg"),
|
|
app.asset("ffanime.ogg"),
|
|
app.asset("ffezz.ogg"),
|
|
app.asset("ffprettygood.ogg"),
|
|
app.asset("ffwow.ogg"),
|
|
app.asset("ffnice.ogg"),
|
|
},
|
|
MOUNTFANFARE = {
|
|
108419,
|
|
},
|
|
RAREFIND = {
|
|
256849,
|
|
},
|
|
REMOVE = {
|
|
24272,
|
|
},
|
|
REPORT = {
|
|
161694,
|
|
},
|
|
});
|
|
|
|
local StartupSpecialSoundPack
|
|
local currentCalendarTime = C_DateAndTime and C_DateAndTime.GetCurrentCalendarTime()
|
|
if currentCalendarTime and currentCalendarTime.month == 4 and currentCalendarTime.monthDay == 1 then
|
|
StartupSpecialSoundPack = AprilFoolsSoundPack
|
|
end
|
|
|
|
app.AddEventHandler("OnReady", function()
|
|
-- Prepare the Sound Pack!
|
|
api:ActivateSoundPack(StartupSpecialSoundPack or AllTheThingsSavedVariables.CurrentSoundPack or "Default", true);
|
|
end);
|
|
|