2013-10-08 3 views
0

У нас есть фрагмент кода SDL, как показано ниже.SDL Audio Channel не работает согласно требованию

SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO); 
atexit(SDL_Quit); 
g_pDisplaySurface = 
SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,0,SDL_ANYFORMAT); 
g_SpecDesired=new SDL_AudioSpec; 
g_SpecObtained=new SDL_AudioSpec; 
g_SpecDesired->freq=22050; 
g_SpecDesired->format=AUDIO_U8; 
g_SpecDesired->channels=1; 
g_SpecDesired->samples=8192; 
g_SpecDesired->callback=FOSDLAudioCallback; 
g_SpecDesired->userdata=NULL; 

Функция обратного вызова

void FOSDLAudioCallback(void* userdata,Uint8* buffer,int len) 
{ 
    int index; 
    printf("LEn is :%d",&len); 
    for(index=0;index<len;index++) 
    { 
    buffer[index]=rand()%256; 
    } 
} 

Проблема здесь даже мы меняем канал на 1 или 2 она по-прежнему играть на обоих стерео канала? Почему он ведет себя таким образом?

+0

Где ваша SDL_OpenAudioDevice()? Кроме того, почему использование новых в структурах AudioSpec? Вы нужны им один раз, лучше разместить на стеке. – keltar

+0

@keltar Я обновил функцию обратного вызова. Я делаю очень грубый тест без SDL_OpenAudioDevice(). Более поздние примеры я использую их. – user2711681

+0

Я не понимаю. У вас нет OpenAudioDevice()? Тогда у вас нет звука. Как вы подтверждаете, что у вас все еще есть 2 канала (кстати, не гарантировано, что вы получите то, что вы просили, поэтому у вас есть «желаемые» и «полученные»)? Вы должны проверить поля «полученные». Или ваш вопрос в том, почему вы слышите звук от двух громкоговорителей, когда вы открываете моно-устройство? – keltar

ответ

1

Если obtained говорит, что это моно - это моно. Это означает не то, сколько динамиков у вас есть, но сколько каналов. Для моно, у вас может быть любое количество динамиков (скажем, 6), но вы не можете, но любое среднее, воспроизводить на них разные звуки - только один канал, поэтому все динамики воспроизводят один и тот же звук в каждый момент времени.

Задача аудио драйвера заключается в том, чтобы интерполировать ее в соответствии с ее настройками. Для большего количества каналов это может быть даже сложнее - драйвер может разделить стерео на 5.1 или около того.

Если вы хотите воспроизводить звук только на, скажем, левом динамике, вы должны создать максимально доступный контекст и использовать соответствующий левый динамик.

Здесь Модифицированная версия обратного вызова, которая заполняет второй канал 0 (полное молчание) (требуется 2 канала режима аудио и AUDIO_U8 - ​​модифицируют инициализацию, чтобы соответствовать этим):

void FOSDLAudioCallback(void* userdata,Uint8* buffer,int len) 
{ 
    int index; 
    printf("LEn is :%d",&len); 
    for(index=0;index<len;index++) 
    { 
     buffer[index]= (index % 2) ? rand()%256 : 0; 
    } 
} 
+0

@ Но тогда вся документация утверждает, что моно равен 1 каналу, который вводит в заблуждение здесь обряд. Поэтому я установил этот g_SpecObtained-> channels = 1; SDL_OpenAudio (g_SpecDesired, g_SpecObtained); // удалить g_SpecDesired; SDL_PauseAudio (0); но все же он играл на обоих динамиках. – user2711681

+0

Моно действительно 1 канал. Каналы и динамики - совершенно разные вещи. Как каналы, подключенные к динамикам, зависят от водителя. Если вам не нравится, как это делается, запросите максимально возможное количество каналов и используйте только те, которые вам нужны (однако, нет гарантии, что у вас будет столько динамиков, скажем, 7.1 аудио, но подключены только два динамика), то, может быть, - может быть, - водитель не будет вмешиваться. – keltar

+0

, так что в этом случае я никогда не смогу продемонстрировать монографию на один канал, правильно? – user2711681

Смежные вопросы