mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-15 15:58:23 +00:00
ff8368c606
FFmpeg offers two opus decoders: - libopus, this one is fed the same data (that affects output) as the previous libopus decoder had as well - native opus decoder: this only takes Float32 samples, we then need to invoke swrescale to translate between s16 (what switch sends) and float32 (what FFmpeg expects), the process is computationally more expensive, but trades off neatly as the native opus decoder is very optimised It also relegates the handling to FFmpeg, which simplifies existing code (more concretely, by using the "fill/drain" scheme for packets/frames) Closes #2897 Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4169 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: Maufeat <sahyno1996@gmail.com>
52 lines
2.3 KiB
C++
52 lines
2.3 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <array>
|
|
#include <mutex>
|
|
#include "audio_core/adsp/apps/opus/opus_decoder.h"
|
|
#include "audio_core/adsp/apps/opus/shared_memory.h"
|
|
#include "audio_core/adsp/mailbox.h"
|
|
#include "core/hle/service/audio/errors.h"
|
|
|
|
namespace AudioCore::OpusDecoder {
|
|
class OpusDecoder;
|
|
class HardwareOpus {
|
|
public:
|
|
HardwareOpus(Core::System& system);
|
|
Result RegisterDecoder(OpusDecoder* decoder);
|
|
void UnregisterDecoder(OpusDecoder* decoder);
|
|
|
|
u32 GetWorkBufferSize(u32 channel);
|
|
u32 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count);
|
|
|
|
Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer,
|
|
u64 buffer_size);
|
|
Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count,
|
|
u32 totaL_stream_count, u32 stereo_stream_count,
|
|
const void* mappings, void* buffer, u64 buffer_size);
|
|
Result ShutdownDecodeObject(void* buffer, u64 buffer_size);
|
|
Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size);
|
|
Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size,
|
|
u32 channel_count, void* input_data, u64 input_data_size, void* buffer,
|
|
u64& out_time_taken, bool reset);
|
|
Result DecodeInterleavedForMultiStream(u32& out_sample_count, void* output_data,
|
|
u64 output_data_size, u32 channel_count,
|
|
void* input_data, u64 input_data_size, void* buffer,
|
|
u64& out_time_taken, bool reset);
|
|
Result MapMemory(void* buffer, u64 buffer_size);
|
|
Result UnmapMemory(void* buffer, u64 buffer_size);
|
|
|
|
private:
|
|
Core::System& system;
|
|
std::mutex mutex;
|
|
std::array<OpusDecoder*, 24> decoders{};
|
|
ADSP::OpusDecoder::OpusDecoder& opus_decoder;
|
|
ADSP::OpusDecoder::SharedMemory shared_memory;
|
|
};
|
|
} // namespace AudioCore::OpusDecoder
|