Доброго времени суток. К вопросу есть предыстория в виде
вопроса на хабре, оставшегося без ответа. С тех пор я немного продвинулся в решение своей проблемы, посредством ряда патчей к darkice — теперь один экземпляр программы монопольно владеет доступом к звуковой, считывает все 8-ь каналов и программно разделяет нужные каналы в нужные кодеки, а затем и icecast-потоки. Сейчас это работает с mp3/vorbis. Очень хотелось бы добиться этого c aac/aac+, таким же макаром, без костылей типа streamTranscoderv3. Так вот суть вопроса — подскажите что в этом коде не так? Повторюсь подобный подход прекрасно работает с mp3/vorbis.
/** оригинальный код **/
unsigned int FaacEncoder :: write ( const void * buf, unsigned int len ) throw ( Exception )
{
if ( !isOpen() || len == 0 ) {
return 0;
}
unsigned int channels = getInChannel();
unsigned int bitsPerSample = getInBitsPerSample();
unsigned int sampleSize = (bitsPerSample / 8) * channels;
unsigned char * b = (unsigned char*) buf;
unsigned int processed = len - (len % sampleSize);
unsigned int nSamples = processed / sampleSize;
unsigned char * faacBuf = new unsigned char[maxOutputBytes];
int samples = (int) nSamples * channels;
int processedSamples = 0;
/** патч **/
unsigned char *multichannel = new unsigned char[processed * 2 / channels];
signed char left = getLeftChannel(), right = getRightChannel();
if (isMultichannelToStereo()) {
int i, j;
for (i = 0, j = 0;i < nSamples;i++) {
multichannel[j++] = b[i * sampleSize + (bitsPerSample / 8) * left];
multichannel[j++] = b[i * sampleSize + (bitsPerSample / 8) * left + 1];
multichannel[j++] = b[i * sampleSize + (bitsPerSample / 8) * right];
multichannel[j++] = b[i * sampleSize + (bitsPerSample / 8) * right + 1];
}
channels = 2;
sampleSize = (bitsPerSample / 8) * channels;
processed = processed * 2 / channels;
nSamples = processed / sampleSize;
samples = (int) nSamples * channels;
}
/** конец **/
while (processedSamples < samples) {
int outputBytes;
int inSamples = samples - processedSamples < (int) inputSamples ? samples - processedSamples : inputSamples;
/** ну и здесь разумеется тоже **/
if (isMultichannelToStereo()) {
outputBytes = faacEncEncode(encoderHandle, (int32_t*) (multichannel + processedSamples/sampleSize), inSamples, faacBuf, maxOutputBytes);
/** оригинальный код **/
} else {
outputBytes = faacEncEncode(encoderHandle, (int32_t*) (b + processedSamples/sampleSize), inSamples, faacBuf, maxOutputBytes);
}
getSink()->write(faacBuf, outputBytes);
processedSamples += inSamples;
}
}
P.S. Хвала open source software!