Skip to content

Commit 802991f

Browse files
author
Dextinfire
committed
Audio only subtitles
1 parent 22dedb1 commit 802991f

4 files changed

Lines changed: 78 additions & 1 deletion

File tree

src/audio/audiosystem.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,33 @@ void AudioInit() {
190190
IsInit = true;
191191
}
192192

193+
void AudioSubtitlesStart(AudioChannel* channel) {
194+
using Profile::Subtitle::SubtitleMappings;
195+
std::optional<Subtitle::SubtitlePlayer> player;
196+
197+
if (channel->GetGroup() != AudioChannelGroup::ACG_BGM) return;
198+
AudioStream const* bgmStream = channel->GetStream();
199+
200+
auto bgmSubtitleMapItr = SubtitleMappings.find("bgm");
201+
if (bgmSubtitleMapItr == SubtitleMappings.end()) return;
202+
auto mappingsItr =
203+
bgmSubtitleMapItr->second.find(bgmStream->GetBaseStream()->Meta.FileName);
204+
if (mappingsItr == bgmSubtitleMapItr->second.end()) {
205+
mappingsItr =
206+
bgmSubtitleMapItr->second.find(bgmStream->GetBaseStream()->Meta.Id);
207+
}
208+
if (mappingsItr == bgmSubtitleMapItr->second.end()) return;
209+
210+
SubtitlePlayers[channel->GetId() - AC_BGM0].emplace(Profile::DesignWidth,
211+
Profile::DesignHeight);
212+
int trackId = 0;
213+
for (auto const& subFile : mappingsItr->second) {
214+
if (!subFile.Path) continue;
215+
SubtitlePlayers[channel->GetId() - AC_BGM0]->AddTrackFile(
216+
trackId++, subFile.Type, *subFile.Path, subFile.Config);
217+
}
218+
}
219+
193220
void PlayInGroup(AudioChannelGroup group, std::string const& mountpoint,
194221
uint32_t fileId, bool loop, float fadeIn) {
195222
AudioChannel* channel = GetNextChannelInGroup(group);
@@ -223,5 +250,34 @@ void AudioUpdate(float dt) {
223250
}
224251
}
225252

253+
void AudioSubtitlesUpdate() {
254+
for (int i = 0; i < ssize(SubtitlePlayers); i++) {
255+
if (!SubtitlePlayers[i]) continue;
256+
auto const* currentChannel = Channels[i + AC_BGM0].get();
257+
switch (currentChannel->GetState()) {
258+
case ACS_Stopped:
259+
SubtitlePlayers[i].reset();
260+
break;
261+
case ACS_Paused:
262+
break;
263+
case ACS_Playing:
264+
case ACS_FadingIn:
265+
case ACS_FadingOut: {
266+
auto durationSec =
267+
std::chrono::duration<float>{currentChannel->PositionInSeconds()};
268+
SubtitlePlayers[i]->UpdateElapsedTime(
269+
std::chrono::duration_cast<Video::Clock::Microseconds>(
270+
durationSec));
271+
}
272+
}
273+
}
274+
}
275+
276+
void AudioSubtitlesRender() {
277+
for (auto& subtitlePlayer : SubtitlePlayers) {
278+
if (subtitlePlayer) subtitlePlayer->Render();
279+
}
280+
}
281+
226282
} // namespace Audio
227283
} // namespace Impacto

src/audio/audiosystem.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
#pragma once
22

3+
#include <memory>
4+
35
#include "../impacto.h"
46
#include "../log.h"
57
#include "audiochannel.h"
68
#include "audiobackend.h"
7-
#include <memory>
9+
#include "../subtitle/subtitlesystem.h"
810

911
namespace Impacto {
1012
namespace Audio {
@@ -13,12 +15,19 @@ void AudioInit();
1315
void AudioUpdate(float dt);
1416
void AudioShutdown();
1517

18+
void AudioSubtitlesStart(AudioChannel* channel);
19+
void AudioSubtitlesUpdate();
20+
void AudioSubtitlesRender();
21+
1622
inline AudioBackend* Backend = nullptr;
1723

1824
inline float MasterVolume = 1.0f;
1925
inline std::array<float, ACG_Count> GroupVolumes;
2026
inline std::array<std::unique_ptr<AudioChannel>, AC_Count> Channels;
2127

28+
// 3 subtitle players for 3 bgm channels
29+
inline std::array<std::optional<Subtitle::SubtitlePlayer>, 3> SubtitlePlayers;
30+
2231
template <AudioChannelId... Ids>
2332
struct ChannelGroupDef {
2433
static constexpr std::array<AudioChannelId, sizeof...(Ids)> ChannelIds{

src/audio/openal/openalaudiochannel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ void OpenALAudioChannel::Play(std::unique_ptr<AudioStream> stream, bool loop,
4949
FadeProgress = FadeDuration == 0 ? 1.0f : 0.0f;
5050
State = FadeDuration == 0 ? ACS_Playing : ACS_FadingIn;
5151
Looping = loop;
52+
53+
AudioSubtitlesStart(this);
5254
}
5355

5456
void OpenALAudioChannel::Stop(float fadeOutDuration) {

src/game.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@ void Update(float dt) {
332332
Video::VideoUpdate(dt);
333333
}
334334

335+
if (+Profile::GameFeatures & +GameFeature::Audio &&
336+
+Profile::GameFeatures & +GameFeature::Subtitles) {
337+
Audio::AudioSubtitlesUpdate();
338+
}
339+
335340
if (+Profile::GameFeatures & +GameFeature::Scene3D) {
336341
Renderer->Scene->Update(dt);
337342
}
@@ -511,6 +516,11 @@ static void RenderMain() {
511516
(ScrWork[SW_MOVIEPRI] == 3000 || ScrWork[SW_MOVIEPRI] == 4000)))) {
512517
Video::VideoRender(ScrWork[SW_MOVIEALPHA] / 256.0f);
513518
}
519+
520+
if (+Profile::GameFeatures & +GameFeature::Audio &&
521+
+Profile::GameFeatures & +GameFeature::Subtitles) {
522+
Audio::AudioSubtitlesRender();
523+
}
514524
MaskCapture.SetHasEffects(false);
515525
}
516526

0 commit comments

Comments
 (0)