Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.05.2015, 14:24   #1
egorchik73
Новичок
Джуниор
 
Регистрация: 01.05.2015
Сообщений: 2
По умолчанию Как получить общий уровень звука системы?

Можно ли в Delphi отследить уровень воспроизводимого системой Windows 7 звука.
Например, пока играет тихая спокойная фоновая музыка с низким уровнем воспроизведении, то ничего не делаем, но если в музыке происходит резкий всплеск уровня (например ударили в барабаны), или другая программа (например Скайп) резко зазвонила, то запрограммировать какое либо СОБЫТИЕ-1.
Есть ли функция, которая возвращала бы общий уровень звука воспроизводимого несколькими приложениями Windows 7 в данный момент?

Что-то наподобие:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
   x := (Функция возвращающая общий уровень звука посылаемого на аудио-выход в децибелах);
end;

Последний раз редактировалось Stilet; 01.05.2015 в 14:52.
egorchik73 вне форума Ответить с цитированием
Старый 01.05.2015, 15:32   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

В Windows 7 отдельная регулировка уровня громкости для каждого приложения. Копайте в сторону работы с микшером в Windows 7.
Streletz вне форума Ответить с цитированием
Старый 01.05.2015, 17:42   #3
egorchik73
Новичок
Джуниор
 
Регистрация: 01.05.2015
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
В Windows 7 отдельная регулировка уровня громкости для каждого приложения. Копайте в сторону работы с микшером в Windows 7.
Да, но ведь все равно выход-то на динамики один. И регулировка громкости есть основная в микшере, все остальные дополнительные. Мне нужна вроде бы по сути простая функция, которая возвратит уровень сигнала в децибелах, который подается на выход на динамики. Искал долго в Инете но так ничего подходящего и не нашел. Хотя в самой Windows 7 если открыть микшер, во время воспроизведения там графически отображается прыгающая полоска с уровнем звука. Вот как ее захватить бы?
egorchik73 вне форума Ответить с цитированием
Старый 01.05.2015, 18:09   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от egorchik73 Посмотреть сообщение
Искал долго в Инете но так ничего подходящего и не нашел. Хотя в самой Windows 7 если открыть микшер, во время воспроизведения там графически отображается прыгающая полоска с уровнем звука. Вот как ее захватить бы?
По идее, до текущего уровня сигнала можно достучаться через WinAPI.
Streletz вне форума Ответить с цитированием
Старый 03.05.2015, 17:42   #5
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию Нашёл пример на API

Код:
unsigned int GetWaveVolume(void)
{
        WAVEOUTCAPSA Woc;
        DWORD Volume ;
        if(waveOutGetDevCapsA(WAVE_MAPPER, &Woc, sizeof(Woc)) ==MMSYSERR_NOERROR)
                if(Woc.dwSupport && WAVECAPS_VOLUME == WAVECAPS_VOLUME)
                        waveOutGetVolume((void*)WAVE_MAPPER, &Volume);
        return Volume;
}
void SetVolume(unsigned int SetVolume)
{
        WAVEOUTCAPSA Woc;
        DWORD Volume ;
        if(waveOutGetDevCapsA(WAVE_MAPPER, &Woc, sizeof(Woc)) ==MMSYSERR_NOERROR)
                if(Woc.dwSupport && WAVECAPS_VOLUME == WAVECAPS_VOLUME)
                        waveOutSetVolume((void*)WAVE_MAPPER, SetVolume);
}
 
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
        Form1->TrackBar1->Position=GetWaveVolume()>>16;
        Form1->TrackBar2->Position=GetWaveVolume()&0x0000FFFF;
}
 
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
        SetVolume(MAKELONG(Form1->TrackBar1->Position,Form1->TrackBar2->Position));
}
 
void __fastcall TForm1::TrackBar2Change(TObject *Sender)
{
        SetVolume(MAKELONG(Form1->TrackBar1->Position,Form1->TrackBar2->Position));
}
для борладн билдера интерфейс. два трэкбара- правый и левый каналы.
Для Delphi тоже самое, только перевести все в pascal представление

Если же нужно анализировать сам сигнал (системная громкость будет одна и та же, а уровень звука будет меняться)
тогда уже нужно использовать преобразование Фурье....
Брать кусочками звук в буфер - анализировать и вычислять уровень

Где-то у меня пример такой проги был, если найду - выложу

Прогу не нашёл, но вот что есть про анализ сигналов

http://lightportal.at.ua/publ/cvetom...n_api/3-1-0-72

Последний раз редактировалось knight; 03.05.2015 в 17:53.
knight вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить доступ к свойствам звука Windows Freddy_Kruger Мультимедиа в Delphi 4 25.04.2011 13:50
Кто знает как реализовать уровень звука у медиа плеера? Virus25 Мультимедиа в Delphi 1 01.02.2010 02:30
Уровень Звука в Media Player Cvin Мультимедиа в Delphi 2 13.12.2009 21:27
Как получить с помощью функции автоматического вычисления итогов общий итог внизу таблицы prikolist Microsoft Office Excel 2 01.12.2008 13:10
Текущий уровень звука ! XuMuK Win Api 3 11.10.2007 10:25