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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2009, 17:10   #1
dyonysos
Пользователь
 
Регистрация: 24.08.2009
Сообщений: 45
Вопрос громкость звука (делфи)

у меня на клавиатуре ести кнопки управления звуком( vol+ vol- mute).но пользоватся ими не совсем удобно. в программе Mkey видел что когда меняешь громкость появляется progress bar где отображается уровень громкости.теперь хочу написать что-то похожее: программа будет висеть в трее аа окно с прогресс бар-ом будет появлатся только при изменении громкости и потом исчезать через 3 секунды.

Вопрос:

1. каким образом можно узнать что громкость меняется( чтобы сразу показать прогресс бар)?
2. как узнать текущую громкость чтобы показать ее в прогресс бар-е?

вопросы наверное глупые,но я новичок так что сильно не ругайте.
dyonysos вне форума Ответить с цитированием
Старый 27.12.2009, 17:43   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

http://www.programmersforum.ru/showthread.php?t=37478
и связываешь с прогрессом.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 27.12.2009, 17:46   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот код:
Код:
Unit MPVolume;
Interface
uses
  MPlayer;

function GetMPVolume(MP: TMediaPlayer): Integer;
procedure SetMPVolume(MP: TMediaPlayer; Volume: Integer);

Implementation
uses
  MMSystem;

const

  MCI_SETAUDIO = $0873;
  MCI_DGV_SETAUDIO_VOLUME = $4002;
  MCI_DGV_SETAUDIO_ITEM = $00800000;
  MCI_DGV_SETAUDIO_VALUE = $01000000;
  MCI_DGV_STATUS_VOLUME = $4019;

type
  MCI_DGV_SETAUDIO_PARMS = record
    dwCallback: DWORD;
    dwItem: DWORD;
    dwValue: DWORD;
    dwOver: DWORD;
    lpstrAlgorithm: PChar;
    lpstrQuality: PChar;
  end;

type

  MCI_STATUS_PARMS = record
    dwCallback: DWORD;
    dwReturn: DWORD;
    dwItem: DWORD;
    dwTrack: DWORD;
  end;

procedure SetMPVolume(MP: TMediaPlayer; Volume: Integer);
  { Volume 0 - 1000 !!!}
var
  MP_PARAMS: MCI_DGV_SETAUDIO_PARMS;
begin
  MP_PARAMS.dwCallback := 0;
  MP_PARAMS.dwItem := MCI_DGV_SETAUDIO_VOLUME;
  MP_PARAMS.dwValue := Volume;
  MP_PARAMS.dwOver := 0;
  MP_PARAMS.lpstrAlgorithm := nil;
  MP_PARAMS.lpstrQuality := nil;
  mciSendCommand(MP.DeviceID, MCI_SETAUDIO,
    MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM, Cardinal(@MP_PARAMS));
end;

function GetMPVolume(MP: TMediaPlayer): Integer;
var 
  MP_PARAMS: MCI_STATUS_PARMS;
begin
  MP_PARAMS.dwCallback := 0;
  MP_PARAMS.dwItem := MCI_DGV_STATUS_VOLUME;
  mciSendCommand(MP.DeviceID, MCI_STATUS, MCI_STATUS_ITEM, Cardinal(@MP_PARAMS));
  Result := MP_PARAMS.dwReturn; 
end;

end.
А вот сама ссылка http://forum.shelek.ru/index.php/topic,10802.0.html
Думаю, что это то, что тебе нужно )
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 27.12.2009, 23:09   #4
dyonysos
Пользователь
 
Регистрация: 24.08.2009
Сообщений: 45
По умолчанию

вот этот код:
Код:
 procedure SetVolume(const volL, volR: Word);
 var
   hWO: HWAVEOUT;
   waveF: TWAVEFORMATEX;
   vol: DWORD;
 begin
   // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
   // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
   vol := volL + volR shl 16;
   // set volume
  waveOutSetVolume(hWO, vol);
   waveOutClose(hWO);
 end;
не работает!
у меня стоит виндоус 7...
dyonysos вне форума Ответить с цитированием
Старый 28.12.2009, 05:28   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А тот код, что я привел, работает?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 28.12.2009, 08:04   #6
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Код:
usee MMSystem
procedure SetWaveVolume(const AVolume: DWord);
begin
 WaveOUtSetVolume(0,AVolume);
end;

procedure TForm2.TrackBar1Change(Sender: TObject);
begin
 SetWaveVolume(MakeLong(TrackBar1.Position*255,TrackBar2.Position*255));
end;

procedure TForm2.TrackBar2Change(Sender: TObject);
begin
 SetWaveVolume(MakeLong(TrackBar1.Position*255,TrackBar2.Position*255));
end;
ну а прогресс бар привяжите к трэк бару
Вложения
Тип файла: zip Volume.zip (207.9 Кб, 134 просмотров)
SERG1980 вне форума Ответить с цитированием
Старый 28.12.2009, 16:28   #7
dyonysos
Пользователь
 
Регистрация: 24.08.2009
Сообщений: 45
По умолчанию

SERG1980 - как удалось выяснить этот код работатет на экспи а на семерке WaveOUtSetVolume не хочет работать! в чем дело?

artemavd- нет это не то что мне нужно.я хочу регулировать громкость всей системы,а как я понял твой пример регулирует громкость компонента tmediaplayer.

нашел на мсдн-е GetMasterVolume и SetMasterVolume. но они находятся в Audioclient.h. ее можно подключить к проэкту и использовать функции? ( через uses не хочет)

Последний раз редактировалось dyonysos; 28.12.2009 в 22:32.
dyonysos вне форума Ответить с цитированием
Старый 28.02.2010, 19:27   #8
FelixKoT
Пользователь
 
Аватар для FelixKoT
 
Регистрация: 07.01.2010
Сообщений: 28
По умолчанию

Насколько я понял, *.h это файл С++..
Цитата:
на семерке WaveOUtSetVolume не хочет работать!
работает на семёрке, только меняет громкость не всего звука, а только громкость своего приложения.. Никто не знает как сменить для всей системы?
FelixKoT вне форума Ответить с цитированием
Старый 18.01.2024, 17:16   #9
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

исходники сверху не работают.
-----------
рыская по другим форумам, нашёл, что можно переделать файлы *.h в нужные *.pas, но с точностью 80% (что-то в конвертерах не всё продумано).
-----------
нашёл на просторах Инета работающую программу и код к ней.
есть вот такой код на ассемблере (см. приложенный файл).
скомпилированная программа работает как надо - меняет звук во всей системе.
осталось как-то корректно переделать это код на Pascal.
---------
мне же надо всего-навсего из этого "компота" функцию, чтоб установить громкость системы на максимум.
Вложения
Тип файла: txt volume_control.txt (8.9 Кб, 1 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 18.01.2024 в 21:10.
NetSpace вне форума Ответить с цитированием
Старый 18.01.2024, 20:25   #10
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

пытаясь, перевести этот код из приложенного вверху файла на Delphi, столкнулся с рядом проблем.
пытаясь выйти на методы интерфейса IAudioEndpointVolume, для начала хотел получить интерфейс дефолтного звукового устройства, чтоб после активировать его. после чего будет доступ к функциям управления звуком.
это код на асм'е
Код:
invoke  CoInitialize,NULL
 
        ; Создать объект
        invoke  CoCreateInstance,CLSID_MMDeviceEnumerator,NULL,\
                CLSCTX_INPROC_SERVER,\
                IID_IMMDeviceEnumerator,deviceEnumerator
 
        ; Инициализировать объект
        mov     eax, [deviceEnumerator]
        mov     eax, [eax]
        stdcall [eax+IMMDeviceEnumerator.GetDefaultAudioEndpoint],\
                [deviceEnumerator],[eRender],[eConsole],defaultDevice
 
        mov     eax, [deviceEnumerator]
        mov     eax, [eax]
        stdcall [eax+IMMDeviceEnumerator.Release],[deviceEnumerator]
 
        mov     eax, [defaultDevice]
        mov     eax, [eax]
        stdcall [eax+IMMDevice.Activate],[defaultDevice],\
                IID_IAudioEndpointVolume,CLSCTX_INPROC_SERVER,\
                NULL,endpointVolume
 
        mov     eax, [defaultDevice]
        mov     eax, [eax]
        stdcall [eax+IMMDevice.Release],[defaultDevice]
пытаюсь перевести на Delphi
Код:
unit Volumes;
interface
uses  Windows,Classes,Controls,ActiveX,Forms,OleServer,MMSystem,StdCtrls;
const
   CLSID_MMDeviceEnumerator:TGUID='{BCDE0395-E52F-467C-8E3D-C4579291692E}';
   IID_IMMDeviceEnumerator:TGUID='{A95664D2-9614-4F35-A746-DE8DB63617E6}';
   IID_IAudioEndpointVolume:TGUID='{5CDF2C82-841E-4546-9722-0CF74078229A}';
  DEVICE_STATE_ACTIVE = $00000001;
  DEVICE_STATE_UNPLUGGED = $00000002;
  DEVICE_STATE_NOTPRESENT = $00000004;
  DEVICE_STATEMASK_ALL = $00000007;

type
  EDataFlow = TOleEnum;

const
  eRender = $00000000;
  eCapture = $00000001;
  eAll = $00000002;
  EDataFlow_enum_count = $00000003;

type
  ERole = TOleEnum;

const
  eConsole = $00000000;
  eMultimedia = $00000001;
  eCommunications = $00000002;
  ERole_enum_count = $00000003;

type
  IAudioEndpointVolumeCallback = interface(IUnknown)
  end;
  IAudioEndpointVolume = interface(IUnknown)
  end;
  IAudioMeterInformation = interface(IUnknown)
  end;
  IPropertyStore = interface(IUnknown)
  end;
  IMMDevice = interface(IUnknown)
    function Activate(const refId: TGUID; dwClsCtx: DWORD; pActivationParams: PInteger; out pEndpointVolume: IAudioEndpointVolume): HRESULT; stdCall;
    function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): HRESULT; stdcall;
    function GetId(out ppstrId: PWideChar): HRESULT; stdcall;
  end;
  IMMDeviceCollection = interface(IUnknown)
    function GetCount(out pcDevices: UINT): HRESULT; stdcall;
    function Item(nDevice: UINT; out ppDevice: IMMDevice): HRESULT; stdcall;
  end;
IMMDeviceEnumerator = interface(IUnknown)
    function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; out DevCollection: IMMDeviceCollection): HRESULT; stdcall;
end;    

type TForm1 = class(TForm)
     Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
     private
     public
end;

var Form1:TForm1;
implementation
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var AudioEndpoints:IMMDeviceEnumerator;
    Collection:IMMDeviceCollection;
    Device:IMMDevice;
    Id_Dev:PWideChar;
    ID_Dev_Def:WideString;
begin
   CoCreateInstance(CLSID_MMDeviceEnumerator,nil,CLSCTX_INPROC_SERVER,IID_IMMDeviceEnumerator,AudioEndpoints);
   AudioEndpoints.EnumAudioEndpoints(eRender,DEVICE_STATE_ACTIVE,Collection);
   Collection.Item(1,Device);
   //memo1.Lines.Add(IntToStr(Collection.Item(1,Device)));
   //Device.GetId(Id_Dev);
  // ID_Dev_Def:=Id_Dev;

end;

end.
но выходит и ошибка - две последние строки пришлось закоментировать.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повысить громкость раза в 3. Alex Cones Софт 7 23.10.2009 04:13
Плавно увеличить громкость KurtWagner Общие вопросы Delphi 10 02.02.2009 10:37
Повышаем громкость Veiron Свободное общение 9 29.05.2008 20:40
Системная громкость ЧИЖ Win Api 3 22.08.2007 21:23
Громкость в MediaPlayer D-fens Компоненты Delphi 3 12.06.2007 13:13