Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.197.251.102] |
|
Сообщ.
#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, например. Там должны быть примеры. |
Сообщ.
#16
,
|
|
|
Спасибо за ответ.
1. Сохраняет информацию в стереофайл только 1 и 2 канал. 2. В настройках аудишена посмотрю, что используется. 3. BASSASIO тоже посмотрю. О результатах сообщу. |
Сообщ.
#17
,
|
|
|
Возник еще вопрос. Получается так, что в зависимости от аппаратуры (например, Motu или Delta 66), я должен использовать или MME, или Direct Sound, или ASIO. Где-то в Интернете я читал, что вроде бы все эти интерфейсы основаны на Core Audio. Если использовать Core Audio, то можно сделать интерфейсно независимую программу?
|
Сообщ.
#18
,
|
|
|
Цитата Если использовать Core Audio, то можно сделать интерфейсно независимую программу? Она будет ось-зависимой. |
Сообщ.
#19
,
|
|
|
Это лучше, чем интерфейсная зависимость. А хорошие примеры использования Core Audio для записи сигналов где можно найти?
|
Сообщ.
#20
,
|
|
|
Что там всё-таки в адоб аудишн, в настройках hardware?
Цитата Это лучше, чем интерфейсная зависимость. Чем лучше? Цитата в зависимости от аппаратуры (например, Motu или Delta 66) И тот и другой адаптер поддерживают ASIO. Т.е., с ASIO не должно быть проблем. Delta 66 подерживает также MME и DS. По поводу последних 2-х можно связаться с производителем Motu, и выяснить, как реализован(и реализован ли) механизм multichannel записи. С Delta 66, в принципе, и так понятно(да и в мануале достаточно подробно расписано). Разбили каналы попарно и представили в системе независимыми устройствами. Такое решение для multichannel устройств не раз встречалось, вам несколько участников об этом говорили. Цитата А хорошие примеры использования Core Audio для записи сигналов где можно найти? https://msdn.microsoft.com/ru-ru/library/wi...0(v=vs.85).aspx Где-то там. Вы точно уверены в том, что ядро семерки/системный микшер умеет работать с количеством каналов больше 2-х, на запись? Если разберетесь, дайте знать на форуме. |
Сообщ.
#21
,
|
|
|
В Adobe - ASIO. Я все-таки не понимаю, почему ASIO видит больше каналов, чем MME. Потому что так написаны драйверы для Motu? Они поддерживаеют ASIO и не поддерживают MME?
|
Сообщ.
#22
,
|
|
|
Цитата Я все-таки не понимаю, почему ASIO видит больше каналов, чем MME. АСИО "видит" не больше, а все каналы. MME(DS) "видят" не меньше, а 2 канала, больше они "не умеют". Одной из причин разработки фирмой Steinberg собственного интерфейса (АСИО) являлась невозможность многоканальной записи/вывода(больше 2-х каналов) в виндовс её штатными интерфейсами, что было связано с ограничениями системного микшера виндовс(звукового ядра виндовс). Проиходилось производителям оборудования идти на ухищрения, представлять свои устройства как несколько независимых стерео-устройств или придумывать свои интерфейсы и утрясать их с производителями студийного софта. В том числе АСИО. На АСИО ограничения виндовс не распространяются, АСИО работает фактически напрямую с устройством, минуя часть посредников-драйверов ядра системы. Откройте спецификацию АСИО, самое начало, там немного описаны мотивы и причины его появления. Если прочтёте дальше, обратите внимание, что принцип работы АСИО чем-то напоминает ММЕ с его очередью буферов. Цитата Потому что так написаны драйверы для Motu? Они поддерживаеют ASIO и не поддерживают MME? Motu поддерживает и АСИО, и ММЕ(полагаю, что и DS). Также как и Дельта-66. Адобаудишн обращается к интерфейсу АСИО, потому что видит в системе установленный AСИО драйвер и "понимает", что на том конце "провода" находится многоканальное устройство, и нет смысла пытаться работать с ним через ММЕ. Ну или так думает пользователь при настройке hardware options. При перечислении wavein устройств вы видите Motu Analog и даже записывали с этого устройства 2 канала. Т.е., поддержка ММЕ есть, но как она реализована, зависит от производителя. Для delta 66, заточенной ещё под виндовс 95/98/хр, разработчики предусмотрели(помимо АСИО, где подобные ухищрения не нужны) возможность записи всех (4-х) каналов через ММЕ, для чего представили своё устройство(для приложений, использующих MME) 2-мя "независимыми" wavein стерео-устройствами. Как поступили разработчики Motu - нужно спрашивать у них. Возможно, в мануале этот момент расписан, возможно, нет, но только производитель отвечает за реализацию поддержки интерфейсов в своих драйверах. Возможно, для ММЕ он ограничился возможностью записи одной стерео пары и посчитал это достаточным, а может быть, и нет. На это вам может ответить мануал и тех. поддержка. Не имея на руках техники, могу только гадать. Поскольку Motu железяка относительно новая, предположу, что помимо АСИО, она поддерживает ещё пару специфических интерфейсов, заточеных под студийный софт конкретных производителей. |
Сообщ.
#23
,
|
|
|
Спасибо за подробный ответ. Кая я понял из Ваших объяснений, если семерка не умеет работать более чем с двумя каналами, Core Audio мне не поможет в программировании Motu. Относительно возможности семерки работать с более чем двумя каналами, не знаю даже, где это можно спросить. Может быть посоветуете, куда обратиться с этим вопросом?
|
Сообщ.
#24
,
|
|
|
Prince, правильно ли я понял, что DirectSound в случае программирования таких устройств, как Motu, имеет те же ограничения, что и MME? Т.е. он тоже не сможет увидеть все каналы Motu?
|
Сообщ.
#25
,
|
|
|
Цитата tuchin @ Prince, правильно ли я понял, что DirectSound в случае программирования таких устройств, как Motu, имеет те же ограничения, что и MME? Т.е. он тоже не сможет увидеть все каналы Motu? Имхо, да. DS работает через всё тот же системный микшер, как и MME. |
Сообщ.
#26
,
|
|
|
Попробую поработать с Delta 66 через ASIO, когда дадут поиграться. Как я понял из описания, Delta 66 ASIO поддерживает. Интересно, какие будут отличия по сравнению с MME. О результатах сообщу, может быть кому-нибудь будет интересно.
|
Сообщ.
#27
,
|
|
|
А я вот попробовал поработать с ASIO (Motu Traveler в Windows XP). Программа:
#include <stdio.h> #include <locale> #include "bassasio.h" #pragma comment(lib, "bassasio.lib") void main(int argc, char* argv[]) { setlocale(LC_ALL, ""); BASS_ASIO_DEVICEINFO di; int a; for (a=0;BASS_ASIO_GetDeviceInfo(a,&di);a++) { printf("dev %d: %s\ndriver: %s\n",a,di.name,di.driver); if (!BASS_ASIO_Init(a,BASS_ASIO_THREAD)) continue; { BASS_ASIO_CHANNELINFO i; int b; for (b=0;BASS_ASIO_ChannelGetInfo(1,b,&i);b++) printf("\tin %d: %s (group %d, format %d)\n",b,i.name,i.group,i.format); for (b=0;BASS_ASIO_ChannelGetInfo(0,b,&i);b++) printf("\tout %d: %s (group %d, format %d)\n",b,i.name,i.group,i.format); if (i.format<BASS_ASIO_FORMAT_DSD_LSB && BASS_ASIO_SetDSD(TRUE)) { printf("\tDSD:\n"); for (b=0;BASS_ASIO_ChannelGetInfo(1,b,&i);b++) printf("\tin %d: %s (group %d, format %d)\n",b,i.name,i.group,i.format); for (b=0;BASS_ASIO_ChannelGetInfo(0,b,&i);b++) printf("\tout %d: %s (group %d, format %d)\n",b,i.name,i.group,i.format); } } BASS_ASIO_Free(); } system("pause"); } dev 0: MOTU Audio ASIO driver: C:\Program Files\MOTU\MFWAASIO.DRV in 0: Analog 1 (group 0, format 18) in 1: Analog 2 (group 0, format 18) in 2: Analog 3 (group 0, format 18) in 3: Analog 4 (group 0, format 18) in 4: Analog 5 (group 0, format 18) in 5: Analog 6 (group 0, format 18) in 6: Analog 7 (group 0, format 18) in 7: Analog 8 (group 0, format 18) in 8: AES/EBU 1 (group 0, format 18) in 9: AES/EBU 2 (group 0, format 18) in 10: S/PDIF 1 (group 0, format 18) in 11: S/PDIF 2 (group 0, format 18) in 12: Mix 1 Return 1 (group 0, format 18) in 13: Mix 1 Return 2 (group 0, format 18) out 0: Analog 1-2 (group 0, format 18) out 1: Analog 1-2 (group 0, format 18) out 2: Analog 3-4 (group 0, format 18) out 3: Analog 3-4 (group 0, format 18) out 4: Analog 5-6 (group 0, format 18) out 5: Analog 5-6 (group 0, format 18) out 6: Analog 7-8 (group 0, format 18) out 7: Analog 7-8 (group 0, format 18) out 8: AES/EBU 1-2 (group 0, format 18) out 9: AES/EBU 1-2 (group 0, format 18) out 10: S/PDIF 1-2 (group 0, format 18) out 11: S/PDIF 1-2 (group 0, format 18) out 12: Phones 1-2 (group 0, format 18) out 13: Phones 1-2 (group 0, format 18) dev 1: MOTU MicroBook ASIO driver: C:\Program Files\MOTU\MOTUMicroBookASIO.DRV in 0: Input 1-2 (group 0, format 18) in 1: Input 1-2 (group 0, format 18) in 2: Input 3-4 (group 0, format 18) in 3: Input 3-4 (group 0, format 18) out 0: Output 1-2 (group 0, format 18) out 1: Output 1-2 (group 0, format 18) dev 2: MOTU PCI ASIO driver: C:\Program Files\MOTU\MAWASIO.DRV DSD: ASIO увидело все 8 входов, но мне не понятно следующее: - почему 3 устройства ASIO? - почему устройство 1 дает повторяющиеся значения для входов 0,1 и 2,3 (input 1-2 и input 3-4)? |
Сообщ.
#28
,
|
|
|
Цитата почему 3 устройства ASIO? Сколько поставили драйверов(устройств), столько и будет. Используйте то устройство, что вам нужно. MOTU MicroBook, по идее, совсем другая железка - не Motu Traveler, и у неё таки 4 входа. А последнее...без понятия, что-то связанное с форматом DSD... Цитата почему устройство 1 дает повторяющиеся значения для входов 0,1 и 2,3 (input 1-2 и input 3-4) Разбирайтесь. Названия выходов устройства 0 тоже повторяются. Курите мануал, экспериментируйте. Устройство у вас на руках. Кстати, чтобы "увидеть" все входы/выходы устройства в MME, нужно поставить галочку "Enable full Wave support for legacy (MME) software" в настройках драйвера(см. мануал). Иначе будут доступны только первые два канала. |
Сообщ.
#29
,
|
|
|
Буду разбираться. Первым делом попробую записать звук с микрофона помощью Asio, поскольку компьютер с FireWire, управляющий Motu, вышел из строя, а других компьютеров с FireWire пока нет.
|