Мои размышления:
Хочу запилить штуковину, которая будет держать в буфере некоторое кол-во RAWPCM фреймов. Для простоты будем считать что у нас mono.
К примеру внутренняя частота даунмикса будет 44100, тогда если длина кроссфейдера равна 5 секундам, значит надо хранить 44100*5, причем для обоих входных сигналов. Ведь в тот момент когда трек А заканчивается, мы должны начать его заглушать, а трек Б поднимать в громкости. Тестово я уже прогонял этот прикол, волны суммирует, все ок.
Если на вход подается wav то основываясь на хедере и размере файла (на всяк случай проверяю, вдруг в хедере некорректные данные) я могу рассчитать продолжительность трека, ресемплировать его во внутрянку даунмикса и заполнить буфер, ну или вывалить сообщение, что длина трека слишком мала и кроссфейдить нету смысла.
Для нормальной работы мне нужно забить данными как минимум CrossfadeTime*2 времени. Почему? Потому, что допустим трек Б за 5 сек поднялся в громкости на 100% и где-то далее будет флажок «вот на таком то фрейме пора делай fadeout т.к. трек заканчивается». В этот момент в буфере А я уже типа положил данные для fadein.
А вот если на вход подается мп3, тем более в VBR то хрен я подсчитаю его длину, распакованные данные вообще возвращаются как попало, за одну отправку пачки фреймов в декодер на его выходе может быть вообще 0 (НОЛЬ!) PCM-фреймов. Тут конечно каждый может сказать - читай заголовки. Я их читаю. А ты можешь на 100% доверять инфе в заголовках?
Как быть? Что делать? Есть мысли?