На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование звука"
0) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с записью, обработкой, воспроизведением звука. Перед созданием темы подумайте, не будет ли она уместнее в разделах Разработка и тестирование программ, Наши исходники, а особенно Разовые заказы и подработки
1) На Раздел распространяются все Правила форума.Огромная просьба с ними внимательно ознакомиться.
2) Запрещается давать бессмысленные ответы вроде: "Снеси Мастдай", "ХП рулит", "Поставь Линукс" и т.д.
3) Запрещается создавать темы, в которых Вы намереваетесь получить ссылку на кряки, серийники и т.п. Также запрещено любое обсуждение p2p (peer-to-peer) сетей (BitTorrent, eDonkey и т.д.).
4) Реклама всякого рода пресекается беспощадно.
5) Используйте тэг [CODE] для выделения кода программы (непременно с указанием языка программирования - выбрать из списка. В противном случае бессмысленно!). Уважайте тех, кто будет читать ваш код!
6) Если решение вашей проблемы найдено, то не забываем помечать тему специальной функцией "Вопрос решён". Вам всего лишь требуется при написании последнего ответа поставить одну единственную галочку прямо над формой ответа.
7) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе

8) Если не прикрепляются/не скачиваются файлы, читаем Не прикрепляется / не скачивается файл. Любые обсуждения в данном разделе проблем с приложением файлов считаются оффтопиком! Со всеми вытекающими.

9) NEW! Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно. Попытки накрутки количества тематических сообщений за счёт поднятия древних неактуальных тем ("некрофилия") будут наказываться по велению левой пятки модераторского состава (см. пп.12, 13 Правил)



Нарушение Правил может повлечь наказание со стороны модераторов.



user posted imageFAQ Раздела user posted imageПоиск в Разделе user posted imageMSDN Library Online | Ваше мнение о модераторах: user posted imageBarazuk user posted imageRikkie
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как программировать многоканальное устройство?
    Вроде бы с записью с микрофона разобрался. Решил попробовать поработать с многоканальнм устройством. Мне удалось достать звуковую карты 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 и использую функцию:
    ExpandedWrap disabled
      waveInOpen(&hwvInDev, numIn, &wvFormat, (DWORD)wvRecCallBack, 0L, CALLBACK_FUNCTION);
    в которой numIn = 3. На внешнем блоке Delta 66 вижу 4 входных гнезда, а по сообщениям программы получается, что гнезда 1-2 и 3-4 совмещены, т.е. отдельно открыть 1 и 2 канал для записи сигналов по каждому из входов с помощью указанной выше функции у меня не получится. Подскажите, пожалуйста, есть ли возможность записывать сигналы по всем 4 входным каналам? Очень надеюсь на скорую помощь специалистов, поскольку через 2 недели устройство придется возвращать.
      Или открывать 4 и 6 как независимые 2-х канальные устройства, или поэкспериментировать с 7.
      Если 7 позволит сразу 4 канала писать, то и совсем хорошо.

      Добавлено
      А что говорит waveInGetDevCaps по поводу 7(4,6)? Что в wChannels?
      Сообщение отредактировано: Prince -
        Немного изменил программу:
        ExpandedWrap disabled
          #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 и 6 имеют по 2 канала, т.е. для устройства 4 первый канал - это вход 3, второй канал - вход 4, для устройства 6 - вход 1 и вход 2

          Да.
          Цитата
          С точки зрения программирования все равно не понял, как обратиться к каждому каналу.

          В чём конкретно загвоздка? С записью, вы говорите, что разобрались.
          Буфер можно представить как одномерный массив, где чётные элементы - левый канал, нечётные - правый; или как двумерный массив.
          Если я правильно уловил суть вопроса.
          Сообщение отредактировано: Prince -
            Попробую объяснить:
            при выборе цифры 6 я выбираю сразу 2 канала - 1 и 2. Как в программе, приведенной в Как программа записи звука с микрофона прерывает запись?, указать, что для записи будет использоваться, например, 1 канал? В Adobe Audition в случае моно сигнала легко можно выбрать 1 или 2 канал (или сразу 4 входных канала), и записывать данные с каждого канала в отдельные файлы. Как при использовании MME добиться таких же возможностей? Как разделить каналы, если используется одна и та же цифра 6 для двух каналов?
              Получнив буфер от карты, разделить его на два набора данных по принципу: два байта (еслий звук 16 битный) - левый канал, два байта - правый канал, и .т. д.
              Сообщение отредактировано: MIF -
                Цитата
                Как разделить каналы, если используется одна и та же цифра 6 для двух каналов?



                Буфер, который возращает устройство 6 по wim_data, каналы 1 и 2 канал 1канал 2канал 1канал 2канал 1канал 2канал 1канал 2...канал 1канал 2
                wvBuf -> lpData 013867345-1341563453-300-567...-789876

                Выделить 2 дополнительных буфера(массива), куда раскидать чётные и нечётные элементы из стерео(2-х канального) буфера.


                Дополнительный буфер, канал 1 канал 1канал 1канал 1канал 1...канал 1
                buf_L 0345156-300...-789



                Дополнительный буфер, канал 2 канал 2канал 2канал 2канал 2...канал 2
                buf_R 13867-1343453-567...876

                Цитата
                записывать данные с каждого канала в отдельные файлы

                buf_L и buf_R скидывать в разные файлы.
                Сообщение отредактировано: Prince -
                  Спасибо большое за подробные объяснения! Идею понял, попробую реализовать на практике.
                    А как влияет значение wvFormat.nChannels на запись? Предположим, выбрано устройство 6, wvFormat.nChannels = 2, wvFormat.wBitsPerSample = 16, wvFormat.nSamplesPerSec = 44100. Записываем все данные в один файл. Разве в файл не будут последовательно сохраняться данные с двух каналов (первый канал, второй канал, первый канал, второй канал и т.д.)? А потом этот файл можно будет разобрать на четные и нечетные отсчеты (зная, что он двухканальный и в отчете 16 бит) и дальше обрабатывать поканально.
                      Цитата tumanovalex @
                      Записываем все данные в один файл. Разве в файл не будут последовательно сохраняться данные с двух каналов (первый канал, второй канал, первый канал, второй канал и т.д.)?

                      Будут.
                      Цитата tumanovalex @
                      А потом этот файл можно будет разобрать на четные и нечетные отсчеты (зная, что он двухканальный и в отчете 16 бит) и дальше обрабатывать поканально.


                      Можно И потом, а можно И на лету,без записи в файл.
                        Возник еще один вопрос. При одновременной записи по каналам 6 и 4 (Как программа записи звука с микрофона прерывает запись?) нужно создавать 2 CallBack функции, две функции tryrec и два файла для записи с разными названиями?
                          Цитата
                          нужно создавать 2 CallBack функции

                          Поскольку в CallBack передаётся хендл устройства, от которого прилетело сообщение, можно разрулить в теле одной функции сообщения и от 6 и от 4. Попробуйте, проверьте.
                          Цитата
                          две функции tryrec

                          До окончания записи основной поток зависнет в tryrec. Или переписывать tryrec под 2 устройства, или менять структуру программы.
                          Цитата
                          два файла для записи с разными названиями

                          Скорее да, чем нет.
                          Можно, в принципе, придумать механизм записи всех (4-х) каналов в один wave файл.
                          Но пишите пока в 2 разных (или 4) файла. Вам ведь для теста некритично(?)
                          Сообщение отредактировано: Prince -
                            Спасибо за ответ. Попробую.
                              Попробовал программировать 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 каналам стерео (попарно). Значит как-то можно все-таки записывать по всем каналам?
                                Цитата
                                Я установил в настройках моно сигнал, запустил запись и поочередно вставлял в каждые из 8 входов микрофон.

                                Ерунда.
                                Цитата
                                Если сделать стереозапись, то сохраняет в файл входные сигналы с 2 каналов (1 и 2 или 2 и 3).

                                Так 1 и 2, или 2 и 3? :wacko:
                                Цитата
                                Может быть MME не подходит и нужно что-нибудь другое, типа DirectSound или ASIO?

                                ASIO.
                                Цитата
                                Попробовал записывать с Adobe Audition, пишет по всем 8 каналам моно или по 4 каналам стерео (попарно). Значит как-то можно все-таки записывать по всем каналам?

                                Загляните в настройки адоб аудишн, посмотрите, какой интерфейс используется.
                                Цитата
                                В отличие от Delta 66 дает номер устройства только один (в моем случае номер устройства 2: Motu Analog).

                                :-? Как запилил поддержку MME(waveaudio functions) в своих драйверах производитель, он и знает. Кстати, почему бы у него и не спросить.
                                Цитата
                                Помогите, пожалуйста, советом

                                Посмотрите BASSASIO, например. Там должны быть примеры.
                                Сообщение отредактировано: Prince -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0568 ]   [ 16 queries used ]   [ Generated: 19.03.24, 10:41 GMT ]