ppsspp/Core/HW/SimpleAudioDec.h

130 lines
3.6 KiB
C
Raw Normal View History

// Copyright (c) 2013- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include "Core/HW/MediaEngine.h"
#include "Core/HLE/sceAudio.h"
2014-06-22 12:01:23 +00:00
// Wraps FFMPEG for audio decoding in a nice interface.
// Decodes packet by packet - does NOT demux.
// Based on http://ffmpeg.org/doxygen/trunk/doc_2examples_2decoding_encoding_8c-example.html#_a13
2014-06-22 12:01:23 +00:00
// audioType
enum PSPAudioType {
2014-06-22 12:01:23 +00:00
PSP_CODEC_AT3PLUS = 0x00001000,
PSP_CODEC_AT3 = 0x00001001,
PSP_CODEC_MP3 = 0x00001002,
PSP_CODEC_AAC = 0x00001003,
};
class AudioDecoder {
public:
virtual ~AudioDecoder() {}
virtual PSPAudioType GetAudioType() const = 0;
virtual bool Decode(const uint8_t* inbuf, int inbytes, uint8_t *outbuf, int *outbytes) = 0;
virtual bool IsOK() const = 0;
// These two are only ever called after Decode, so can initialize on first.
virtual int GetOutSamples() const = 0;
virtual int GetSourcePos() const = 0;
2024-04-10 10:19:48 +00:00
virtual void SetChannels(int channels) = 0;
// Just metadata.
void SetCtxPtr(uint32_t ptr) { ctxPtr = ptr; }
uint32_t GetCtxPtr() const { return ctxPtr; }
private:
uint32_t ctxPtr = 0xFFFFFFFF;
};
void AudioClose(AudioDecoder **ctx);
2014-06-22 12:01:23 +00:00
const char *GetCodecName(int codec); // audioType
bool IsValidCodec(PSPAudioType codec);
AudioDecoder *CreateAudioDecoder(PSPAudioType audioType, int sampleRateHz = 44100, int channels = 2, size_t blockAlign = 0, const uint8_t *extraData = nullptr, size_t extraDataSize = 0);
2014-06-22 12:01:23 +00:00
class AuCtx {
public:
AuCtx();
~AuCtx();
2014-06-22 12:01:23 +00:00
u32 AuDecode(u32 pcmAddr);
u32 AuNotifyAddStreamData(int size);
int AuCheckStreamDataNeeded();
int AuStreamBytesNeeded();
int AuStreamWorkareaSize();
2014-06-22 12:01:23 +00:00
u32 AuResetPlayPosition();
u32 AuResetPlayPositionByFrame(int position);
u32 AuGetInfoToAddStreamData(u32 bufPtr, u32 sizePtr, u32 srcPosPtr);
2014-06-22 12:01:23 +00:00
2019-05-04 13:40:43 +00:00
void SetReadPos(int pos) { readPos = pos; }
int ReadPos() { return readPos; }
2014-06-22 12:01:23 +00:00
void DoState(PointerWrap &p);
void EatSourceBuff(int amount) {
2019-05-10 21:26:34 +00:00
if (amount > (int)sourcebuff.size()) {
amount = (int)sourcebuff.size();
}
if (amount > 0)
sourcebuff.erase(sourcebuff.begin(), sourcebuff.begin() + amount);
2014-06-22 12:01:23 +00:00
AuBufAvailable -= amount;
}
// Au source information. Written to from for example sceAacInit so public for now.
2019-05-04 13:40:43 +00:00
u64 startPos = 0;
u64 endPos = 0;
u32 AuBuf = 0;
u32 AuBufSize = 0;
u32 PCMBuf = 0;
u32 PCMBufSize = 0;
2024-04-09 22:40:16 +00:00
int freq = -1; // used by AAC only?
int BitRate = 0;
int SamplingRate = -1;
int Channels = 0;
int Version = -1;
2014-04-11 13:09:31 +00:00
2014-06-22 12:01:23 +00:00
// State variables. These should be relatively easy to move into private.
2019-05-04 13:40:43 +00:00
u32 SumDecodedSamples = 0;
int LoopNum = -1;
u32 MaxOutputSample = 0;
2019-05-04 13:40:43 +00:00
int FrameNum = 0;
2014-06-22 12:01:23 +00:00
2014-04-11 13:09:31 +00:00
// Au decoder
AudioDecoder *decoder = nullptr;
2014-04-11 13:09:31 +00:00
2014-06-22 12:01:23 +00:00
private:
size_t FindNextMp3Sync();
std::vector<u8> sourcebuff; // source buffer
2019-05-04 13:40:43 +00:00
// buffers informations
int AuBufAvailable = 0; // the available buffer of AuBuf to be able to recharge data
2024-04-10 10:07:03 +00:00
int readPos = 0; // read position in audio source file
2019-05-04 13:40:43 +00:00
int askedReadSize = 0; // the size of data requied to be read from file by the game
int nextOutputHalf = 0;
2014-04-11 13:09:31 +00:00
};