Войти
ПрограммированиеФорумЗвук

Запись звука из разных потоков с помощью OpenAL

#0
13:31, 13 мар. 2011

Здравствуйте.

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

Задача.
Мне нужно писать звук из двух каналов звуковой карты не зависимо друг от друга. Для этого я создал функцию, которая открывает устройство, начинает стерео запись, а потом просто вытягивает семплы нужного ей канала. Таким образом решил вызывать эту же функцию в двух разных потоках, только с разными аргументами, сообщающими с какого канала ей выбирать данные.

Проблемы.
Без синхронизации доступа к аудио карте естественно не работает вообще.
При использовании критической секции или мьютекса тоже не работает. Видимо оба потока работают с одним внутренним буфером в памяти и если один поток данные от туда забрал, то второй получает кукишь. Вылетает при вызове

alcGetIntegerv(pCaptureDevice, ALC_CAPTURE_SAMPLES, 1, &iSamplesAvailable);

вылетает исключение:
Unhandled exception at 0xfeeefeee in CaptureWin32.exe: 0xC0000005: Access violation reading location 0xfeeefeee.

НО!
Если я эту же самую функцию, без каких бы то ни было изменений (тупо через copy/past) запускаю в разных процессах - то всё зашибись работает даже без использования объектов синхронизации! Каждый процесс без проблем вытягивает данные своего канала или даже одного и того же канала, создавая собственную копию аудио данных как моно так и стерео.

Разъясните пожалуйста, в чём причина такого феномена? И подскажите способ, как запустить два потока так, чтобы они работали как два процесса?

P.S. Я понимаю, что диспетчеризация Windows работает на уровне потоков а не процессов, я не понимаю почему тогда одна и та же функция в разных процессах работает, а потоках - нет! Немного модифицированного примера Capture из OpenAL SDK/samples вполне хватит чтобы в этом убедиться.


#1
17:02, 13 мар. 2011

CreateProcess

Пригодится для создания процесса.

ПрограммированиеФорумЗвук

Тема в архиве.