Skip to content

Commit

Permalink
Merge branch 'radiotrackman' of github.com:yukani/gta-reversed-modern…
Browse files Browse the repository at this point in the history
… into yukani_radiotrackman
  • Loading branch information
Pirulax committed Aug 6, 2023
2 parents 79c3abe + eca551d commit 340e69f
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 13 deletions.
2 changes: 1 addition & 1 deletion source/game_sa/Audio/hardware/AEAudioHardware.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "AETrackLoader.h"
#include "AESoundManager.h"
#include "AEStreamThread.h"
#include "AudioEngine.h"

#ifdef PlaySound
#undef PlaySound
Expand Down Expand Up @@ -169,7 +170,6 @@ class CAEAudioHardware {
private:
auto GetChannels() const { return std::span{m_aChannels, m_nNumChannels}; }
};

VALIDATE_SIZE(CAEAudioHardware, 0x1018);

extern CAEAudioHardware& AEAudioHardware;
2 changes: 1 addition & 1 deletion source/game_sa/Audio/hardware/AEStreamingChannel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ void CAEStreamingChannel::InjectHooks() {
RH_ScopedInstall(Constructor, 0x4F1800);
RH_ScopedInstall(Destructor, 0x4F2200);
RH_ScopedInstall(SynchPlayback, 0x4F1870);
RH_ScopedInstall(PrepareStream, 0x4F23D0, { .reversed = false });
RH_ScopedInstall(PrepareStream, 0x4F23D0, { .reversed = true });
RH_ScopedInstall(Initialise, 0x4F22F0);
RH_ScopedInstall(Pause, 0x4F2170);
RH_ScopedInstall(SetReady, 0x4F1FF0);
Expand Down
38 changes: 30 additions & 8 deletions source/game_sa/Audio/loaders/AEFlacDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,9 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder* decoder
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;

auto* flacDecoder = reinterpret_cast<CAEFlacDecoder*>(client_data);
const auto out = reinterpret_cast<int16*>(flacDecoder->GetWriteBuffer());
auto& fillBufferInfo = flacDecoder->GetFillBufferInfo();

if (!out)
if (!fillBufferInfo.writeBuffer || !fillBufferInfo.maxBytes)
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;

const auto bps = flacDecoder->GetMetadata().bps;
Expand All @@ -95,10 +95,27 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder* decoder
}
};

for (auto i = 0u; i < frame->header.blocksize; i++) {
out[2u * i + 0u] = ConvertSample(buffer[0][i]); // left
out[2u * i + 1u] = ConvertSample(buffer[1][i]); // right
assert(!fillBufferInfo.leftoverWrittenBytes && buffer);

auto writeCount = frame->header.blocksize * sizeof(*buffer), leftoverCount = 0u;
if (writeCount > fillBufferInfo.maxBytes) {
leftoverCount = writeCount - fillBufferInfo.maxBytes;
writeCount = fillBufferInfo.maxBytes / sizeof(*buffer);
}
assert(leftoverCount < CAEFlacDecoder::LEFTOVER_SAMPLES_SIZE * sizeof(int16));

for (auto i = 0u; i < writeCount; i++) {
fillBufferInfo.writeBuffer[2u * i + 0u] = ConvertSample(buffer[0][i]); // left
fillBufferInfo.writeBuffer[2u * i + 1u] = ConvertSample(buffer[1][i]); // right
}
fillBufferInfo.writeWrittenBytes = writeCount * sizeof(int16) * 2;

for (auto i = 0u; i < leftoverCount; i++) {
fillBufferInfo.leftoverBuffer[2u * i + 0u] = ConvertSample(buffer[0][i]); // left
fillBufferInfo.leftoverBuffer[2u * i + 1u] = ConvertSample(buffer[1][i]); // right
}
fillBufferInfo.leftoverWrittenBytes = leftoverCount * sizeof(int16) * 2;

return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}

Expand Down Expand Up @@ -186,26 +203,31 @@ bool CAEFlacDecoder::Initialise() {
}
*/

m_bufferLeftoverSamples = new int16[LEFTOVER_SAMPLES_SIZE];

m_bInitialized = true;
return true;
}

CAEFlacDecoder::~CAEFlacDecoder() {
if (m_FlacStreamDecoder)
FLAC__stream_decoder_delete(std::exchange(m_FlacStreamDecoder, nullptr));

delete m_bufferLeftoverSamples;
}

size_t CAEFlacDecoder::FillBuffer(void* dest, size_t size) {
if (!m_bInitialized || !m_metadata.channels || size == 0)
return 0u;

m_CurrentWriteBuffer = reinterpret_cast<uint8*>(dest);
m_fillBufferInfo.writeBuffer = reinterpret_cast<int16*>(dest);

size_t totalRead = 0;
uint64 initialPos{};
FLAC__stream_decoder_get_decode_position(m_FlacStreamDecoder, &initialPos);

while (totalRead < size) {
m_fillBufferInfo.maxBytes = size - totalRead;
const auto result = FLAC__stream_decoder_process_single(m_FlacStreamDecoder);

if (!result) {
Expand All @@ -219,10 +241,10 @@ size_t CAEFlacDecoder::FillBuffer(void* dest, size_t size) {
assert(newPos > initialPos);
const auto dist = newPos - initialPos;

m_CurrentWriteBuffer += dist;
m_fillBufferInfo.writeBuffer += dist;
totalRead += static_cast<size_t>(dist);
}
m_CurrentWriteBuffer = nullptr;
m_fillBufferInfo = {};

return totalRead;
}
Expand Down
19 changes: 16 additions & 3 deletions source/game_sa/Audio/loaders/AEFlacDecoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,18 @@ struct FlacMetadata {
uint32 sampleRate{};
};

struct FlacFillBufferInfo {
int16* writeBuffer{};
size_t maxBytes{};
size_t writeWrittenBytes{};
int16* leftoverBuffer{};
size_t leftoverWrittenBytes{};
};

class CAEFlacDecoder : public CAEStreamingDecoder {
public:
static constexpr auto LEFTOVER_SAMPLES_SIZE = 80'000u;

CAEFlacDecoder(CAEDataStream* dataStream) : CAEStreamingDecoder(dataStream) {}
virtual ~CAEFlacDecoder();

Expand All @@ -34,14 +44,17 @@ class CAEFlacDecoder : public CAEStreamingDecoder {
auto& GetMetadata() {
return m_metadata;
}
auto* GetWriteBuffer() {
return m_CurrentWriteBuffer;
auto& GetFillBufferInfo() {
return m_fillBufferInfo;
}

private:
FLAC__StreamDecoder* m_FlacStreamDecoder{};
uint8* m_CurrentWriteBuffer{};
FlacFillBufferInfo m_fillBufferInfo{};
FlacMetadata m_metadata{};
bool m_bInitialized{};

int16* m_bufferLeftoverSamples{};
size_t m_leftoverSamplesSize{};
};
#endif

0 comments on commit 340e69f

Please sign in to comment.