Параметры формата аудио по умолчанию

Тема в разделе "Библиотеки и интерфейсы", создана пользователем Jin X, 6 сен 2017.

  1. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    В настройках "Звука" винды для каждого (почти) устройства ввода и вывода есть "формат по умолчанию", см. скриншот. Как его прочитать? Пипец, ищем – не можем ничего найти...

    audiofmt.jpg
     
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Это значение (в формате WAVEFORMATEX) можно получить запросив свойство PKEY_AudioEngine_DeviceFormat.
    Создается перечислитель MMDeviceEnumerator, затем у него вызывается GetDefaultAudioEndpoint. У полученного IMMDevice запрашивается PropertyStore в котором и находится ключ PKEY_AudioEngine_DeviceFormat.
     
    Jin X нравится это.
  3. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Спасибо, но я не понимаю, как это всё проделать.
    Как создать перечислить MMDeviceEnumerator, вызвать у него GetDefaultAudioEndpoint, запросить PropertyStore.
    И это всё не на C++
     
  4. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Вот так на Delphi я исправил кусок, но дальше что - не знаю...
    Код (Text):
    1. procedure TfmMain.GetInfo;
    2. const
    3.   PKEY_AudioEngine_DeviceFormat_GUID: TGUID = '{F19F064D-082C-4E27-BC73-6882A1BB8E4C}';
    4.   PKEY_AudioEngine_DeviceFormat_pid = 0;
    5. // DEFINE_PROPERTYKEY(PKEY_AudioEngine_DeviceFormat, 0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c, 0);
    6. var
    7.   FMMDevEnum: IMMDeviceEnumerator;
    8.   FMMDev: IMMDevice;
    9.   FEndpoint: IPropertyStore;
    10.   PropVar: ^tag_inner_PROPVARIANT;
    11.   PropVar2: tag_inner_PROPVARIANT;
    12.   Key: _tagpropertykey;
    13. begin
    14.   PropVar := nil;
    15.   CoCreateInstance(CLASS_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator,
    16.     FMMDevEnum);
    17.   FMMDevEnum.GetDefaultAudioEndpoint(eRender, eMultimedia, FMMDev);
    18.   FMMDev.Activate(IID_IPropertyStore, CLSCTX_ALL, PropVar^, Pointer(FEndPoint));
    19.   Key.fmtid := PKEY_AudioEngine_DeviceFormat_GUID;
    20.   Key.pid := PKEY_AudioEngine_DeviceFormat_pid;
    21. // ЗДЕСЬ ВОЗНИКАЕТ ИСКЛЮЧЕНИЕ (EAccessViolation):
    22.   FEndPoint.GetValue(Key, PropVar2);
    23. end;
    Источник: http://www.cyberforum.ru/delphi-multimedia/thread2034210.html
    Полный код в аттаче...
     

    Вложения:

    • GetFormat.zip
      Размер файла:
      29,9 КБ
      Просмотров:
      6
  5. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Если будет ругаться на типа переменной Key в строке FEndPoint.GetValue(Key, PropVar2); (на Delphi 2007 и выше), переставьте MMDeviceAPI в uses в самый конец списка.

    Ещё строка FMMDev.Activate(IID_IPropertyStore, CLSCTX_ALL, PropVar^, Pointer(FEndPoint)) выдаёт не ноль.
    Видимо, там косяк какой-то... ну и дальше х/з...

    p.s. В идеале, конечно, если бы можно было узнавать параметры не только устройства по умолчанию, а любого (причём, полученного через waveOutDevCaps).
    И устройства ввода тоже, а не только вывода.
    Но для начала бы с этим разобраться...
     
    Последнее редактирование: 6 сен 2017
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    На дельфи не знаю как. Могу кинуть пример как это сделать в VB6 или С++.
     
    Jin X нравится это.
  7. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Я так понимаю, VB6 ближе к ассемблеру в том плане, что там нет интерфейсов? Если так, тогда лучше на нём.
    Если есть, тогда лучше на C++.

    Но если можно на ассемблере (любом), то было бы лучше всего :)
    Потому что с него можно на любой язык перевести...
     
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Для чего Activate? OpenPropertyStore
     
    Jin X нравится это.
  9. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Так срабатывает... И дальше что с этим делать?
     
  10. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Кстати, в чём разница между eMultimedia, eConsole, eCommunications ?
     
  11. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Уф, разобрался!!!!
    Понял и про eRender/eCapture и про eMultimedia/eCommunications. Только вот что такое eConsole не совсем понятно...
    В целом вот так:
    Код (Text):
    1. procedure TfmMain.GetInfo;
    2. const
    3.   PKEY_AudioEngine_DeviceFormat_GUID: TGUID = '{F19F064D-082C-4E27-BC73-6882A1BB8E4C}';
    4.   PKEY_AudioEngine_DeviceFormat_pid = 0;
    5. // DEFINE_PROPERTYKEY(PKEY_AudioEngine_DeviceFormat, 0xf19f064d, 0x82c, 0x4e27, 0xbc, 0x73, 0x68, 0x82, 0xa1, 0xbb, 0x8e, 0x4c, 0);
    6.   STGM_READ = 0;
    7. var
    8.   FMMDevEnum: IMMDeviceEnumerator;
    9.   FMMDev: IMMDevice;
    10.   FEndPoint: IPropertyStore;
    11.   Prop: tag_inner_PROPVARIANT;
    12.   Key: _tagpropertykey;
    13.   Format: TWaveFormatEx;
    14.  
    15. begin
    16.   CoCreateInstance(CLASS_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, FMMDevEnum);
    17.   FMMDevEnum.GetDefaultAudioEndpoint(eRender, eMultimedia, FMMDev);
    18.   FMMDev.OpenPropertyStore(STGM_READ, FEndPoint);
    19.  
    20.   Key.fmtid := PKEY_AudioEngine_DeviceFormat_GUID;
    21.   Key.pid := PKEY_AudioEngine_DeviceFormat_pid;
    22.  
    23. //  FillChar(Prop, SizeOf(Prop), 0);
    24.   FEndPoint.GetValue(Key, Prop);
    25.   Move(Prop.__MIDL____MIDL_itf_mmdeviceapi_0003_00810001.blob.pBlobData^, Format, SizeOf(Format));
    26.  
    27.   Edit1.Text := IntToStr(Format.nChannels);
    28.   Edit2.Text := IntToStr(Format.nSamplesPerSec);
    29.   Edit3.Text := IntToStr(Format.wBitsPerSample)
    30. end;
    31.  
    Thetrik, СПАСИБИЩЕ !!!!!!!!!!

    Теперь бы выяснить как сделать то же самое, но не для устройства по умолчанию, а для любого устройства... :)
     

    Вложения:

    • GetFormat.zip
      Размер файла:
      15 КБ
      Просмотров:
      5
  12. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Код (C++):
    1.  
    2. ...
    3.  
    4. if (FAILED(hr = pEnumerator->EnumAudioEndpoints(eAll, DEVICE_STATEMASK_ALL, &pCollection))) {
    5.     }
    6.  
    7.     if (FAILED(hr = pCollection->GetCount(&uDevicesCount))) {
    8.     }
    9.  
    10.     for (int i = 0; i < uDevicesCount; i++) {
    11.  
    12.         if (FAILED(hr = pCollection->Item(i, &pDevice))) {
    13.         }
    14.  
    15.         if (FAILED(hr = pDevice->OpenPropertyStore(STGM_READ, &ps))) {
    16.         }
    17.  
    18.         if (FAILED(hr = ps->GetValue(PKEY_AudioEngine_DeviceFormat, &pv))) {
    19.         }
    20.  
    21. ...
     
    Jin X нравится это.
  13. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Спасибо, попробую. А как выяснить имя устройства?
    И будет ли оно совпадать с именем из waveOutGetDevCaps? Ну или хотя бы порядковый номер будет таким же гарантировано? Потому что открывать-то я его всё равно буду через waveOutOpen...
     
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    PKEY_Device_FriendlyName.
    https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd370819(v=vs.85).aspx
     
    Jin X нравится это.
  15. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Сделал всё это на MASM32 (пока только для устройства по умолчанию), разобрался как работать с COM :)

    Возник только такой вопрос: почему Reference Count = 1 после IMMDeviceEnumerator.Release ?
    И если я выполняю Release повторно, то на ExitProcess возникает исключение?

    Код (ASM):
    1. .686P
    2. .MODEL Flat,StdCall
    3. OPTION CASEMAP:NONE
    4.  
    5. INCLUDE         \MASM32\INCLUDE\WINDOWS.INC
    6. INCLUDE         \MASM32\INCLUDE\KERNEL32.INC
    7. INCLUDE         \MASM32\INCLUDE\OLE32.INC
    8. INCLUDE         \MASM32\INCLUDE\MSVCRT.INC
    9.  
    10. INCLUDELIB      \MASM32\LIB\KERNEL32.LIB
    11. INCLUDELIB      \MASM32\LIB\OLE32.LIB
    12. INCLUDELIB      \MASM32\LIB\MSVCRT.LIB
    13.  
    14. DEBUG           =       1                       ; 0 - режим релиза, 1 - режим отладки
    15.  
    16. ;-- ПСЕВДОНИМЫ, МАКРОСЫ, СТРУКТУРЫ, ИНТЕРФЕЙСЫ -------------------------------------------------------------------------
    17.  
    18. ; Псевдонимы функций
    19. printf          EQU     crt_printf
    20. wprintf         EQU     crt_wprintf
    21.  
    22. ; Константы
    23. eRender         =       0
    24. eCapture        =       1
    25.  
    26. eConsole        =       0
    27. eMultimedia     =       1
    28. eCommunications =       2
    29.  
    30. STGM_READ       =       0
    31. STGM_WRITE      =       1
    32. STGM_READWRITE  =       2
    33.  
    34. WAVE_FORMAT_EXTENSIBLE  =       0FFFEh
    35.  
    36. ; Определить константу N1&N2&N3 со значением Value
    37. Def_CatStr      MACRO   Value, N1, N2, N3
    38.                 N1&N2&N3        =       Value
    39. ENDM
    40.  
    41. ; Вызов функции (по смещению) Ofs объекта Obj с параметрами params
    42. cominvk         MACRO   Obj, Ofs, Params:VARARG
    43.                 LOCAL   param, reversed
    44.                 reversed TEXTEQU <>
    45. %       FOR     param,<Params>
    46.                 reversed CATSTR <param>,<!,>,reversed
    47.         ENDM
    48. %       FOR     param,<reversed>
    49.                 push    param
    50.         ENDM
    51.                 mov     eax,Obj
    52.                 push    eax
    53.                 mov     eax,[eax]
    54.                 call    DWORD PTR [eax+Ofs]
    55. ENDM
    56.  
    57. ; Определить интерфейс с именем ComName и функциями из списка FuncList
    58. Interface       MACRO   ComName, FuncList:VARARG
    59.                 LOCAL   N, func
    60.                 ComName&_QueryInterface =       0*4
    61.                 ComName&_AddRef         =       1*4
    62.                 ComName&_Release        =       2*4
    63.                 N = 3
    64.         FOR     func,<FuncList>
    65.                 Def_CatStr      N*4, ComName,_,func
    66.                 N = N + 1
    67.         ENDM
    68. ENDM
    69.  
    70. ; Выполнить Inst, если имя DEBUG определено и не равно 0
    71. DEBUG_          MACRO   Inst:VARARG
    72.   ifdef DEBUG
    73.     if  DEBUG
    74.                 Inst
    75.     endif
    76.   endif
    77. ENDM
    78.  
    79. ; Определение функций интерфейсов
    80. Interface       IMMDeviceEnumerator, EnumAudioEndpoints, GetDefaultAudioEndpoint, GetDevice, RegisterEndpointNotificationCallback, UnregisterEndpointNotificationCallback
    81. Interface       IMMDevice, Activate, OpenPropertyStore, GetId, GetState
    82. Interface       IPropertyStore, GetCount, GetAt, GetValue, SetValue, Commit
    83.  
    84. BLOB            STRUCT
    85.         cbSize  DD      ?
    86.         pBlobData DD    ?
    87. BLOB            ENDS
    88.  
    89. PropVariant     STRUCT
    90.         vt      DW      ?
    91.         wRes1   DB      ?
    92.         wRes2   DB      ?
    93.         wRes3   DD      ?
    94.         blob    BLOB    <>
    95. PropVariant     ENDS
    96.  
    97. ;-- ДАННЫЕ -------------------------------------------------------------------------------------------------------------
    98.  
    99. .DATA
    100.  
    101. fmtInfo         DB      'Default Wave Format:',13,10
    102.                 DB      '  FormatTag = %i%s',13,10
    103.                 DB      '  SamplesPerSec = %i',13,10
    104.                 DB      '  BitsPerSample = %i',13,10
    105.                 DB      '  Channels = %i',13,10
    106.                 DB      '  AvgBytesPerSec = %i',13,10
    107.                 DB      '  BlockAlign = %i',13,10,0
    108. fmtExtraInfo    DB      10,'Extra Info:',13,10
    109.                 DB      '  ValidBitsPerSample = %i',13,10
    110.                 DB      '  ChannelMask = %08X (hex)',13,10
    111.                 DB      '  SubFormat GUID = ',0
    112. strWaveFmtExt   DB      ' (WAVE_FORMAT_EXTENSIBLE)'
    113. strZero         DB      0
    114. strError        DB      'Interface error :('
    115. strNewLine      DB      13,10,0
    116.  
    117. DEBUG_  fmtDebug                DB      '%s = %i',13,10,0
    118. DEBUG_  strCoCreateInstance     DB      'DEBUG: CoCreateInstance(IMMDeviceEnumerator)',0
    119. DEBUG_  strIMMDeviceEnumerator  DB      'DEBUG: IMMDeviceEnumerator.GetDefaultAudioEndpoint',0
    120. DEBUG_  strIMMDevice            DB      'DEBUG: IMMDevice.OpenPropertyStore',0
    121. DEBUG_  strIPropertyStore       DB      'DEBUG: IPropertyStore.GetValue(PKEY_AudioEngine_DeviceFormat)',0
    122. DEBUG_  strIMMDeviceEnumeratorRelease DB 'DEBUG: IMMDeviceEnumerator.Release',0
    123. DEBUG_  strIMMDeviceRelease     DB      'DEBUG: IMMDevice.Release',0
    124. DEBUG_  strIPropertyStoreRelease DB     'DEBUG: IPropertyStore.Release',0
    125.  
    126. CLASS_MMDeviceEnumerator        GUID    {0BCDE0395h,0E52Fh,0467Ch,{08Eh,03Dh,0C4h,057h,092h,091h,069h,02Eh}}
    127. IID_IMMDeviceEnumerator         GUID    {0A95664D2h,09614h,04F35h,{0A7h,046h,0DEh,08Dh,0B6h,036h,017h,0E6h}}
    128. PKEY_AudioEngine_DeviceFormat   GUID    {0F19F064Dh,0082Ch,04E27h,{0BCh,073h,068h,082h,0A1h,0BBh,08Eh,04Ch}}
    129.                                 DD      0       ; часть PKEY_AudioEngine_DeviceFormat
    130.  
    131. MMDevEnum       DD      0
    132. MMDev           DD      0
    133. PropStore       DD      0
    134.  
    135. .DATA?
    136.  
    137. Prop            PropVariant     <>
    138. GUIDString      DW      40 dup (?)
    139. InputRec        INPUT_RECORD    <>
    140. ReallyRead      DD      ?
    141.  
    142. ;-- ОСНОВНОЙ КОД -------------------------------------------------------------------------------------------------------
    143.  
    144. .CODE
    145.  
    146. Start:
    147.  
    148.                 invoke  CoInitialize, NULL
    149.  
    150.                 ; CoCreateInstance(CLASS_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, MMDevEnum)
    151.                 invoke  CoCreateInstance, ADDR CLASS_MMDeviceEnumerator, NULL, CLSCTX_ALL, ADDR IID_IMMDeviceEnumerator, ADDR MMDevEnum
    152. DEBUG_          push    eax
    153. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strCoCreateInstance, eax
    154. DEBUG_          pop     eax
    155.                 test    eax,eax
    156.                 jnz     Error
    157.  
    158.                 ; MMDevEnum.GetDefaultAudioEndpoint(eRender, eMultimedia, MMDev)
    159.                 cominvk MMDevEnum, IMMDeviceEnumerator_GetDefaultAudioEndpoint, eRender, eMultimedia, OFFSET MMDev
    160. DEBUG_          push    eax
    161. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIMMDeviceEnumerator, eax
    162. DEBUG_          pop     eax
    163.                 test    eax,eax
    164.                 jnz     Error
    165.  
    166.                 ; MMDev.OpenPropertyStore(STGM_READ, PropStore)
    167.                 cominvk MMDev, IMMDevice_OpenPropertyStore, STGM_READ, OFFSET PropStore
    168. DEBUG_          push    eax
    169. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIMMDevice, eax
    170. DEBUG_          pop     eax
    171.                 test    eax,eax
    172.                 jnz     Error
    173.  
    174.                 ; PropStore.GetValue(Key, Prop)
    175.                 cominvk PropStore, IPropertyStore_GetValue, OFFSET PKEY_AudioEngine_DeviceFormat, OFFSET Prop
    176. DEBUG_          push    eax
    177. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIPropertyStore, eax
    178. DEBUG_          pop     eax
    179.                 test    eax,eax
    180.                 jnz     Error
    181.  
    182. DEBUG_          invoke  printf, ADDR strNewLine
    183.  
    184.                 ; Выводим результаты
    185.                 mov     ebx,Prop.blob.pBlobData
    186.                 movzx   esi,[ebx+WAVEFORMATEX.wFormatTag]
    187.                 movzx   eax,[ebx+WAVEFORMATEX.wBitsPerSample]
    188.                 movzx   ecx,[ebx+WAVEFORMATEX.nChannels]
    189.                 movzx   edx,[ebx+WAVEFORMATEX.nBlockAlign]
    190.                 mov     edi,OFFSET strZero
    191.                 cmp     esi,WAVE_FORMAT_EXTENSIBLE
    192.                 jne     NotExt
    193.                 mov     edi,OFFSET strWaveFmtExt
    194. NotExt:         invoke  printf, ADDR fmtInfo, esi, edi, [ebx+WAVEFORMATEX.nSamplesPerSec], eax, ecx, [ebx+WAVEFORMATEX.nAvgBytesPerSec], edx
    195.  
    196.                 ; Дополнительные данные
    197.                 cmp     esi,WAVE_FORMAT_EXTENSIBLE
    198.                 jne     Finish
    199.                 movzx   eax,WORD PTR [ebx+18]
    200.                 invoke  printf, ADDR fmtExtraInfo, eax, DWORD PTR [ebx+20]
    201.                 lea     eax,[ebx+24]
    202.                 invoke  StringFromGUID2, eax, ADDR GUIDString, LENGTHOF GUIDString      ; переводим GUID в Unicode-строку
    203.                 invoke  wprintf, ADDR GUIDString
    204.                 invoke  printf, ADDR strNewLine
    205. Finish:
    206.                 ; Освобождаем все интерфейсы
    207. DEBUG_          invoke  printf, ADDR strNewLine
    208.                 cmp     MMDevEnum,0
    209.                 je      @@NoMMDevEnum
    210.         @@:     cominvk MMDevEnum, IMMDeviceEnumerator_Release
    211. ;DEBUG_         push    eax
    212. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIMMDeviceEnumeratorRelease, eax
    213. ;DEBUG_         pop     eax
    214. ;               test    eax,eax
    215. ;               jnz     @B
    216.         @@NoMMDevEnum:
    217.                 cmp     MMDev,0
    218.                 je      @@NoMMDev
    219.         @@:     cominvk MMDev, IMMDevice_Release
    220. ;DEBUG_         push    eax
    221. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIMMDeviceRelease, eax
    222. ;DEBUG_         pop     eax
    223. ;               test    eax,eax
    224. ;               jnz     @B
    225.         @@NoMMDev:
    226.                 cmp     PropStore,0
    227.                 je      @@NoPropStore
    228.         @@:     cominvk PropStore, IPropertyStore_Release
    229. ;DEBUG_         push    eax
    230. DEBUG_          invoke  printf, ADDR fmtDebug, ADDR strIPropertyStoreRelease, eax
    231. ;DEBUG_         pop     eax
    232. ;               test    eax,eax
    233. ;               jnz     @B
    234.         @@NoPropStore:
    235.  
    236.                 ; Ожидаем нажатия любой клавиши
    237.                 invoke  GetStdHandle, STD_INPUT_HANDLE
    238.                 mov     ebx,eax
    239.         @@LoopInput:
    240.                 invoke  ReadConsoleInput, ebx, offset InputRec, 1, offset ReallyRead
    241.                 test    eax,eax
    242.                 jz      @@Error
    243.                 cmp     InputRec.EventType, KEY_EVENT
    244.                 jne     @@LoopInput
    245.                 cmp     InputRec.KeyEvent.bKeyDown, 0
    246.                 je      @@LoopInput
    247.         @@Error:
    248.                 invoke  ExitProcess, NULL
    249. Error:
    250.                 invoke  printf, ADDR strError   ; сообщение об ошибке
    251.                 jmp     Finish
    252.  
    253. END             Start
     

    Вложения:

  16. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Ты не должен брать во внимание это значение, нужно просто вызывать столько раз Release сколько было вызвано AddRef + 1. Внутренняя реализация объекта MMDeviceEnumerator из CoCreateInstance уже возвращает объект со значением счетчика 2, а сам объект уничтожается только из DllMain. Однако, когда ты вызываешь Release дважды то в обработчике DLL_PROCESS_DETTACH код обращается к объекту которого уже нет и происходит исключение.
     
    Jin X нравится это.
  17. yashechka

    yashechka Ростовский фанат Нарвахи Команда форума

    Публикаций:
    25
    Регистрация:
    2 янв 2012
    Сообщения:
    1.132
    Адрес:
    Россия
    Какие Вы двоём молодцы:boast::boast::boast:
     
  18. SadKo

    SadKo Владимир Садовников

    Публикаций:
    1
    Регистрация:
    4 июн 2007
    Сообщения:
    1.096
    Адрес:
    г. Санкт-Петербург
    С вас теперь статья :).
     
  19. Jin X

    Jin X Member

    Публикаций:
    0
    Регистрация:
    15 янв 2009
    Сообщения:
    91
    Адрес:
    Самара
    Ну вообще была такая мысль, только сделаю получение списка устройств (руки должны дойти) :). Хотя обещать лучше не буду :)

    Вопрос ещё такой: как связать имя устройства через IMM-интерфейсы с именем waveIn/OutDevCaps? Там, как я понимаю, разные будут названия... хотя, пока не пробовал :)

    p.s. А по-хорошему бы надо разобраться ещё с оповещениями и изменением громкости, но это можно уже потом описать, если что...
     
    Последнее редактирование: 10 сен 2017
  20. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
     
    Jin X нравится это.