IPB

Добро пожаловать, гость ( Вход | Регистрация )

> Soldier of Fortune, .ADP музыка
-=CHE@TER=-
Jul 9 2008, 07:42
Сообщение #1


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



QUOTE
Скачать программу: >>>Soldier of Fortune tools<<<

Кто-нибудь игру смотрел?
Музыка находится в \SoF1\base\sound\music\ внутри файлов .ADP, причём разбитых на два файла, например:
lDM1.adp - левый канал (left)
rDM1.adp - правый канал (right)
Первые 4 байта (DWORD) в этих файлах - это частота (обычно у всех 22050 Hz), далее идёт сжатый звук.
Если у файла эти 4 байта отрезать, переименовать в .VOX (Dialogic ADPCM) и открыть в Adobe Audition, то музыка будет играться, даже сносно, но уж сильно зашкаливают пики - такое ощущение, что Audition её сглаживает, потому что скачал в сети сорцы для декодирования Dialogic - так там получилась, примерно, та же самая музыка, только ещё и с треском.
Никто не знает, где можно правильную таблицу ADPCM декодирования дёрнуть? Сдаётся мне, что она там своя, как у EA в NFS и от обычного .VOX отличается.

Думаю, что это .VOX формат, правда модифицированный, потому что:
- У .VOX формата нет заголовка (тут его тоже нет - только эти 4 байта прикрутили), поэтому при декодировании частота всегда указывается вручную.
- Насколько я знаю (смотрел исходные коды декодировщика) стандартный .VOX не поддерживает в явном виде 22050 Hz - только 32000 и 24000 (впрочем, частоту проигрывания никто не мешает вручную поменять).
- .VOX формат поддерживает только одногоканальный звук - поэтому тут каналы по файлам и разбили.
- Ну и, наконец, музыка проигрывается как .VOX, только немного криво из чего следует, что формат правильный, а вот таблица декодирования - нет.

Соображения у кого-нибудь есть? Файлы-примеры надо?
Исходные коды декодеровщика на Си:
oki_adpcm.c
voipcodecs/telephony.h
voipcodes/oki_adpcm.h

Мой отладочный стенд (входной файл "lDM1.adp" с уже отрубленными 4 байтами в начале, выходной - просто потоковое аудио, без .WAV заголовка):
CODE
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <malloc.h>
#include "voipcodecs/oki_adpcm.h"

int main(int argc, char *argv[]){
oki_adpcm_state_t *oki_dec_state;
int16_t *post_amp;
uint8_t *oki_data;
int oki_bytes;
int dec_frames;
FILE *fl;
  fl = fopen("lDM1.adp", "rb");
  fseek(fl, 0, SEEK_END);
  oki_bytes = ftell(fl);
  fseek(fl, 0, SEEK_SET);
  oki_data = (uint8_t *)malloc(oki_bytes);
  post_amp = (int16_t *)malloc(oki_bytes*8);
  fread(&oki_data[0], oki_bytes, 1, fl);
  fclose(fl);
  oki_dec_state = oki_adpcm_init(NULL, 24000);
  
  dec_frames = oki_adpcm_decode(oki_dec_state, post_amp, oki_data, oki_bytes);
  
  fl = fopen("lDM1.wav", "wb");
  fwrite(&post_amp[0], oki_bytes, 4, fl);
  fclose(fl);
  
  oki_adpcm_release(oki_dec_state);
  free(post_amp);
  free(oki_data);
  return(0);
}
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=CHE@TER=-
Mar 5 2012, 18:43
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Расскажу я вам смешную историю.

Я выдернул когда-то давно код декодирования .ADP из SoF, однако, он так чудовищно криво был написан, что за ним тянулось ещё куча дерьма. В итоге так я его собрать в FASM и не смог.

И вот, неделю назад, я ломал Disney's Hercules. Там в архиве нет имён - только хеши от них (кстати, так и не смог около 15 файлам имена найти, если кто-то найдёт - скажите, я на сайте обновлю).

Так вот, после распаковки там были .ESF файлы, которые являлись звуками. В Геркулесе весьма сочная и прикольная озвучка - решил её сконвертировать (некоторая, кстати, была портирована с PS, типа фразы о том, что нужен 'Memory Card', но их так и не вычистили). Отлаживался-отлаживался, пока не нашёл нужную функцию и дёрнул её. Она была небольшая и аккуратная - там ничего левого не вызывалось. Но, для декодирования процедурке нужны были два DWORD-массива. Я посмотрел их в .EXE, начал заполнять и тут... да, точно, я понял, что уже где-то это видел. И точно - в сорцах декодеровщика IMA ADPCM, который использовал ранее были оба этих массива (step и index) - 1 в 1. Ну тут, как вы поняли, я не выдержал и натравил сей алгоритм декодирования на .ADP... и оно правильно декодировалось!

Формат .ADP, кстати, если кому понадобится:
dword - sound Hz
BYTE[x] - сжатый поток
BYTE[20] - 20 байт какой-то херни в хвосте, которую нельзя декодировать - будет треск

Размер распакованного потока = размер_упаковонного*4 (т.к. в полбайта кодируется один семпл (16Bit), то в байт их влазит 2 по 2 -> 4).

Не помню где, но мне похожие файлы ещё где-то встречались (по сжатию - характерные данные).

Что касается самого сжатия - я пытался как-то перегнать в IMA ADPCM сжатый .WAV, но чего-то нехватает - похоже здесь какая-то вариация используется.

Хотя, я попробовал сжать разжатый поток в Adobe Audition и он в начале был похож на то что было в игре, правда сдвинуто на полбайта и обменяно местами. Вот так:

0F F1 23 45 67... - оригинальный поток

// сдвигаем на полбайта
FF 12 34 56 7x... - промежуточное преобразование, чтобы показать как это

// меняем полубайты местами
FF 21 43 65 x7... - сжатый в Adobe Audition

Однако, там тоже есть щелчки при декодировании, где-то каждые 512 байт, после которых сия схема снова слетает. В общем, если кто-то сможет это нормально конвертнуть, то можно будет даже не разжимать в PCM, а просто lossless пересобрать в .WAV с соответствующим кодеком в заголовке.

В общем, смотрите исходные коды на сайте. Да, .ADP декодируется в стерео, если есть оба l*.adp и r*.adp файлы.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 27th April 2024 - 15:59