diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2018-12-13 00:03:15 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2018-12-13 00:03:15 +0300 |
commit | 218e2163453deac6f7a74765a21258b5c566a8cc (patch) | |
tree | 8d2ff2517ad6e8cbe239b46be38ca4573b1a007e | |
parent | b2342e902d62067fda5a08c7cccff62ee3619fc5 (diff) | |
download | atracdenc-218e2163453deac6f7a74765a21258b5c566a8cc.tar.gz |
[liboma] Write support for ATRAC3PLUS header
-rw-r--r-- | src/oma/liboma/src/liboma.c | 28 | ||||
-rw-r--r-- | src/oma/liboma/src/tools/omacp.c | 2 |
2 files changed, 28 insertions, 2 deletions
diff --git a/src/oma/liboma/src/liboma.c b/src/oma/liboma/src/liboma.c index 4c69ce6..d8a4358 100644 --- a/src/oma/liboma/src/liboma.c +++ b/src/oma/liboma/src/liboma.c @@ -80,6 +80,14 @@ static int oma_get_samplerate_idx(int samplerate) { return -1; } +static int oma_get_channel_idx(int channel_format) { + for (int i = 0; i < 7; i++) { + if (channel_id_to_format_tab[i] == channel_format) + return i; + } + return -1; +} + static int oma_read_atrac3_header(uint32_t params, oma_info_t* info) { const int js = (params >> 17) & 0x1; const int samplerate = liboma_samplerates[(params >> 13) & 0x7]; @@ -130,6 +138,24 @@ static int oma_read_atrac3p_header(uint32_t params, oma_info_t* info) { return 0; } +static int oma_write_atrac3p_header(uint32_t *params, oma_info_t *info) { + + const int samplerate_idx = oma_get_samplerate_idx(info->samplerate); + if (samplerate_idx == -1) + return -1; + + const uint32_t framesz = (info->framesize - 8) / 8; + if (framesz > 0x3FF) + return -1; + + const int32_t ch_id = oma_get_channel_idx(info->channel_format); + if (ch_id < 0) + return -1; + + *params = htonl((OMAC_ID_ATRAC3PLUS << 24) | ((int32_t)samplerate_idx << 13) | ((ch_id + 1) << 10) | framesz); + return 0; +} + static int oma_write_header(OMAFILE* ctx, oma_info_t *omainfo) { if (ctx == NULL || omainfo == NULL) return -1; @@ -145,7 +171,7 @@ static int oma_write_header(OMAFILE* ctx, oma_info_t *omainfo) { oma_write_atrac3_header(params, omainfo); break; case OMAC_ID_ATRAC3PLUS: - assert(0); + oma_write_atrac3p_header(params, omainfo); break; default: assert(0); diff --git a/src/oma/liboma/src/tools/omacp.c b/src/oma/liboma/src/tools/omacp.c index fbce952..77e1325 100644 --- a/src/oma/liboma/src/tools/omacp.c +++ b/src/oma/liboma/src/tools/omacp.c @@ -33,7 +33,7 @@ int main(int argc, char* const* argv) { const char *codecname = oma_get_codecname(info); const int bitrate = oma_get_bitrate(info); - fprintf(stdout, "codec: %s, bitrate: %d, channel format: %d\n", codecname, bitrate, info->chanel_format); + fprintf(stdout, "codec: %s, bitrate: %d, channel format: %d\n", codecname, bitrate, info->channel_format); OMAFILE* outfile = oma_open(argv[2], OMAM_W, info); if (NULL == outfile) |