Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > WinAPI
Перезагрузить страницу Как сделать звуковой микшер
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_yag_ imported_yag_ вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.04.2006
По умолчанию Как сделать звуковой микшер - 15.06.2006, 16:55

Проблема следующая. Нужно средствами WinAPI считать с системного звукового микшера винды значение ползунка громкости (например, записи или воспроизведения), установить его в нужное положение и (главное) заблокировать возможность дальнейшего изменения его положения пользователем на время работы программы.
Вопрос: не знает ли кто, как можно осуществить блокировку определённого ползунка (сделать его затенённым) в обычном виндовом звуковом микшере ("Пуск->Программы->Стандартные->Развлечения->Громкость")?

Первое, что приходит в голову, это mixerOpen(), и прочие API работы с системным микшером. Но там я не смог найти функций блокировки изменений отдельных линий/каналов/контроллов. Есть только возможность выключить линию совсем.

Смотрел пример в MSDN, в листе Q181550 нашёл вот такой код:

Код:
#include <windows.h>
    #include <mmsystem.h>

    MMRESULT rc;              // Return code.
    HMIXER hMixer;            // Mixer handle used in mixer API calls.
    MIXERCONTROL mxc;         // Holds the mixer control data.
    MIXERLINE mxl;            // Holds the mixer line data.
    MIXERLINECONTROLS mxlc;   // Obtains the mixer control.

    // Open the mixer. This opens the mixer with a deviceID of 0. If you
    // have a single sound card/mixer, then this will open it. If you have
    // multiple sound cards/mixers, the deviceIDs will be 0, 1, 2, and
    // so on.
    rc = mixerOpen(&hMixer, 0,0,0,0);
    if (MMSYSERR_NOERROR != rc) {
        // Couldn't open the mixer.
    }

    // Initialize MIXERLINE structure.
    ZeroMemory(&mxl,sizeof(mxl));
    mxl.cbStruct = sizeof(mxl);

    // Specify the line you want to get. You are getting the input line
    // here. If you want to get the output line, you need to use
    // MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT.
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;

    rc = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl,
                           MIXER_GETLINEINFOF_COMPONENTTYPE);
    if (MMSYSERR_NOERROR == rc) {
        // Couldn't get the mixer line.
    }

    // Get the control.
    ZeroMemory(&mxlc, sizeof(mxlc));
    mxlc.cbStruct = sizeof(mxlc);
    mxlc.dwLineID = mxl.dwLineID;
    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_PEAKMETER;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(mxc);
    mxlc.pamxctrl = &mxc;
    ZeroMemory(&mxc, sizeof(mxc));
    mxc.cbStruct = sizeof(mxc);
    rc = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,
                               MIXER_GETLINECONTROLSF_ONEBYTYPE);
    if (MMSYSERR_NOERROR != rc) {
        // Couldn't get the control.
    }

    // After successfully getting the peakmeter control, the volume range
    // will be specified by mxc.Bounds.lMinimum to mxc.Bounds.lMaximum.

    MIXERCONTROLDETAILS mxcd;             // Gets the control values.
    MIXERCONTROLDETAILS_SIGNED volStruct; // Gets the control values.
    long volume;                          // Holds the final volume value.

    // Initialize the MIXERCONTROLDETAILS structure
    ZeroMemory(&mxcd, sizeof(mxcd));
    mxcd.cbStruct = sizeof(mxcd);
    mxcd.cbDetails = sizeof(volStruct);
    mxcd.dwControlID = mxc.dwControlID;
    mxcd.paDetails = &volStruct;
    mxcd.cChannels = 1;

    // Get the current value of the peakmeter control. Typically, you
    // would set a timer in your program to query the volume every 10th
    // of a second or so.
    rc = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd,
                                 MIXER_GETCONTROLDETAILSF_VALUE);
    if (MMSYSERR_NOERROR != rc) {
        // Couldn't get the current volume.
    }
    volume = volStruct.lValue;

    // Get the absolute value of the volume.
    if (volume < 0)
        volume = -volume;
Но в этом коде похоже есть ошибка, у меня он не может инициализировать список контроллов, функция mixerGetLineControls() возвращается с ошибкой 0x401. Так что MSDN помог лишь отчасти.

Не слышал ли кто чего по такому поводу?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор звуковой карты PCI-E makcisayh Акустика 2 08.01.2012 08:45
Звуковой драйвер Rock Zombie Любые вопросы от новичков 6 20.11.2011 23:07
Выбор звуковой карты Weel12 Любые вопросы от новичков 13 13.09.2011 21:30
случайно отключила в "Диспетчере realtek" микшер звука и прочие настройки руслана Любые вопросы от новичков 19 07.08.2011 12:43
Не могу отключить стерео микшер на Via HD Audio Input 4070k Любые вопросы от новичков 1 09.03.2011 23:56
программу Soundmax (микшер) джон вэй Звук и акустические системы 1 03.02.2010 16:11
драйвер на звуковой asnaeb Драйвера 1 09.01.2010 16:17
Если ли микшер для XP от VISTA? CyberDemon Разное 0 21.12.2008 19:49
HELP Звуковой терор adamas Общетематический 5 19.12.2008 16:22
Как сделать, что бы на звуковой карте Genius CMI8738/C3DX 5.1 были эквалайзеры? CyberDemon Техническая поддержка 3 20.11.2008 20:21
Проблемы в звуковой карте Lamkin Звук и акустические системы 6 21.08.2008 19:46
Возможности звуковой Валера Звук и акустические системы 2 18.05.2008 00:39



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов