увеличение громкости звука программно

Тема в разделе "WASM.WIN32", создана пользователем CyberMerlin, 9 июл 2007.

  1. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    ребят, подсобите плиз
    хочу увеличивать громкость на сколько позволяет звуковая карта и НЕ позволяет виндовс регулятор в трее висящий.
    т.е. чтоб в трее установлено на максимум, а я мог бы еще громче своей прогулинкой делать звук...

    возможно же вообще такое? кажется можно, но не знаю как..

    PS. понимаю немного Асмовый код и Delphi
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    а зачем это нужно?
    купи новую АС помощнее. так будет лучше.
     
  3. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    на работе не хоцца
    колонки особо громко не включишь
    а наушники - не тянет

    а у меня все равно свой плеер написан, так хоть доапдейтю :)
     
  4. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Код (Text):
    1. //////////////////////////////////////////////////////////////////////
    2. // Volume Controler
    3. // by Whoo(whoo@isWhoo.com)
    4. // Oct.1 2001
    5.  
    6. //////////////////////////////////////////////////////////////////////
    7. // Mixer.cpp: implementation of the CMixer class.
    8. //
    9. //////////////////////////////////////////////////////////////////////
    10.  
    11. #include "stdafx.h"
    12. #include "Mixer.h"
    13.  
    14. #include <mmsystem.h>
    15.  
    16. #ifdef _DEBUG
    17. #undef THIS_FILE
    18. static char THIS_FILE[]=__FILE__;
    19. #define new DEBUG_NEW
    20. #endif
    21.  
    22. //////////////////////////////////////////////////////////////////////
    23. // Construction/Destruction
    24. //////////////////////////////////////////////////////////////////////
    25.  
    26.  
    27.  
    28. CMixer::~CMixer()
    29. {
    30.  
    31. }
    32.  
    33. #undef FAILED
    34. #define FAILED(X) (MMSYSERR_NOERROR != X)
    35. /////////////////////////////////////////////////
    36. //  Component: value from dwComponentType member of MIXERLINE, eg://    MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
    37. //  Kind : 0 Wave ouput tunnle, 1 Wave input tunle, 2... other.
    38. CMixer::CMixer(DWORD ComponentType, DestKind dkKind): m_dwControlID(-1), m_bOK(false), m_dwChannels(0)
    39. {
    40.     HMIXER hMixer;
    41.     HRESULT hr;
    42.     hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    43.     if (FAILED(hr)) return;
    44.  
    45.     MIXERLINE mxl;
    46.     MIXERCONTROL mc;
    47.     MIXERLINECONTROLS mxlc;
    48.     DWORD kind, count;
    49.  
    50.     if (dkKind == Play)
    51.         kind = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
    52.     else
    53.         kind = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
    54.  
    55.     mxl.cbStruct = sizeof(mxl);
    56.     mxl.dwComponentType = kind;
    57.  
    58.     hr = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
    59.     if (FAILED(hr))
    60.     {
    61.         mixerClose(hMixer);
    62.         return;
    63.     }
    64.  
    65.     count = mxl.dwSource;
    66.     for(UINT i = 0; i < count; i++)
    67.     {
    68.         mxl.dwSource = i;
    69.         mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_GETLINEINFOF_SOURCE);
    70.         if (mxl.dwComponentType == ComponentType)
    71.         {
    72.             m_dwChannels = mxl.cChannels;
    73.             mc.cbStruct = sizeof(mc);
    74.             mxlc.cbStruct = sizeof(mxlc);
    75.             mxlc.dwLineID = mxl.dwLineID;
    76.             mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    77.             mxlc.cControls = 1;
    78.             mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    79.             mxlc.pamxctrl = &mc;
    80.             hr = mixerGetLineControls((HMIXEROBJ)hMixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
    81.             m_dwControlID = mc.dwControlID;
    82.             break;
    83.         };
    84.     }
    85.     mixerClose(hMixer);
    86.     m_bOK = true;
    87. }
    88.  
    89. void CMixer::SetVolume(DWORD dwVol)
    90. {
    91.     if (!m_bOK) return;
    92.     HMIXER hMixer;
    93.     HRESULT hr;
    94.     hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    95.     if (FAILED(hr)) return;
    96.  
    97.     MIXERCONTROLDETAILS mxcd;
    98.     MIXERCONTROLDETAILS_UNSIGNED mxdu;
    99.  
    100.     mxdu.dwValue = dwVol;
    101.  
    102.     mxcd.cMultipleItems = 0;
    103.     mxcd.cChannels = m_dwChannels;
    104.     mxcd.cbStruct = sizeof(mxcd);
    105.     mxcd.dwControlID = m_dwControlID;
    106.     mxcd.cbDetails = sizeof(mxdu);
    107.     mxcd.paDetails = &mxdu;
    108.     hr = mixerSetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); 
    109.    
    110.     mixerClose(hMixer);
    111. }
    112.  
    113. DWORD CMixer::GetVolume()
    114. {
    115.     if (!m_bOK) return 0;
    116.     HMIXER hMixer;
    117.     HRESULT hr;
    118.     hr = mixerOpen(&hMixer, 0, 0, 0, 0);
    119.     if (FAILED(hr)) return 0;
    120.  
    121.     MIXERCONTROLDETAILS mxcd;
    122.     MIXERCONTROLDETAILS_UNSIGNED mxdu;
    123.  
    124.  
    125.     mxcd.cMultipleItems = 0;
    126.     mxcd.cChannels = m_dwChannels;
    127.     mxcd.cbStruct = sizeof(mxcd);
    128.     mxcd.dwControlID = m_dwControlID;
    129.     mxcd.cbDetails = sizeof(mxdu);
    130.     mxcd.paDetails = &mxdu;
    131.     hr = mixerGetControlDetails((HMIXEROBJ)hMixer, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE); 
    132.    
    133.     mixerClose(hMixer);
    134.     return mxdu.dwValue;
    135. }
     
  5. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    mixerSetControlDetails
    API функция - реализующая регулирование громкости audio - иконка висит в трее

    PS все равно спасибо, что не оставляете без ответов

    вообще хотелось бы что-то типо управление через драйвер звуковой или другой вариант (последнее будет сложнее - не представляю даже на сколько)
     
  6. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    никто не работал со звуком на аппаратном уровне? :dntknw:
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    CyberMerlin
    А откуда вообще сведения, что миксер не позволяет обеспечить полный диапазон регулировок? ни разу про это не слышал :)
     
  8. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    винамп запустил и в настройках dll wavoOut установил регулировка громкости
    в итоге громность почти на порядок больше была

    а если любым другим плеером слушать музыку (в том числе и моим) выставив звук на максимум виндовыми средствами - звук недотягивает тех высот - полученных винамповым драйвом
     
  9. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Может ошибаюсь, но в Winamp реализована функция усиления/ослабления звука 'preamp' в диапазоне -12...+12 dB. Думается, надо копать в ту же сторону - программно модифицировать саму звуковую волну перед записью в буфер.
     
  10. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    хм
    а это девстивтельно идея
    ... и почему я недогадался сразу так же делать

    спасиб большое, пойду трудиться


    ОДНАКО, хотелось бы знать вообще возможно управление девайсом в этом направлении (регулировка громкости звука) минуя API ?
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    CyberMerlin
    Сдаётся мне, что дело в таком случае вовсе не в управлении девайсом :)))
    Просто при записи\кодировании или кривом декодировании (частенько бывает когда вовремя не обновил кодек) звуковые данные могут иметь диапазон не +-32767, а допустим +-1000 и сколько регуляторы ни крути, громче чем он есть не станет :))
    А сделать его громче можно сотворив АРУЗ (авторегулятор уровня звука) - ищешь максимальное (пиковое) значение звука во всём файле, считаешь коэффициент приведения этого уровня к 32767 и множишь на этот коэффициент все выборки - и будет тебе счастие :)
    ЗЫ: а драйвера для этого вовсе не обязательно ковырять - вполне достаточно АПИ уровня ;)
     
  12. CyberMerlin

    CyberMerlin New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    69
    Y_Mur
    А сделать его громче можно сотворив АРУЗ (авторегулятор уровня звука)
    это как раз то о чем писал roman_pro... ну да ладненько

    ну раз у нас так красивенько все получается в этой ветке
    есть инфа о обработке звука на таком уровне?
    все что я нашел - работа с использофанием API и activemove ms windows'a
    я же хочу в программе самостоятельно обрабатывать звук

    и кодировать не только mp3, но и другие форматы.

    Если есть инфа, не обделите плиз вниманием, буду признателен
    если на мыло могете сослать - CyberMerlin.xaker.ru с пометкой ЗВУК