powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
12 сообщений из 12, страница 1 из 1
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37939523
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через миксер получаю доступ к контролам Volume/Mute, что в панели управления-> Аудио.
Для этого достаточно миксера MIXERLINECONTROLS и открывать аудио канал не надо.
Поэтому обычно в кодах начинают с этого:
Код: vbnet
1.
2.
      ' Open the mixer with deviceID 0.
         rc = mixerOpen(hmixer, 0, 0, 0, 0)


С ба-альшим риском не попасть в требуемый девайс, отчего куча рассуждений по поводу ОС и разных-де звуковых драйверах с кучей горе затычек. У меня у самого поначалу один пример на одном компе только работал, другой только на другом.
Код: vbnet
1.
2.
Private Declare Function mixerOpen Lib "winmm.dll" (phmx As Long, ByVal uMxId As Long, _
 ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal fdwOpen As Long) As Long


На самом деле правильный прием следующий
1) Получить девайс id через waveOutGetNumDevs/waveInGetDevCaps например тупо по его имени (список Player/Receiver тоже извлекается этими ф-циями)
2) Но id это еще не ByVal uMxId As Long . Поэтому применяется (вытащил из Opal/ptlib и еще гуглил) следующая хитрость кот. дает гарантии:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function OpenDevicePlayer(id As Long) As Boolean
  Dim format As WAVEFORMATEX
  format.wFormatTag = WAVE_FORMAT_PCM
  format.nChannels = 1
  format.wBitsPerSample = 8
  format.nSamplesPerSec = 8000
  format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8
  format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign
  format.cbSize = 0
  
  Dim line As MIXERLINE
  
  Dim osError As Long
  
  osError = MMSYSERR_BADDEVICEID
  Dim hWaveOut As Long
  osError = waveOutOpen(hWaveOut, id, format, 0, 0, 0)
  If osError = MMSYSERR_NOERROR Then
    mixerOpen hmixer_spk, hWaveOut, 0, 0, MIXER_OBJECTF_HWAVEOUT
    line.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
  End If


hWaveOut -это как раз и есть волшебный ID, кот. безошибочно тыкается в нужный миксер.
Но - мне нужны только контролы миксера ( за ручки подергать ), мне не нужен "wav канал", кот. я открыл ф-цией
waveOutOpen function
В Opal аудио канал используется, но при этом миксер и все дела закрываются по завершении телефонного звонка.
Именно это мне не нравится, т.к. нет звонка - не дергается "громкость".

Вопрос в чем. Надо ли мне закрывать waveform-audio output device for playback
1) Можно ли это сделать сразу после mixerOpen?
2) Как это написать на VB6 и какие ф-ции использовать?

waveOutClose function
The waveOutClose function closes the given waveform-audio output device
The close operation fails if the device is still playing a waveform-audio buffer that was previously sent by calling waveOutWrite. Before calling waveOutClose, the application must wait for all buffers to finish playing or call the waveOutReset function to terminate playback.

waveOutReset function
Ptlib делает так, но это слишком заумно. Я фактически использую только управление миксером , т.е. звук в канал не играю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
PBoolean PSoundChannelWin32::Close()
{
...
  PWaitAndSignal mutex(bufferMutex);

  Abort();

  if (hWaveOut != NULL) {
    while (waveOutClose(hWaveOut) == WAVERR_STILLPLAYING)
      waveOutReset(hWaveOut);
    hWaveOut = NULL;
  }
...
  if (hMixer != NULL) {
    mixerClose(hMixer);
    hMixer = NULL;
  }
PBoolean PSoundChannelWin32::Abort()
{
  DWORD osError = MMSYSERR_NOERROR;

  {
    PWaitAndSignal mutex(bufferMutex);

    if (hWaveOut != NULL || hWaveIn != NULL) {
      for (PINDEX i = 0; i < buffers.GetSize(); i++) {
        do {
          if (hWaveOut != NULL)
            waveOutReset(hWaveOut);
          if (hWaveIn != NULL)
            waveInReset(hWaveIn);
        } while (buffers[i].Release() == WAVERR_STILLPLAYING);
      }
    }


3)
Код: vbnet
1.
2.
3.
mixerClose(hMixer);
waveOutReset(hWaveOut);
waveOutClose(hWaveOut)


-это API, здесь понятно.

А как записать на VB6 и надо ли? следующее:
Код: plaintext
1.
2.
hWaveOut = NULL;
hMixer = NULL;



4)
Код: plaintext
1.
PWaitAndSignal mutex(bufferMutex);

Это что-то типа
Код: vbnet
1.
DoEvents

в цикле.

5) А вот то что у меня открыт постоянно (независимо) hMixer да еще и hWaveOut - просто чтоб независимо "дергать за громкость" на работу других приложений (в частности Opal открывает те же самые миксеры и каналы при звонке) - конфликтно-негативно не скажется?
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37939553
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37940222
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Вопрос в чем. Надо ли мне закрывать waveform-audio output device for playback
1) Можно ли это сделать сразу после mixerOpen?
2) Как это написать на VB6 и какие ф-ции использовать?
Я думаю, чтоб не переживать надо сделать так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  osError = MMSYSERR_BADDEVICEID
  Dim hWaveOut As Long
  osError = waveOutOpen(hWaveOut, id, format, 0, 0, 0)
  If osError = MMSYSERR_NOERROR Then
    mixerOpen hmixer_spk, hWaveOut, 0, 0, MIXER_OBJECTF_HWAVEOUT
    waveOutClose hWaveOut
    line.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
  End If


waveOutClose вроде всегда MMSYSERR_NOERROR выводит, я ж с каналом реально не работал, звук в него не запускал.
The close operation fails if the device is still playing a waveform-audio buffer that was previously sent by calling waveOutWrite.

Второй вариант:
Код: vbnet
1.
mixerOpen hmixer_spk, id, 0, 0, MIXER_OBJECTF_WAVEOUT


Т.е. могу вообще hWaveOut не открывать и использовать id
mixerOpen function
MIXER_OBJECTF_WAVEOUT The uMxId parameter is the identifier of a waveform-audio output device in the range of zero to one less than the number of devices returned by the waveOutGetNumDevs function.

Но этот вариант плох, т.к.
A "mapper" for audio mixer devices does not currently exist, so a mixer device identifier of -1 is not valid.
что в переводе на русский означает что миксер для аудио-устройсва с именем "Default" найден не будет.

А хитрость первого метода как раз в том, что можно выбрать устройство что задано в системе "по умолчанию":
Код: vbnet
1.
2.
Private Const WAVE_MAPPER As Long = -1&
waveOutOpen(hWaveOut, WAVE_MAPPER, format, 0, 0, 0)

uDeviceID
Identifier of the waveform-audio output device to open. It can be either a device identifier or a handle of an open waveform-audio input device. You can also use the following flag instead of a device identifier:
Value Meaning
WAVE_MAPPER The function selects a waveform-audio output device capable of playing the given format.
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37940397
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я выкладываю целиком тестовый проект, т.к считаю это разумным в связи с полемикой в соседней теме:
А что, в VB среде и в "EXE" логика разная? 13100750
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37943529
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я работаю много с музыкой. Ты задаешь вопрос в конкретном направлении. Не знаю что тебе в целом конкретно нужно, для чего прога. Я использую библиотеку BASS. На готовых примерах многое чего понял.
Возможно:
- включать/выключать трек (пауза), общий стоп (отдельные плеера + можно указать на какую карточку, с каналами не играл если карта 8ми канальная)
- регулировать: громкость, скорость, PAN, прикручивать: эквалайзер, delay/chorus/reverb
- есть примеры конверт. с mp3 - wav, проигр.с переменной (буфера), пример записи в буфер
- также показано как можно анализировать звук из плеера по id либо подключившись к каналу записи (микрофон, линейн, микшер...)
- звук можно разложить на спектр, есть возможность анализировать по частотно (чем я также занимался. у меня цветомузыка на LPT порте работает. Под ритм управляет выходами).

Что у меня не получалось, так это управлять громкостю (общая). Это нужно было делать через API. А все остальное там супер. Правда теги читать я там не умею, либо не нашел. Потом написал свою ф-цию на VB6
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37943679
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159Не знаю что тебе в целом конкретно нужно, для чего прога.Конкретно пытаюсь сделать (а чего пытаться -надо делать, весь функционал под контролем) софтфон на базе Opal.
От всего что здесь понаписано мне нужно:
1) Отобразить список девайсов (включая default) и выбрать Player/Recorder кот. будут переданы в Opal (в виде буков).
2) Для выбранной пары девайсов мне нужны контролы Volume/mute, т.к. Opal открывает доступ к ним только на момент, когда установлено соединение (через объекты Connection и stream при известном id вызова), при этом эти контролы однозначно определяются выбранными девайсами и к самому Opal никакого отношения не имеют. Такая модель мне не понравилась.
Проще было написать свою реализацию в обход опаловских API, не говоря о том что тот сам лезет в Win32::SoundChannel в другую библиотеку ptlib.
Ну, в общем-то я со всем этим справился.
Самим SoundChannel я заниматься из VB6 не собираюсь.
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37943712
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    ' check the correct BASS was loaded
    If (HiWord(BASS_GetVersion) <> BASSVERSION) Then
        Call MsgBox("An incorrect version of BASS.DLL was loaded", vbCritical)
        End
    End If
    ' Let the user choose the output devices
    With frmDevice
        .SelectDevice 1
        .Show vbModal, Me
        outdev(0) = .device
        .SelectDevice 2
        .Show vbModal, Me
        outdev(1) = .device
    End With
    ' setup output devices
    If (BASS_Init(outdev(0), 44100, 0, Me.hWnd, 0) = 0) Then
        Call Error_("Can't initialize device 1")
        Unload Me
    End If
    If (BASS_Init(outdev(1), 44100, 0, Me.hWnd, 0) = 0) Then
        Call Error_("Can't initialize device 2")
        Unload Me
    End If
    frameMulti(0).Caption = " " & VBStrFromAnsiPtr(BASS_GetDeviceDescription(outdev(0))) & " "
    frameMulti(1).Caption = " " & VBStrFromAnsiPtr(BASS_GetDeviceDescription(outdev(1))) & " "



Неа. ид. устройства ввода/вывода мне не попадалось на глаза в Bass.dll. В этом примере устройство выбирается, но .device там просто 1, 2 и т.д.

Может в WMI есть хоть немного (список девайсов)... Хотя у тебя там коды, мозги можно сламать, наверное уже близок к завершению
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37945816
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче доделал я с "длинными именами". Крайний "рабочий" вариант прилагается, кому интересно.
Но, куча недостатков.
1) waveOut(In)Open делать неправильно. Канал может оказаться заблокирован, локализован и т.п. (например моим же приложением со стороны Opal) и вместо hWaveIn будет ошибка. Причем если сразу его Close как я делаю, то на Висте (на 7-ке почему-то нет) контрол "потеряет управление".
2) На 7-ке "почти работает" -громкость микрофона почему-то не регулируется до нуля. Вообще говоря надо убрать "поправку для микрофона"(где я ищу MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE -это только для XP надо) - или на 7-ке только для миксера микрофона для рекордера будет работать. Причем recorder включается или не включается для разных миксеров в завис. от того чего из панели управления про аудио открыто и т.п..
3) Попробовал делать поиск миксера через mixerGetDevCaps вместо waveOut(In) -ничего не помогает. На Висте для recorder вообще ничего не работает (работает только с большим скрипом при открытом через waveInOpen хандле hWaveIn -как сейчас понимаю Opal только за счет этого умеет регулировать громкость микрофона на Висте (делает это через свой hWaveIn, который открывается на время вызова).
4) Ну и насчет мастер Volume для Player -как правильно было замечено. Хотя к управлению "индивидуальным контролом" претензий вроде нет.

Вкратце, на 7-ке и Висте это кухня глючит по части рекордера, при этом конкретно на Висте глючит по страшной.
Видимо придется все-таки доосваивать Windows Core Audio APIs
Но начало вроде положено (с длинными именами устройств), попробую добить, зря чтоль старался.
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37949141
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче выложу на всяк. случай крайний вариант:
Дмитрий77Вкратце, на 7-ке и Висте это кухня глючит по части рекордера, при этом конкретно на Висте глючит по страшной.Видимо придется все-таки доосваивать Windows Core Audio APIs .
Сделал все через Windows Core Audio APIs (независимый код). Теперь на висте и 7-ке как часики. В принципе по этому методу даже в чем то проще, когда уже врубился. Не понял как делать CallBack (это когда меняешь громкость виндовыми органами) и приложение синхронно все отображает. IAudioEndpointVolume::RegisterControlChangeNotify но примеров для VB нет, метод тыка пока приводит к крашам. Да и бог с ним, не больно надо. Можно по таймеру долбить (как во французском примере), но это уж слишком просто.
Дмитрий771) waveOut(In)Open делать неправильно. Канал может оказаться заблокирован, локализован и т.п. (например моим же приложением со стороны Opal) и вместо hWaveIn будет ошибка. Причем если сразу его Close как я делаю, то на Висте (на 7-ке почему-то нет) контрол "потеряет управление".
Совершенно не обязательно открывать канал через waveOut(In)Open чтобы найти дефолтный девайс, это можно сделать не открывая канала, а потом открыть миксер по реальному индексу.
Т.е. ответ на вопрос топика Как правильно закрыть канал? будет: не надо его вообще открывать чтоб не иметь проблем .
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Function GetPreferredWaveOutDevice(id As Long, name As String) As Boolean
  'ф-ция возвращает реальные id и имя девайса, кот. Default
  Dim DWord2Ptr As Long
  Dim osError As Long
  'получаем реальный id: от 0 до count-1, либо -1 если девайсов нет
  osError = waveOutMessage(WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, VarPtr(id), VarPtr(DWord2Ptr))
  If osError = MMSYSERR_NOERROR Then
    GetWaveOutDeviceName id, name 'получаем реальное имя по реальному id
    GetPreferredWaveOutDevice = True
  Else
    GetPreferredWaveOutDevice = False
  End If
End Function[SRC vba]
  osError = mixerOpen(hmixer_spk, id, 0, 0, MIXER_OBJECTF_WAVEOUT)

MIXER_OBJECTF_WAVEOUT The uMxId parameter is the identifier of a waveform-audio output device in the range of zero to one less than the number of devices returned by the waveOutGetNumDevs function

Реальная (хотя и не очень существенная) проблема осталась одна (на XP):
Дмитрий77Вообще говоря надо убрать "поправку для микрофона"(где я ищу MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE -это только для XP надо)"
Если взглянуть в Панель управления -> Звуки и аудиоустройства -> Аудио -> запись звука -> Громкость,
то там несколько контролов: Громкость CD, Микрофон, Громк. вх. линии (источники звука для аудио карты).
Мой код всегда ищет только микрофон
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    'There is no "master" for the recording side, so need to find the
    'individual microphone input
    Dim iConn As Long
    iConn = line.cConnections
    Do While (iConn > 0)
      iConn = iConn - 1
      line.dwSource = iConn
      osError = mixerGetLineInfo(hmixer_rec, line, MIXER_GETLINEINFOF_SOURCE)
      If osError <> MMSYSERR_NOERROR Then
        Debug.Print "WinSnd" & Chr(9) & "Recorder: Failed to get mixer info, error=" & osError
      ElseIf line.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE Then
        Debug.Print "WinSnd" & Chr(9) & "Recorder: Found microphone, source=" & iConn
        Exit Do
      End If
      If iConn = 0 Then
        Debug.Print "WinSnd" & Chr(9) & "Recorder: Failed to find microphone info"
        haveControls = False
      End If
    Loop


Громкость CD, Микрофон, Громк. вх. линии
Как правило только один из них может быть выбран: отмечено "выбрать".
Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран). Нет идей как сделать?
Возможно MIXERLINE ->fdwLine
Status and support flags for the audio line. This member is always returned to the application and requires no initialization.
MIXERLINE_LINEF_ACTIVE Audio line is active. An active line indicates that a signal is probably passing through the line.
Но не уверен.
По хорошему при изменении источника (галочка "выбрать") контрол автоматически должен перестраиваться на регулировку громкости от другого источника. Вот думаю, есть ли такой волщебный флаг, или надо это отслеживать как-то.
Программу которая автоматически и без перезагрузки детектит изменение выбора источника я видел.
На висте/win7 эта проблема вообще отсутствует, там для каждого источника свой миксер.
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37949479
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Громкость CD, Микрофон, Громк. вх. линии
Как правило только один из них может быть выбран: отмечено "выбрать".
Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран).
Ну это сделал через анализ MIXERCONTROL_CONTROLTYPE_MUX.
...
Рейтинг: 0 / 0
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #37977789
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Дмитрий77Громкость CD, Микрофон, Громк. вх. линии
Как правило только один из них может быть выбран: отмечено "выбрать".
Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран).
Ну это сделал через анализ MIXERCONTROL_CONTROLTYPE_MUX.
А никто мне этот крайний кусок кода не покритикует? Где я с MUX вожусь.
Пример который sound_my9.zip якобы работал безупречно (сам по себе), но при добавлении в проект где использую Opal API стал безбожно глючить (только на XP) самым непонятным и случайным образом. То вроде запускается, то память не может быть read, OutOfMemory, ошибки в ntdll.dll.
И все это без каких либо закономерностей.
Все же понял что напортачил с MUX.
И даже "исправил" двумя заменами типа
Код: vbnet
1.
hMem = GlobalAlloc(&H40, Len(mxcdlt(0)) * mxcd.item) '???

на
Код: vbnet
1.
hMem = GlobalAlloc(&H40, Len(mxcdlt(0)) * (mxcd.item + 1)) '???


Но мне казалось что и как было нормально. Что сделал не понял, ну т.е. понял что захапал памяти с перестраховкой и это возможно спасло.

Вот полный "сомнительный" код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
    Dim haveControls As Boolean
    haveControls = True

    Dim controls As MIXERLINECONTROLS
    Dim ctrl_mux_rec As MIXERCONTROL
    Dim hMem As Long
    
    'There is no "master" for the recording side, so need to find the
    'single selected input or at least individual microphone input
    
    '1) Attempt to find currently selected input
    ctrl_mux_rec.cbStruct = Len(ctrl_mux_rec)
    controls.cbStruct = Len(controls)
    controls.dwLineID = line.dwLineID
    controls.dwControl = MIXERCONTROL_CONTROLTYPE_MUX
    controls.cControls = 1
    'Allocate memory to hold mixercontrol info
    hMem = GlobalAlloc(&H40, Len(ctrl_mux_rec))
    'Set the pointer to allocated memory
    controls.pamxctrl = GlobalLock(hMem)
    controls.cbmxctrl = ctrl_mux_rec.cbStruct
    osError = mixerGetLineControls(hmixer_rec, controls, _
              MIXER_OBJECTF_HMIXER Or MIXER_GETLINECONTROLSF_ONEBYTYPE)
    If osError = MMSYSERR_NOERROR Then
      'Copy the control into the destination structure
      CopyStructFromPtr ctrl_mux_rec, controls.pamxctrl, Len(ctrl_mux_rec)
      GlobalFree (hMem)

      Dim mxcd As MIXERCONTROLDETAILS
      Dim mxcdb() As MIXERCONTROLDETAILS_BOOLEAN
      Dim mxcdlt() As MIXERCONTROLDETAILS_LISTTEXT
      ReDim mxcdlt(ctrl_mux_rec.cMultipleItems - 1)
      ReDim mxcdb(ctrl_mux_rec.cMultipleItems - 1)
      With mxcd
        .cbStruct = Len(mxcd)
        .dwControlID = ctrl_mux_rec.dwControlID
        .cChannels = 1
        .item = ctrl_mux_rec.cMultipleItems
        hMem = GlobalAlloc(&H40, Len(mxcdlt(0)) * (mxcd.item + 1)) '???
        .paDetails = GlobalLock(hMem)
        .cbDetails = Len(mxcdlt(0))
      End With
      ' Get the control list text items (input lines id's)
      osError = mixerGetControlDetails(hmixer_rec, mxcd, _
       MIXER_OBJECTF_HMIXER Or MIXER_GETCONTROLDETAILSF_LISTTEXT)
      If osError = MMSYSERR_NOERROR Then
        ' Copy the data into the control value buffer
        CopyStructFromPtr mxcdlt(0), mxcd.paDetails, Len(mxcdlt(0)) * mxcd.item
        ' Free allocated memory
        GlobalFree (hMem)

        mxcd.cbDetails = Len(mxcdb(0))
        hMem = GlobalAlloc(&H40, Len(mxcdb(0)) * (mxcd.item + 1)) '???
        mxcd.paDetails = GlobalLock(hMem)
        ' Get the control values for line states (selected/not selected)
        osError = mixerGetControlDetails(hmixer_rec, mxcd, _
         MIXER_OBJECTF_HMIXER Or MIXER_GETCONTROLDETAILSF_VALUE)
        If osError = MMSYSERR_NOERROR Then
          ' Copy the data into the control value buffer
          CopyStructFromPtr mxcdb(0), mxcd.paDetails, Len(mxcdb(0)) * mxcd.item
          ' Free allocated memory
          GlobalFree (hMem)

          Dim iItem As Long
          iItem = mxcd.item
          Do While iItem > 0
            iItem = iItem - 1
            line.dwLineID = mxcdlt(iItem).dwParam1
            osError = mixerGetLineInfo(hmixer_rec, line, MIXER_OBJECTF_HMIXER Or MIXER_GETLINEINFOF_LINEID)
            If osError <> MMSYSERR_NOERROR Then
              If DebugEnable Then _
               AddDebugInfo "WinSnd Recorder: Failed to get mixer info, error=" & osError, True
            Else
              If mxcdb(iItem).fValue = 1 Then
                If DebugEnable Then _
                 AddDebugInfo "WinSnd Recorder: Found selected input device: " & devicename(line.szName), True
                Exit Do
              End If
              If iItem = 0 Then
                If DebugEnable Then _
                 AddDebugInfo "WinSnd Recorder: Failed to find selected input device", True
                haveControls = False
              End If
            End If
          Loop
        Else
          GlobalFree (hMem)
          haveControls = False
          If DebugEnable Then _
           AddDebugInfo "WinSnd Recorder: failed to get info about states of input lines, error=" & osError, True
        End If
      Else
        GlobalFree (hMem)
        haveControls = False
        If DebugEnable Then _
         AddDebugInfo "WinSnd Recorder: failed to get info about input lines, error=" & osError, True
      End If
    Else
      GlobalFree (hMem)
      haveControls = False
      If DebugEnable Then _
       AddDebugInfo "WinSnd Recorder: failed to get mixer line mux control, error=" & osError, True
    End If
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
    #38794841
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дергать ползунком Звук (4104), Синтезатор (4100), Микрофон (4099), Громк. CD (4101), я умею. Но никак не пойму как добраться до ползунков Front, Rear и Side 8ми канальной карты. Методом тыка нашел Front (.dwComponentType = 4106). И даже Общую громкость (.dwComponentType = 4). Но вот как получить тот же Rear я пока что не знаю. Может кто подскажет куда копать?
Вообще задача в раздельном выводе звука на каждый канал 8ми к. звуковой карты.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]