Интернет вещания нескольких радиостанций через связку alsa & darkice & libfaac?

Доброго времени суток. К вопросу есть предыстория в виде вопроса на хабре, оставшегося без ответа. С тех пор я немного продвинулся в решение своей проблемы, посредством ряда патчей к 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!
  • Вопрос задан
  • 2695 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы