Skip to content

Commit 58cb2ba

Browse files
committed
Fix playback of atrac3+ when block align not specified
1 parent d4023fb commit 58cb2ba

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

Core/HW/Atrac3Standalone.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class Atrac3Audio : public AudioDecoder {
1818
Atrac3Audio(PSPAudioType audioType, int channels, size_t blockAlign, const uint8_t *extraData, size_t extraDataSize) : audioType_(audioType) {
1919
blockAlign_ = blockAlign;
2020
if (audioType == PSP_CODEC_AT3PLUS) {
21-
at3pCtx_ = atrac3p_alloc(channels, blockAlign);
21+
at3pCtx_ = atrac3p_alloc(channels, &blockAlign_);
2222
if (at3pCtx_)
2323
codecOpen_ = true;
2424
} else if (audioType_ == PSP_CODEC_AT3) {
25-
at3Ctx_ = atrac3_alloc(channels, blockAlign, extraData, extraDataSize);
25+
at3Ctx_ = atrac3_alloc(channels, &blockAlign_, extraData, extraDataSize);
2626
if (at3Ctx_)
2727
codecOpen_ = true;
2828
}
@@ -42,13 +42,18 @@ class Atrac3Audio : public AudioDecoder {
4242
}
4343
}
4444

45+
bool IsOK() const override {
46+
return codecOpen_;
47+
}
48+
4549
bool Decode(const uint8_t *inbuf, int inbytes, uint8_t *outbuf, int *outbytes) override {
4650
if (!codecOpen_) {
4751
_dbg_assert_(false);
4852
}
49-
if (inbytes != blockAlign_) {
53+
if (inbytes != blockAlign_ && blockAlign_ != 0) {
5054
WARN_LOG(ME, "Atrac3Audio::Decode: Unexpected block align %d (expected %d)", inbytes, blockAlign_);
5155
}
56+
blockAlign_ = inbytes;
5257
// We just call the decode function directly without going through the whole packet machinery.
5358
int got_frame = 0;
5459
int result;
@@ -82,7 +87,6 @@ class Atrac3Audio : public AudioDecoder {
8287
return true;
8388
}
8489

85-
bool IsOK() const override { return true; }
8690
int GetOutSamples() const override {
8791
return outSamples_;
8892
}

ext/at3_standalone/at3_decoders.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
struct ATRAC3Context;
88
struct ATRAC3PContext;
99

10-
ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_data, int extra_data_size);
10+
// If the block_align passed in is 0, tries to audio detect.
11+
12+
ATRAC3Context *atrac3_alloc(int channels, int *block_align, const uint8_t *extra_data, int extra_data_size);
1113
void atrac3_free(ATRAC3Context *ctx);
1214
int atrac3_decode_frame(ATRAC3Context *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size);
1315

14-
ATRAC3PContext *atrac3p_alloc(int channels, int block_align);
16+
ATRAC3PContext *atrac3p_alloc(int channels, int *block_align);
1517
void atrac3p_free(ATRAC3PContext *ctx);
1618
int atrac3p_decode_frame(ATRAC3PContext *ctx, float *out_data[2], int *nb_samples, int *got_frame_ptr, const uint8_t *buf, int buf_size);

ext/at3_standalone/atrac3.cpp

+12-6
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ static void atrac3_init_static_data(void)
785785

786786
static int static_init_done;
787787

788-
ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_data, int extra_data_size) {
788+
ATRAC3Context *atrac3_alloc(int channels, int *block_align, const uint8_t *extra_data, int extra_data_size) {
789789
int i, ret;
790790
int version, delay, samples_per_frame, frame_factor;
791791

@@ -798,7 +798,13 @@ ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_
798798

799799
ATRAC3Context *q = (ATRAC3Context *)av_mallocz(sizeof(ATRAC3Context));
800800
q->channels = channels;
801-
q->block_align = block_align;
801+
if (*block_align) {
802+
q->block_align = *block_align;
803+
} else {
804+
// Atrac3 (unlike Atrac3+) requires a specified block align.
805+
atrac3_free(q);
806+
return nullptr;
807+
}
802808

803809
if (!static_init_done)
804810
atrac3_init_static_data();
@@ -824,9 +830,9 @@ ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_
824830
q->coding_mode = q->coding_mode ? JOINT_STEREO : STEREO;
825831
q->scrambled_stream = 0;
826832

827-
if (block_align != 96 * channels * frame_factor &&
828-
block_align != 152 * channels * frame_factor &&
829-
block_align != 192 * channels * frame_factor) {
833+
if (q->block_align != 96 * channels * frame_factor &&
834+
q->block_align != 152 * channels * frame_factor &&
835+
q->block_align != 192 * channels * frame_factor) {
830836
av_log(AV_LOG_ERROR, "Unknown frame/channel/frame_factor "
831837
"configuration %d/%d/%d\n", block_align,
832838
channels, frame_factor);
@@ -887,7 +893,7 @@ ATRAC3Context *atrac3_alloc(int channels, int block_align, const uint8_t *extra_
887893
return nullptr;
888894
}
889895

890-
q->decoded_bytes_buffer = (uint8_t *)av_mallocz(FFALIGN(block_align, 4) + AV_INPUT_BUFFER_PADDING_SIZE);
896+
q->decoded_bytes_buffer = (uint8_t *)av_mallocz(FFALIGN(q->block_align, 4) + AV_INPUT_BUFFER_PADDING_SIZE);
891897

892898
/* initialize the MDCT transform */
893899
if ((ret = ff_mdct_init(&q->mdct_ctx, 9, 1, 1.0 / 32768)) < 0) {

ext/at3_standalone/atrac3plusdec.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -125,15 +125,16 @@ static int set_channel_params(ATRAC3PContext *ctx, int channels) {
125125
return 0;
126126
}
127127

128-
ATRAC3PContext *atrac3p_alloc(int channels, int block_align) {
128+
ATRAC3PContext *atrac3p_alloc(int channels, int *block_align) {
129129
int i, ch, ret;
130-
if (!block_align) {
131-
av_log(AV_LOG_ERROR, "block_align is not set\n");
132-
return nullptr;
133-
}
134130

135131
ATRAC3PContext *ctx = (ATRAC3PContext *)av_mallocz(sizeof(ATRAC3PContext));
136-
ctx->block_align = block_align;
132+
ctx->block_align = *block_align;
133+
134+
if (!*block_align) {
135+
// No block align was passed in, using the default.
136+
*block_align = 0x000002e8;
137+
}
137138

138139
ff_atrac3p_init_vlcs();
139140

0 commit comments

Comments
 (0)