Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.248.24] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Вроде бы с записью с микрофона разобрался. Решил попробовать поработать с многоканальнм устройством. Мне удалось достать звуковую карты Delta 66 на период отпуска товарища. В Windows XP успешно установился драйвер. При опросе получаю следующую информацию:
------------------ Входные устройства --------------- 0 Компакт-диск (VIA High Definiti 1 S/PDIF (M-Audio Delta 66) 2 Стерео микшер (VIA High Definit 3 Front Mic (VIA High Definition 4 Line 3/4 (M-Audio Delta 66) 5 Monitor (M-Audio Delta 66) 6 Line 1/2 (M-Audio Delta 66) 7 Multichannel (M-Audio Delta 66) Если я работаю с микрофоном, то ввожу цифру 3 и использую функцию: waveInOpen(&hwvInDev, numIn, &wvFormat, (DWORD)wvRecCallBack, 0L, CALLBACK_FUNCTION); |
Сообщ.
#2
,
|
|
|
Или открывать 4 и 6 как независимые 2-х канальные устройства, или поэкспериментировать с 7.
Если 7 позволит сразу 4 канала писать, то и совсем хорошо. Добавлено А что говорит waveInGetDevCaps по поводу 7(4,6)? Что в wChannels? |
Сообщ.
#3
,
|
|
|
Немного изменил программу:
#include <windows.h> #include <conio.h> #include <locale> #include <string.h> #include <iostream> #include <MMSystem.h> #pragma comment(lib,"winmm.lib") using namespace std; void wvErrorMes(string mes, MMRESULT wvRes) { char strError[128]; if(wvRes != MMSYSERR_NOERROR) { cout << mes << endl; wvRes = waveInGetErrorText(wvRes, strError, 128); cout << "\nОшибка: " << strError << endl; cout << "\nПрограмма завершила работу. Для продолжения нажмите любую клавишу"; _getch(); exit(EXIT_FAILURE); // EXIT_SUCCESS, EXIT_FAILURE } } void GetAudioInfo() { UINT numInDev = waveInGetNumDevs(); MMRESULT wvRes; cout << "------------------ Входные устройства ---------------" << endl << endl; WAVEINCAPS wvInfoIn; for(UINT i = 0; i < numInDev; i++) { wvRes = waveInGetDevCaps(i, &wvInfoIn, sizeof(wvInfoIn)); if(wvRes != MMSYSERR_NOERROR) { cout << "\nОшибка определения параметров входного устройства № " << i << endl; } cout << i << "\t" << wvInfoIn.szPname << endl; } cout << endl; } void GetDevInfo(int i) { WAVEINCAPS wvInfoIn; waveInGetDevCaps(i, &wvInfoIn, sizeof(wvInfoIn)); cout << "--------------- Устройство № " << i << " ---------------------" << endl; cout << "wMid\t" << "wPid\t" << "dwFormats\t" << "wChannels" << endl; cout << wvInfoIn.wMid << "\t" << wvInfoIn.wPid << "\t" << wvInfoIn.dwFormats << "\t\t" << wvInfoIn.wChannels << "\n\n"; } void main(int argc, char* argv[]) { setlocale(LC_ALL, ""); GetAudioInfo(); int num[] = {4, 6, 7}; for(int i = 0; i < 3; i++) { GetDevInfo(num[i]); } cout << "\nПрограмма завершила работу. Для выхода нажмите любую клавишу" << endl; _getch(); } ------------------ Входные устройства --------------- 0 Компакт-диск (VIA High Definiti 1 S/PDIF (M-Audio Delta 66) 2 Стерео микшер (VIA High Definit 3 Front Mic (VIA High Definition 4 Line 3/4 (M-Audio Delta 66) 5 Monitor (M-Audio Delta 66) 6 Line 1/2 (M-Audio Delta 66) 7 Multichannel (M-Audio Delta 66) --------------- Устройство № 4 --------------------- wMid wPid dwFormats wChannels 239 65535 1048575 2 --------------- Устройство № 6 --------------------- wMid wPid dwFormats wChannels 239 65535 1048575 2 --------------- Устройство № 7 --------------------- wMid wPid dwFormats wChannels 239 65535 1048575 2 Как я понял, устройство 4 и 6 имеют по 2 канала, т.е. для устройства 4 первый канал - это вход 3, второй канал - вход 4, для устройства 6 - вход 1 и вход 2, а что такое мультиканал - не представляю. С точки зрения программирования все равно не понял, как обратиться к каждому каналу. Помогите, пожалуйста, разобраться. |
Сообщ.
#4
,
|
|
|
Цитата Как я понял, устройство 4 и 6 имеют по 2 канала, т.е. для устройства 4 первый канал - это вход 3, второй канал - вход 4, для устройства 6 - вход 1 и вход 2 Да. Цитата С точки зрения программирования все равно не понял, как обратиться к каждому каналу. В чём конкретно загвоздка? С записью, вы говорите, что разобрались. Буфер можно представить как одномерный массив, где чётные элементы - левый канал, нечётные - правый; или как двумерный массив. Если я правильно уловил суть вопроса. |
Сообщ.
#5
,
|
|
|
Попробую объяснить:
при выборе цифры 6 я выбираю сразу 2 канала - 1 и 2. Как в программе, приведенной в Как программа записи звука с микрофона прерывает запись?, указать, что для записи будет использоваться, например, 1 канал? В Adobe Audition в случае моно сигнала легко можно выбрать 1 или 2 канал (или сразу 4 входных канала), и записывать данные с каждого канала в отдельные файлы. Как при использовании MME добиться таких же возможностей? Как разделить каналы, если используется одна и та же цифра 6 для двух каналов? |
Сообщ.
#6
,
|
|
|
Получнив буфер от карты, разделить его на два набора данных по принципу: два байта (еслий звук 16 битный) - левый канал, два байта - правый канал, и .т. д.
|
Сообщ.
#7
,
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Цитата Как разделить каналы, если используется одна и та же цифра 6 для двух каналов?
Выделить 2 дополнительных буфера(массива), куда раскидать чётные и нечётные элементы из стерео(2-х канального) буфера.
Цитата записывать данные с каждого канала в отдельные файлы buf_L и buf_R скидывать в разные файлы. |
Сообщ.
#8
,
|
|
|
Спасибо большое за подробные объяснения! Идею понял, попробую реализовать на практике.
|
Сообщ.
#9
,
|
|
|
А как влияет значение wvFormat.nChannels на запись? Предположим, выбрано устройство 6, wvFormat.nChannels = 2, wvFormat.wBitsPerSample = 16, wvFormat.nSamplesPerSec = 44100. Записываем все данные в один файл. Разве в файл не будут последовательно сохраняться данные с двух каналов (первый канал, второй канал, первый канал, второй канал и т.д.)? А потом этот файл можно будет разобрать на четные и нечетные отсчеты (зная, что он двухканальный и в отчете 16 бит) и дальше обрабатывать поканально.
|
Сообщ.
#10
,
|
|
|
Цитата tumanovalex @ Записываем все данные в один файл. Разве в файл не будут последовательно сохраняться данные с двух каналов (первый канал, второй канал, первый канал, второй канал и т.д.)? Будут. Цитата tumanovalex @ А потом этот файл можно будет разобрать на четные и нечетные отсчеты (зная, что он двухканальный и в отчете 16 бит) и дальше обрабатывать поканально. Можно И потом, а можно И на лету,без записи в файл. |
Сообщ.
#11
,
|
|
|
Возник еще один вопрос. При одновременной записи по каналам 6 и 4 (Как программа записи звука с микрофона прерывает запись?) нужно создавать 2 CallBack функции, две функции tryrec и два файла для записи с разными названиями?
|
Сообщ.
#12
,
|
|
|
Цитата нужно создавать 2 CallBack функции Поскольку в CallBack передаётся хендл устройства, от которого прилетело сообщение, можно разрулить в теле одной функции сообщения и от 6 и от 4. Попробуйте, проверьте. Цитата две функции tryrec До окончания записи основной поток зависнет в tryrec. Или переписывать tryrec под 2 устройства, или менять структуру программы. Цитата два файла для записи с разными названиями Скорее да, чем нет. Можно, в принципе, придумать механизм записи всех (4-х) каналов в один wave файл. Но пишите пока в 2 разных (или 4) файла. Вам ведь для теста некритично(?) |
Сообщ.
#13
,
|
|
|
Спасибо за ответ. Попробую.
|
Сообщ.
#14
,
|
|
|
Попробовал программировать Motu. В отличие от Delta 66 дает номер устройства только один (в моем случае номер устройства 2: Motu Analog). Если сделать стереозапись, то сохраняет в файл входные сигналы с 2 каналов (1 и 2 или 2 и 3). Всего каналов 8. Я установил в настройках моно сигнал, запустил запись и поочередно вставлял в каждые из 8 входов микрофон. Думал, что в файл будут записаны поочередно значения со всех каналов. Разобрал файл на 8 файлов, в которые, как я предполагал, записаны сигналы с 1, 2 и т.д. входов. Поочередно загрузил файлы в CoolEdit и ожидал увидеть сдвинутые по времени фрагменты записи звука: 1 канал - крайний слева, 2 канал - правее первого фрагмента и т.д., 8 канал крайний справа. Однако ничего подобного я не увидел, какая-то ерунда.
Как я понял из вышестоящих обсуждений, если бы были номера каналов 1 и 2, 3 и 4 и т.д., можно было бы попробовать сделать несколько колбек функций и записывать в разные файлы. А тут только один номер для всех 8 устройств. Помогите, пожалуйста, советом, как разобраться с организацией записи в Motu. Может быть MME не подходит и нужно что-нибудь другое, типа DirectSound или ASIO? Попробовал записывать с Adobe Audition, пишет по всем 8 каналам моно или по 4 каналам стерео (попарно). Значит как-то можно все-таки записывать по всем каналам? |
Сообщ.
#15
,
|
|
|
Цитата Я установил в настройках моно сигнал, запустил запись и поочередно вставлял в каждые из 8 входов микрофон. Ерунда. Цитата Если сделать стереозапись, то сохраняет в файл входные сигналы с 2 каналов (1 и 2 или 2 и 3). Так 1 и 2, или 2 и 3? Цитата Может быть MME не подходит и нужно что-нибудь другое, типа DirectSound или ASIO? ASIO. Цитата Попробовал записывать с Adobe Audition, пишет по всем 8 каналам моно или по 4 каналам стерео (попарно). Значит как-то можно все-таки записывать по всем каналам? Загляните в настройки адоб аудишн, посмотрите, какой интерфейс используется. Цитата В отличие от Delta 66 дает номер устройства только один (в моем случае номер устройства 2: Motu Analog). Как запилил поддержку MME(waveaudio functions) в своих драйверах производитель, он и знает. Кстати, почему бы у него и не спросить. Цитата Помогите, пожалуйста, советом Посмотрите BASSASIO, например. Там должны быть примеры. |