purebasic.info

PureBasic forum
Текущее время: Пт авг 23, 2019 12:17 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Получить системную громкость
СообщениеДобавлено: Сб июл 13, 2019 11:42 pm 
Не в сети
док

Зарегистрирован: Пн авг 23, 2010 12:25 am
Сообщений: 116
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Как получить системную громкость?
Побывал так:
Код:
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
 
Structure MIXERCONTROL
        cbStruct.l
        dwControlID.l
        dwControlType.l
        fdwControl.l
        cMultipleItems.l
        szShortName.b[#MIXER_SHORT_NAME_CHARS]
        szName.b[#MIXER_LONG_NAME_CHARS];
        lMinimum.l
        lMaximum.l
        dwMinimum.l
        dwMaximum.l
        Reserved.l[6];
        cSteps.l
        cbCustomData.l;
        dwReserved.l[6];
EndStructure
 
Procedure GetVolume()
        Protected Volume.l
        If mixerOpen_(@hMixer.l, 0, 0, 0, 0) = #NO_ERROR
                MxLine.MIXERLINE
                MxLine\cbStruct = SizeOf(MIXERLINE)
                MxLine\dwComponentType = #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
                If mixerGetLineInfo_(hMixer, @MxLine, 3) = #NO_ERROR
                        MxLineCtrls.MIXERLINECONTROLS
                        MxCtrl.MIXERCONTROL
                        MxLineCtrls\cbStruct = SizeOf(MIXERLINECONTROLS)
                        MxLineCtrls\dwLineID = MxLine\dwLineID
                        MxLineCtrls\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME
                        MxLineCtrls\cControls = 1
                        MxLineCtrls\cbmxctrl = SizeOf(MIXERCONTROL)
                        MxLineCtrls\pamxctrl = @MxCtrl
                        If mixerGetLineControls_(hMixer, @MxLineCtrls, #MIXER_GETLINECONTROLSF_ONEBYTYPE) = #NO_ERROR
                                MxCtrlDetails.MIXERCONTROLDETAILS
                                MxCtrlDetails\cbStruct = SizeOf(MIXERCONTROLDETAILS)
                                MxCtrlDetails\dwControlID = MxCtrl\dwControlID
                                MxCtrlDetails\cChannels = 1
                                MxCtrlDetails\cbDetails = SizeOf(Long)
                                MxCtrlDetails\paDetails = @val.l
                                If mixerGetControlDetails_(hMixer, @MxCtrlDetails, #MIXER_OBJECTF_MIXER) = #NO_ERROR
                                        Volume.l = 100 * (val - MxCtrl\lMinimum) / (MxCtrl\lMaximum - MxCtrl\lMinimum)
                                EndIf
                        EndIf
                EndIf
                mixerClose_(hMixer)
        EndIf
        ProcedureReturn Volume
EndProcedure
 
Debug GetVolume()
 



Похоже это работает только в XP, на более поздних окнах все время выдает 100%-ю громкость.


Последний раз редактировалось asdf8 Вс июл 14, 2019 8:39 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Вс июл 14, 2019 7:38 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6539
Благодарил (а): 28 раз.
Поблагодарили: 220 раз.
Пункты репутации: 57
Работает от Висты и новее:
Код:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
 
#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10
 
#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
 
Interface IMMDeviceEnumerator Extends IUnknown
  EnumAudioEndpoints(dataFlow, dwStateMask, *ppDevices);
  GetDefaultAudioEndpoint(dataFlow, role, ppEndpoint);
  GetDevice(pwstrId, ppDevice);
  RegisterEndpointNotificationCallback(pClient);
  UnregisterEndpointNotificationCallback(pClient);
EndInterface
 
Interface IAudioEndpointVolume Extends IUnknown
  RegisterControlChangeNotify( *pNotify)
  UnregisterControlChangeNotify( *pNotify)
  GetChannelCount( *pnChannelCount)
  SetMasterVolumeLevel( fLevelDB.f)
  SetMasterVolumeLevelScalar( fLevel.f,pguidEventContext)
  GetMasterVolumeLevel(*pfLevelDB)
  GetMasterVolumeLevelScalar(*pfLevel)
  SetChannelVolumeLevel(nChannel,fLevelDB.f,pguidEventContext)
  SetChannelVolumeLevelScalar( nChannel,fLevel.f,pguidEventContext)
  GetChannelVolumeLevel( nChannel,*pfLevelDB.f)
  GetChannelVolumeLevelScalar( nChannel,*pfLevel.f)
  SetMute( bMute, pguidEventContext)
  GetMute( *pbMute)
  GetVolumeStepInfo( *pnStep, *pnStepCount)
  VolumeStepUp( pguidEventContext)
  VolumeStepDown( pguidEventContext)
  QueryHardwareSupport( *pdwHardwareSupportMask)
  GetVolumeRange( *pflVolumeMindB, *pflVolumeMaxdB, *pflVolumeIncrementdB)
EndInterface
 
Interface IMMDevice Extends IUnknown
  Activate(iid, dwClsCtx, pActivationParams, ppInterface);
  OpenPropertyStore( stgmAccess, ppProperties);
  GetId(ppstrId);
  GetState(pdwState);
EndInterface
 
Procedure GetEndPointVolume(*endpointvolume)
  Protected deviceEnumerator.IMMDeviceEnumerator
  Protected hr, defaultDevice.IMMDevice
 
  CoInitialize_(#Null)
 
  hr = CoCreateInstance_(?uuidof_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?uuidof_IMMDeviceEnumerator,@deviceEnumerator);#CLSCTX_ALL
 
  hr = deviceEnumerator\GetDefaultAudioEndpoint(0, 1, @defaultDevice)
  deviceEnumerator\Release()
 
  hr = defaultDevice\Activate(?uuidof_IAudioEndpointVolume, #CLSCTX_INPROC_SERVER, #Null, *endpointVolume);
  defaultDevice\release()
 
  ProcedureReturn *endpointvolume
EndProcedure
 
Procedure FreeEndPointVolume(*endpointvolume.IAudioEndpointVolume)
  *endpointvolume\release()
  CoUninitialize_()
EndProcedure
 
Procedure MediaGetVolume()
  Protected Volume.IAudioEndpointVolume
  Protected volf.f
 
  GetEndPointVolume(@Volume)
  Volume\GetMasterVolumeLevelScalar(@volf)
  volf = Round(volf * 100, #PB_Round_Nearest)
  FreeEndPointVolume(Volume)
  ProcedureReturn Int(volf)
EndProcedure
 
Procedure MediaSetVolume(vol)
  Protected Volume.IAudioEndpointVolume
  Protected volf.f
  If vol < 0 : vol = 0 : EndIf
  If vol > 100 : vol = 100 : EndIf
  GetEndPointVolume(@Volume)
  volf = vol / 100
  Volume\SetMasterVolumeLevelScalar(volf, #Null)
  FreeEndPointVolume(Volume)
EndProcedure
 
DataSection
  uuidof_IAudioEndpointVolume:
 Data.l $5CDF2C82
  Data.w $841E,$4546
  Data.b $97,$22,$0C,$F7,$40,$78,$22,$9A
 
  uuidof_MMDeviceEnumerator:
 Data.l $BCDE0395
  Data.w $E52F,$467C
  Data.b $8E,$3D,$C4,$57,$92,$91,$69,$2E
 
  uuidof_IMMDeviceEnumerator:
 Data.l $A95664D2
  Data.w $9614
  Data.w $4F35
  Data.b $A7,$46,$DE,$8D,$B6,$36,$17,$E6
 
EndDataSection
 
; Test
volOld = MediaGetVolume()
 
MediaSetVolume(10)
Debug MediaGetVolume()
Delay(3000)
MediaSetVolume(volOld)
 
 
 


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Вс июл 14, 2019 8:40 am 
Не в сети
док

Зарегистрирован: Пн авг 23, 2010 12:25 am
Сообщений: 116
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Да, так работает.
Спасибо!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Вс июл 14, 2019 9:40 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 880
Благодарил (а): 2 раз.
Поблагодарили: 42 раз.
Пункты репутации: 9
Может ещё так как то. :roll:
Код:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
 
;MIDIIN Системный номер входного MIDI–порта.
;MIDIOUT        Системный номер выходного MIDI–порта.
;MIXER  Системный номер микшера.
;WAVEIN Системный номер входного звукового (Wave) порта.
;WAVEOUT        Системный номер выходного звукового порта.
;AUX    Системный номер дополнительного (auxiliary) устройства.
;HMIDIIN        Ключ открытого входного MIDI–порта.
;HMIDIOUT       Ключ открытого выходного MIDI–порта.
;HMIXER Ключ открытого микшера (по умолчанию).
;HWAVEIN        Ключ открытого входного звукового (Wave) порта.
;HWAVEOUT       Ключ открытого выходного звукового порта.
;{;Structure MIXERCONTROLDETAILS_UNSIGNED;
;Structure MIXERCONTROLDETAILS_UNSIGNED;
;;dwValue.l
;EndStructure
;замечания
;Следующие стандартные типы элементов управления используют эту структуру для получения и установки свойств:
 
;Метр управления:
;MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER
 
;Номер управления:
;MIXERCONTROL_CONTROLTYPE_UNSIGNED
 
;Управление фейдером:
;MIXERCONTROL_CONTROLTYPE_BASS
;MIXERCONTROL_CONTROLTYPE_EQUALIZER
;MIXERCONTROL_CONTROLTYPE_FADER
;MIXERCONTROL_CONTROLTYPE_TREBLE
;MIXERCONTROL_CONTROLTYPE_VOLUME
 
;Контроль времени:
;MIXERCONTROL_CONTROLTYPE_MICROTIME
;MIXERCONTROL_CONTROLTYPE_MILLITIME
;MIXERCONTROL_CONTROLTYPE_PERCENT
;};
;{;Structure MIXERCONTROL и константы дя неё
;{вложенные структуры
Structure DUMMYSTRUCTNAME
      lMinimum.i;Минимальное значение со знаком для элемента управления, который имеет характер границы со знаком. Этот элемент нельзя использовать вместе с dwMinimum
      lMaximum.i;Максимальное значение со знаком для элемента управления, который имеет характер границы со знаком. Этот член не может использоваться вместе с dwMaximum
    EndStructure
    Structure DUMMYSTRUCTNAME2
      dwMinimum.l;Минимальное значение без знака для элемента управления, который имеет границу без знака. Этот член не может использоваться вместе с lMinimum.
      dwMaximum.l;Максимальное значение без знака для элемента управления, который имеет границу без знака. Этот элемент нельзя использовать вместе с lMaximum.
    EndStructure
  Structure Metrics
    cSteps.l;Количество дискретных диапазонов в пределах объединения, указанного для элемента управления, указанного элементом Bounds. Этот член перекрывается с другими членами члена структуры Metrics и не может использоваться совместно с этими членами
    cbCustomData.l;Размер в байтах, который должен содержать состояние пользовательского класса элемента управления. Этот член подходит только для класса управления MIXERCONTROL_CONTROLTYPE_CUSTOM.
    dwReserved.l[6];Зарезервированный; не использоват
  EndStructure
;};
Structure tagMIXERCONTROL
    cbStruct.l;размер структуры
    dwControlID.l;определенный идентификатор микшера
    dwControlType.l;Класс элемента управления, для которого идентификатор указан в dwControlID(Существует восемь классификаций классов управления)
    fdwControl.l;Флаги состояния и поддержки для управления звуковой линией
    cMultipleItems.l;
    szShortName.u[16];Короткая строка, описывающая элемент управления звуковой линией, указанный в dwControlID. Это описание должно быть подходящим для использования в качестве краткой метки для элемента управления.
    szName.u[64];Строка, описывающая элемент управления звуковой линией, заданный параметром dwControlID. Это описание должно быть целесообразным для использования в качестве полного описания для контроля
  StructureUnion; Bounds
      DUMMYSTRUCTNAME.DUMMYSTRUCTNAME
      DUMMYSTRUCTNAME2.DUMMYSTRUCTNAME2
      dwReserved.l[6];Зарезервированный; не использовать
  EndStructureUnion
  StructureUnion; Metrics
      ;Metrics.Metrics
    cSteps.l;
    cbCustomData.l;
    dwwReserved.l[6]
  EndStructureUnion
EndStructure
;{;классы к dwControlID
#MIXERCONTROL_CT_CLASS_CUSTOM=$0;произвольный элемент, полностью управляется драйвером конкретного микшера.
;типы управления
#MIXERCONTROL_CONTROLTYPE_CUSTOM=$0
;
#MIXERCONTROL_CT_CLASS_METER=$10000000;индикатор состояния, уровня и т.п. Значения - логического, знакового и беззнакового типов:
;типы управления
#MIXERCONTROL_CONTROLTYPE_BOOLEANMETER=$10010000;индикатор из двух состояний - включено/выключено, есть/нет, выбрано/не выбрано и т.
#MIXERCONTROL_CONTROLTYPE_SIGNEDMETER=$10020000;индикатор значений со знаком
#MIXERCONTROL_CONTROLTYPE_PEAKMETER=$10020001;индикатор отклонения от нуля. Диапазон значений -32768..32767.
#MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER=$10030000;индикатор значений без знака
;
#MIXERCONTROL_CT_CLASS_SWITCH=$20000000;двухпозиционный переключатель. Представлен логическим (boolean) значением
;типы управления
#MIXERCONTROL_CONTROLTYPE_BOOLEAN=$20010000;переключатель с фиксацией произвольного вида.
#MIXERCONTROL_CONTROLTYPE_ONOFF=$20010001; кнопка или переключатель с фиксацией
#MIXERCONTROL_CONTROLTYPE_MUTE=$20010002; переключатель с фиксацией, заглушающий (отключающий) звук в линии
#MIXERCONTROL_CONTROLTYPE_MONO=$20010003; переключатель с фиксацией, объединяющий каналы линии в один.
#MIXERCONTROL_CONTROLTYPE_LOUDNESS=$20010004;(тонкомпенсация) - переключатель с фиксацией, поднимающий уровень низких частот на малых уровнях громкости.
#MIXERCONTROL_CONTROLTYPE_STEREOENH=$20010005;переключатель с фиксацией, включающий режим расширения стереобазы.
#MIXERCONTROL_CONTROLTYPE_BASS_BOOST=$20012277
#MIXERCONTROL_CONTROLTYPE_BUTTON=$21010000; кнопка без фиксации. Установка значения TRUE требует от драйвера однократного выполнения определенного действия, значение FALSE игнорируется.
;
#MIXERCONTROL_CT_CLASS_NUMBER=$30000000;числовое поле, допускающее непосредственный ввод значения пользователем.
;типы управления
#MIXERCONTROL_CONTROLTYPE_SIGNED=$30020000;значение со знаком
#MIXERCONTROL_CONTROLTYPE_UNSIGNED=$30030000;значение без знака
#MIXERCONTROL_CONTROLTYPE_DECIBELS=$30040000;целое значение в десятых долях децибела
#MIXERCONTROL_CONTROLTYPE_PERCENT=$30050000;целое значение в десятых долях процента
;
#MIXERCONTROL_CT_CLASS_SLIDER=$40000000;подобен регулятору уровня, но ориентируется обычно горизонтально. Представляют целые знаковые (signed) значения
;типы управления
#MIXERCONTROL_CONTROLTYPE_SLIDER=$40020000;произвольный регулятор. Диапазон -32768..32767.
#MIXERCONTROL_CONTROLTYPE_PAN=$40020001;регулятор стереопанорамы. Диапазон -32768..32767.
#MIXERCONTROL_CONTROLTYPE_QSOUNDPAN=$40020002;регулятор панорамы эффекта расширенного стерео (QSound). Диапазон -15..15.
;
#MIXERCONTROL_CT_CLASS_FADER=$50000000;регулятор уровня, движок типа ползункового регулятора
;типы управления
#MIXERCONTROL_CONTROLTYPE_FADER=$50030000;произвольный регулятор
#MIXERCONTROL_CONTROLTYPE_VOLUME=$50030001;регулятор громкости
#MIXERCONTROL_CONTROLTYPE_BASS=$50030002;регулятор тембра по низким частотам
#MIXERCONTROL_CONTROLTYPE_TREBLE=$50030003;регулятор тембра по высоким частотам
#MIXERCONTROL_CONTROLTYPE_EQUALIZER=$50030004;многополосный регулятор тембра, состоит из нескольких движков
;
#MIXERCONTROL_CT_CLASS_TIME=$60000000;числовое поле для ввода временных интервалов, представляемых беззнаковыми значениями
;типы управления
#MIXERCONTROL_CONTROLTYPE_MICROTIME=$60030000;интервал в микросекундах
#MIXERCONTROL_CONTROLTYPE_MILLITIME=$61030000;интервал в миллисекундах
;
#MIXERCONTROL_CT_CLASS_LIST=$70000000;список текстовых строк, которые могут быть отмечены или выбраны
;типы управления
#MIXERCONTROL_CONTROLTYPE_SINGLESELECT=$70010000;произвольный список с возможностью выбора только одной строки.
#MIXERCONTROL_CONTROLTYPE_MUX=$70010001;список линий с возможностью выбора только одной линии. Реализует концепцию мультиплексора (селектора входов или выходов)
#MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT=$71010000;произвольный список с возможностью выбора нескольких строк
#MIXERCONTROL_CONTROLTYPE_MIXER=$71010001;список выходных линий с возможностью выбора нескольких линий. Реализует концепцию микшера.
;
#MIXERCONTROL_CT_CLASS_MASK=$F0000000;маска кода класса
#MIXERCONTROL_CT_SUBCLASS_MASK=$0F000000;маска кода подкласса
;UNITS_MASK - маска кода представления
;};
;{;константы на флаги fdwControl
#MIXERCONTROL_CONTROLF_DISABLED=$80000000;Управление отключено(Приложение может считывать текущие настройки с отключенного элемента управления, но не может применять настройки)
#MIXERCONTROL_CONTROLF_MULTIPLE=$00000002;
;Элемент управления имеет две или более настроек на канал. Эквалайзер, например, требует этот флаг, потому что для каждой полосы частот может
;быть установлено другое значение. Эквалайзер, который одинаково воздействует на оба канала стерео линии, также будет указывать флаг
#MIXERCONTROL_CONTROLF_UNIFORM=$00000001
;Управление действует по всем каналам многоканальной линии единообразно. Например, элемент управления, который заглушает оба канала стереофонической линии,
;установит этот флаг. Большинство элементов управления
;MIXERCONTROL_CONTROLTYPE_MUX и MIXERCONTROL_CONTROLTYPE_MIXER ;также указывают флаг MIXERCONTROL_CONTROLF_UNIFORM.
;};
;{;описание cMultipleItems
;Количество элементов на канал, составляющих элемент управления MIXERCONTROL_CONTROLF_MULTIPLE. Это число всегда два или больше для элементов управления
;несколькими элементами. Если элемент управления не является элементом управления, состоящим из нескольких элементов, не используйте этот элемент,будет ноль.
;};
;}
;{;Structure MIXERCONTROLDETAILS_LISTTEXT
Structure MIXERCONTROLDETAILS_LISTTEXT
  dwParam1.l;
  dwParam2.l;
  szName.c[64]
EndStructure
;{;описание
 
;Структура MIXERCONTROLDETAILS_LISTTEXT извлекает текст списка, текст метки и / или информацию о диапазоне диапазонов для элементов управления из
;нескольких элементов. Эта структура используется, когда в функции mixerGetControlDetails() указан флаг MIXER_GETCONTROLDETAILSF_LISTTEXT.
;dwParam1
;Контролируйте специфичные для класса значения. Следующие типы элементов управления перечислены с соответствующими значениями:
;
;ЭКВАЛАЙЗЕР
;MIXERCONTROL. Bounds dwMinimum член.
 
;MIXER и MUX
;MIXERLINE член dwLineID.
 
;МНОЖЕСТВЕННЫЙ и ОДИН ИЗБРАННЫЙ
;Неопределенный; должно быть ноль
;
;dwParam2
;Смотрите dwParam1.
;
;szName
;Имя, описывающее один элемент в элементе управления с несколькими элементами. Этот текст может использоваться как текст метки или элемента в зависимости от класса элемента управления.
;замечания
;Следующие стандартные типы элементов управления используют эту структуру для извлечения текстовых описаний элементов в элементах управления с несколькими элементами:
 
;Управление фейдером:
 
;MIXERCONTROL_CONTROLTYPE_EQUALIZER
 
;Список элементов управления:
 
;MIXERCONTROL_CONTROLTYPE_MIXER
;MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT
;MIXERCONTROL_CONTROLTYPE_MUX
;MIXERCONTROL_CONTROLTYPE_SINGLESELECT
;}
;};
;{;
Structure MMIXERCONTROLDETAILS_BOOLEAN
  fValue.f
EndStructure
Structure MMIXERCONTROLDETAILS_UNSIGNED
  dwValue.l
EndStructure
Structure MMIXERCONTROLDETAILS_SIGNED
  lValue.i
EndStructure
 
Structure MMIXERCAPS
  wMid.w
  wPid.w
  vDriverVersion.l
  szPname.s{32};.c[32]; с первым можно строку копировать без peeks()
  fdwSupport.l
  cDestinations.l
EndStructure
 
Structure HMixer;тупо для ссылки на процедуры
  hMixer.l
EndStructure
;}
Procedure Error(funkciy$,ohibka.i)
  Select  ohibka
           Case #MIXERR_BASE
               MessageRequester(funkciy$,"Минимальное значение кода ошибки микшера")  
           Case #MIXERR_INVALLINE
               MessageRequester(funkciy$,"Недопустимый индекс/идентификатор линии")
            Case #MIXERR_INVALCONTROL
              MessageRequester(funkciy$,"Недопустимый индекс/идентификатор элемента управления")
            Case #MIXERR_INVALVALUE
              MessageRequester(funkciy$,"Недопустимое значение элемента управления")
            Case #MIXERR_LASTERROR
               MessageRequester(funkciy$,"Максимальное значение кода ошибки микшера")
            Case #MMSYSERR_ALLOCATED
               MessageRequester(funkciy$,"Устройство занято другим приложением")
            Case #MMSYSERR_BADDEVICEID
              MessageRequester(funkciy$,"Недопустимый номер устройства")
            Case #MMSYSERR_NOTENABLED
               MessageRequester(funkciy$,"Драйвер не активизирован")  
            Case #MMSYSERR_INVALFLAG
               MessageRequester(funkciy$,"Один или несколько флагов недействительны.")      
            Case #MMSYSERR_INVALHANDLE
               MessageRequester(funkciy$,"Недопустимый дискриптор открытого устройства")  
            Case #MMSYSERR_INVALPARAM
              MessageRequester(funkciy$,"Один или несколько параметров недействительны.")
            Case #MMSYSERR_NODRIVER
              MessageRequester(funkciy$,"Драйвер отсутствует")
            Case #MMSYSERR_NOMEM
              MessageRequester(funkciy$,"Недостаточно памяти для выделения")
            Case #MMSYSERR_NOTSUPPORTED
              MessageRequester(funkciy$,"Запрошенная функция не поддерживается")
            Case #MMSYSERR_HANDLEBUSY
              MessageRequester(funkciy$,"Над ключом выполняется операция от другой задачи (thread)")
            ;Case #MMSYSERR_NODRIVERCB 
              ;MessageRequester(funkciy$,"Драйвер не выполнил уведомления (callback)")  
            Case #MMSYSERR_BADERRNUM
              MessageRequester(funkciy$,"Код ошибки вне допустимого диапазона")
             Case #MMSYSERR_ERROR
              MessageRequester(funkciy$,"Неопределенная ошибка")          
          EndSelect
EndProcedure
;Открытие и Закрытие микшера
Procedure.i OpenMixer(DEVICEID.i,*HMixer.HMixer,flag.i,dwCallback.i=0);получаем дискриптор устройства
  Protected idmikhera.l
  Protected result.i
  result= mixerGetID_(DEVICEID,@idmikhera,flag)
     If result=#MMSYSERR_NOERROR
       result= mixerOpen_(*HMixer.hMixer,idmikhera, dwCallback, 0,flag)
        If result=#MMSYSERR_NOERROR
           ProcedureReturn 1
        Else
          Error("Error OpenMixer()",result)
        ProcedureReturn 0
        EndIf  
     Else
       Error("Error mixerGetID() V OpenMixer()-",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i OpenMixer2(DEVICEID.i,*HMixer.HMixer,flag.i,dwCallback.i=0);получаем дискриптор устройства
 
  Protected result.i
     result= mixerOpen_(*HMixer.HMixer,DEVICEID, dwCallback, 0,flag)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error OpenMixer2()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i CloseMixer(*HMixer);получаем дискриптор устройства
 Protected Mixer.i
 !mov dword eax,[p.p_HMixer]
 !mov dword eax,[eax]
 !mov dword [p.v_Mixer],eax
  If mixerClose_(Mixer)=#MMSYSERR_NOERROR
       !mov dword eax,[p.p_HMixer]
       !mov dword [eax],0
    ProcedureReturn 1
  Else
    MessageRequester("Error CloseMixer()","INVALIDE_HANDLE hMixer")
    ProcedureReturn 0
  EndIf
EndProcedure
;Получение идентификатора различных микшеров
Procedure.i MixerGetID(DEVICEID.i,flag.i);получаем id устройства
Protected idmikhera.i
  Protected result.i
     result= mixerGetID_(DEVICEID,@idmikhera,flag)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn idmikhera
     Else
       Error("Error MixerGetID()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;Опрос устройств
Procedure.i mixerGetDevCaps(DEVICEID.i,*MMIXERCAPS.MMIXERCAPS,sizeMMIXERCAPS.i);определение возможностей микшера
  Protected result.i
     result= mixerGetDevCaps_(DEVICEID,*MMIXERCAPS.MMIXERCAPS,sizeMIXERCAPS)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetDevCaps()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i mixerGetNumDevs();определение количесва микшерерных устройств или 0=недоступны
  ProcedureReturn mixerGetNumDevs_()
EndProcedure
;Получение Линии Управления
;{;flagi_Controls
#MIXER_GETLINECONTROLSF_ALL=$0
;Параметр pmxlc ссылается на список структур MIXERCONTROL, которые будут получать информацию обо всех элементах управления, связанных со звуковой линией,
;идентифицированной членом dwLineID структуры MIXERLINECONTROLS. Член cControls должен быть инициализирован числом элементов управления,
;связанных со строкой. Этот номер извлекается из члена cControls структуры MIXERLINE, возвращаемой функцией mixerGetLineInfo. Член cbmxctrl должен быть
;инициализирован в размере, в байтах, одной структуры MIXERCONTROL. Член pamxctrl должен указывать на первую структуру MIXERCONTROL, которая будет заполнена. Члены dwControlID и dwControlType игнорируются для этого запроса
;
#MIXER_GETLINECONTROLSF_ONEBYID=$1
;Параметр pmxlc ссылается на одну структуру MIXERCONTROL, которая будет получать информацию об элементе управления, идентифицированном членом dwControlID
;структуры MIXERCONTROL. Член pamxctrl должен указывать на структуру MIXERCONTROL, которая должна быть заполнена. Члены dwLineID и dwControlType
;игнорируются для этого запроса. Этот запрос обычно используется для обновления элемента управления после получения сообщения уведомления об изменении
;элемента управления MM_MIXM_CONTROL_CHANGE с помощью пользовательского обратного вызова (см. MixerOpen)
#MIXER_GETLINECONTROLSF_ONEBYTYPE=$2
;Функция mixerGetLineControls извлекает информацию о первом элементе управления определенного класса для запрашиваемой звуковой линии. Параметр pmxlc
;ссылается на одну структуру MIXERCONTROL, которая будет получать информацию о конкретном элементе управления. Аудио линия идентифицируется членом dwLineID. Класс управления указан в члене dwControlType структуры MIXERLINECONTROLS.
;Член dwControlID игнорируется для этого запроса. Этот запрос может использоваться приложением для получения информации об одном элементе управления,
;связанном со строкой. Например, вы можете захотеть, чтобы ваше приложение использовало пиковый измеритель только из выходной звуковой линии.
;
#MIXER_OBJECTF_MIXER=$0
;Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств,
;возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;
#MIXER_OBJECTF_WAVEOUT=$10000000
;Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств,
;возвращаемых функцией waveOutGetNumDevs.
;
#MIXER_OBJECTF_WAVEIN=$20000000
;Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств,
;возвращаемых функцией waveInGetNumDevs.
;
#MIXER_OBJECTF_MIDIOUT=$30000000
;Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше,
;чем количество устройств, возвращаемых функцией midiOutGetNumDevs
;
#MIXER_OBJECTF_MIDIIN=$40000000
;Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше,
;чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;
#MIXER_OBJECTF_AUX=$50000000
;Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых
;функцией auxGetNumDevs.
;
#MIXER_OBJECTF_HMIXER=$80000000
;Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;
#MIXER_OBJECTF_HWAVEOUT=$90000000
;Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;
#MIXER_OBJECTF_HWAVEIN=$A0000000
;Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;
#MIXER_OBJECTF_HMIDIOUT=$B0000000
;Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen
;
#MIXER_OBJECTF_HMIDIIN=$C0000000
;Параметр hmxobj является дескриптором устройства ввода MIDI. Этот дескриптор должен быть возвращен функцией midiInOpen.
;
#MIXER_OBJECTF_HANDLE=$80000000;?
;}
Procedure.i mixerGetLineControls(descriptor.i,*MIXERLINECONTROLS.MIXERLINECONTROLS,flagi_Controls.i)
    Protected result.i
     result= mixerGetLineControls_(descriptor,*MIXERLINECONTROLS.MIXERLINECONTROLS,flagi_Controls)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetLineControls()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;Получение информации о линии
;{;flagi mixerGetLineInfo
;#MIXER_GETLINEINFOF_LINEID Запрос по идентификатору линии, заданному полем dwLineID.
;#MIXER_GETLINEINFOF_DESTINATION Запрос по индексу входной линии, заданному полем dwDestination.
;#MIXER_GETLINEINFOF_SOURCE Запрос по индексу входной линии, заданному полем dwDestination, и индексу соединенной с нею выходной линии, заданному полем dwSource
;#MIXER_GETLINEINFOF_TARGETTYPE Запрос по параметрам устройства, заданным полями dwType, wMid, wPid, vDriverVersion и szPname структуры Target. Не допускается указание UNDEFINED в поле dwType.
;#MIXER_GETLINEINFOF_QUERYMASK
;};
Procedure.i mixerGetLineInfo(descriptor.i,*MIXERLINE.MIXERLINE,flagi.i)
      Protected result.i
     result= mixerGetLineInfo_(descriptor,*MIXERLINE.MIXERLINE,flagi)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetLineInfo()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i VizualstructuraMIXERLINE(*MIXERLINE.MIXERLINE)
  Protected result$
  result$+"dwDestination  "+Str(*MIXERLINE\dwDestination)+#CRLF$
  result$+"dwSource  "+Str(*MIXERLINE\dwSource)+#CRLF$
  result$+"dwLineID  "+Str(*MIXERLINE\dwLineID)+#CRLF$
  result$+"fdwLine  "+Str(*MIXERLINE\fdwLine)
  Select *MIXERLINE\fdwLine
    Case #MIXERLINE_LINEF_ACTIVE
      result$+" #MIXERLINE_LINEF_ACTIVE (Аудио линия активна)"
    Case #MIXERLINE_LINEF_DISCONNECTED
      result$+"#MIXERLINE_LINEF_DISCONNECTED (Аудио линия отключена)"
    Case #MIXERLINE_LINEF_SOURCE
      result$+" #MIXERLINE_LINEF_SOURCE (Линия аудио - это строка аудиоисточника, связанная с одной линией аудио назначения)"
  EndSelect
  result$+#CRLF$
  result$+"dwUser "+Str(*MIXERLINE\dwUser)+#CRLF$
  result$+"dwComponentType  "+Str(*MIXERLINE\dwComponentType)
 
 
Select *MIXERLINE\dwComponentType
  Case #MIXERLINE_COMPONENTTYPE_DST_DIGITAL
   result$+" #MIXERLINE_COMPONENTTYPE_DST_DIGITAL (Аудио линия - это цифровое назначение (например, цифровой вход на аудиоустройство DAT или CD)"
  Case #MIXERLINE_COMPONENTTYPE_DST_HEADPHONES
   result$+" #MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (Аудио линия - место назначения, предназначенное для подключения наушников)"
  Case #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
   result$+" #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (Аудио линия - это регулируемое (усиление и / или затухание) место назначения, предназначенное для управления динамиками)"
  Case #MIXERLINE_COMPONENTTYPE_DST_LINE
   result$+" #MIXERLINE_COMPONENTTYPE_DST_LINE (Аудио линия - это пункт назначения линейного уровня (например, вход линейного уровня с аудиоустройства CD), который будет конечным источником записи для аналого-цифрового преобразователя (АЦП))"
  Case #MIXERLINE_COMPONENTTYPE_DST_WAVEIN
   result$+" #MIXERLINE_COMPONENTTYPE_DST_WAVEIN (Аудио линия - это пункт назначения, который будет конечным источником записи для входа аудио сигнала (АЦП))"
  Case #MIXERLINE_COMPONENTTYPE_DST_MONITOR
   result$+" #MIXERLINE_COMPONENTTYPE_DST_MONITOR (Аудио линия - это пункт назначения, используемый для монитора)"
  Case #MIXERLINE_COMPONENTTYPE_DST_TELEPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (Аудио линия - это пункт назначения, который будет направлен на телефонную линию)"
  Case #MIXERLINE_COMPONENTTYPE_DST_UNDEFINED
   result$+" #MIXERLINE_COMPONENTTYPE_DST_UNDEFINED (Аудио линия - это пункт назначения, который не может быть определен одним из стандартных типов компонентов. Устройство микшера должно использовать этот тип компонента для типов линейных компонентов, которые не были определены Microsoft Corporation)"
  Case #MIXERLINE_COMPONENTTYPE_DST_VOICEIN
   result$+" #MIXERLINE_COMPONENTTYPE_DST_VOICEIN (Аудио линия - это пункт назначения, который будет конечным источником записи для голосового ввода)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_DIGITAL  
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (Аудио линия - это цифровой источник (например, цифровой выход с DAT или аудио CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_ANALOG
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_ANALOG (Аудио линия - это аналоговый источник (например, аналоговый выход с видеокассеты)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (Аудио линия - это цифровое назначение (например, цифровой вход на аудиоустройство DAT или CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (Аудио линия - это источник, исходящий из выхода внутреннего аудио CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_LINE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_LINE (Аудио линия - это источник линейного уровня (например, вход линейного уровня от внешнего стерео)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_MICROPHON (Аудио линия является источником записи микрофона)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (Аудио линия - это источник, исходящий из динамика компьютера)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (Аудио линия - это источник, исходящий из выхода внутреннего синтезатора. Большинство звуковых карт для персональных компьютеров имеют своего рода синтезатор MIDI)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (Аудио линия - это источник, исходящий из входящей телефонной линии)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED (Аудио линия - это источник, который не может быть определен одним из стандартных типов компонентов. Устройство микшера должно использовать этот тип компонента для типов компонентов линии, которые не были определены Microsoft)"
EndSelect
result$+#CRLF$
result$+"cChannels  "+Str(*MIXERLINE\cChannels)+#CRLF$
result$+"cConnections  "+Str(*MIXERLINE\cConnections)+#CRLF$
result$+"cControls  "+Str(*MIXERLINE\cControls)+#CRLF$
Protected r.i=*MIXERLINE.MIXERLINE
r+40
result$+"szShortName  "+PeekS(r,-1,#PB_Unicode)+#CRLF$
r+32
result$+"szName  "+PeekS(r,-1,#PB_Unicode)+#CRLF$
 
result$+"Target\dwType  "+Str(*MIXERLINE\Target\dwType)
Select *MIXERLINE\Target\dwType
  Case #MIXERLINE_TARGETTYPE_AUX
    result$+" #MIXERLINE_TARGETTYPE_AUX(строго привязана к вспомогательному устройству, подробно описанному в оставшихся элементах элемента Target)"
  Case #MIXERLINE_TARGETTYPE_MIDIIN
    result$+" #MIXERLINE_TARGETTYPE_MIDIIN(строго привязана к устройству ввода MIDI, подробно описанному в остальных членах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_MIDIOUT
    result$+" #MIXERLINE_TARGETTYPE_MIDIOUT(строго привязана к устройству вывода MIDI, подробно описанному в остальных членах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_UNDEFINED
    result$+" #MIXERLINE_TARGETTYPE_UNDEFINED(не привязана строго к определенному типу медиа. Все остальные члены целевой структуры структуры MIXERLINE следует игнорировать)"
  Case #MIXERLINE_TARGETTYPE_WAVEIN
    result$+" MIXERLINE_TARGETTYPE_WAVEIN(строго привязана к устройству ввода аудио-формы сигнала, подробно описанному в оставшихся элементах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_WAVEOUT
    result$+" #MIXERLINE_TARGETTYPE_WAVEOUT(строго привязана к устройству вывода аудио-формы сигнала, подробно описанному в оставшихся элементах члена целевой структуры структуры MIXERLINE)"
EndSelect
result$+#CRLF$
result$+"Target\dwDeviceID  "+Str(*MIXERLINE\Target\dwDeviceID)+#CRLF$
 
;e.w=*MIXERLINE\Target\wMid
;result$+"Target\wMid  "+Str(e)+#CRLF$
result$+"Target\wMid  "+Str(*MIXERLINE\Target\wMid)+#CRLF$
result$+"Target\wPid  "+Str(*MIXERLINE\Target\wPid)+#CRLF$
result$+"Target\vDriverVersion  "+Str(*MIXERLINE\Target\vDriverVersion)+#CRLF$
 
r+144
result$+"Target\szPname "+PeekS(r,-1,#PB_Unicode)
 
 MessageRequester("Информация структуры MIXERLINE",result$)
EndProcedure
 
;Изменение атрибутов управления
;{;flagi_Details
;MIXER_GETCONTROLDETAILSF_LISTTEXT Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур MIXERCONTROLDETAILS_LISTTEXT для получения текстовых меток для элементов управления из нескольких элементов. Приложение должно получить все элементы текста списка для элемента управления из нескольких элементов одновременно. Этот флаг нельзя использовать с элементами управления MIXERCONTROL_CONTROLTYPE_CUSTOM.
;MIXER_GETCONTROLDETAILSF_VALUE Получены текущие значения для элемента управления. Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур деталей, соответствующих классу управления.
;MIXER_OBJECTF_AUX Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией auxGetNumDevs.
;MIXER_OBJECTF_HMIDIIN Параметр hmxobj является дескриптором устройства ввода MIDI (цифровой интерфейс музыкальных инструментов). Этот дескриптор должен быть возвращен функцией midiInOpen.
;MIXER_OBJECTF_HMIDIOUT Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen.
;MIXER_OBJECTF_HMIXER Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;MIXER_OBJECTF_HWAVEIN Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;MIXER_OBJECTF_HWAVEOUT Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;MIXER_OBJECTF_MIDIIN Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;MIXER_OBJECTF_MIDIOUT Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiOutGetNumDevs.
;MIXER_OBJECTF_MIXER Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;MIXER_OBJECTF_WAVEIN Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveInGetNumDevs.
;MIXER_OBJECTF_WAVEOUT Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveOutGetNumDevs.
;}
Procedure.i mixerGetControlDetails(descriptor.i,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details.i)
  Protected result.i
     result= mixerGetControlDetails_(descriptor,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetControlDetails()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;{;flagi_Details
;MIXER_OBJECTF_AUX Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией auxGetNumDevs.
;MIXER_OBJECTF_HMIDIIN Параметр hmxobj является дескриптором устройства ввода MIDI. Этот дескриптор должен быть возвращен функцией midiInOpen.
;MIXER_OBJECTF_HMIDIOUT Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen.
;MIXER_OBJECTF_HMIXER Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;MIXER_OBJECTF_HWAVEIN Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;MIXER_OBJECTF_HWAVEOUT Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;MIXER_OBJECTF_MIDIIN Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;MIXER_OBJECTF_MIDIOUT Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiOutGetNumDevs.
;MIXER_OBJECTF_MIXER Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;MIXER_OBJECTF_WAVEIN Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveInGetNumDevs.
;MIXER_OBJECTF_WAVEOUT Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveOutGetNumDevs.
;MIXER_SETCONTROLDETAILSF_CUSTOM Отображается пользовательское диалоговое окно для указанного пользовательского элемента управления микшером. Устройство микширования собирает необходимую информацию от пользователя и возвращает данные в указанный буфер. Дескриптор окна-владельца указывается в члене hwndOwner структуры MIXERCONTROLDETAILS. (Этот дескриптор может быть установлен в NULL.) Затем приложение может сохранить данные из диалогового окна и использовать их позже, чтобы сбросить элемент управления в то же состояние с помощью флага MIXER_SETCONTROLDETAILSF_VALUE.
;MIXER_SETCONTROLDETAILSF_VALUE Текущие значения для элемента управления установлены. Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур сведений о контроллере микшера соответствующего класса для управления.
;}
Procedure.i mixerSetControlDetails(descriptor.i,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details.i)
    Protected result.i
     result= mixerSetControlDetails_(descriptor,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerSetControlDetails()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;
Procedure.i mixerMessage(DriverID.i,msg.i,wParam1.i,wParam2.i); отправляет пользовательское сообщение драйвера микшера непосредственно в драйвер микшера.
      Protected result.i
     result= mixerMessage_(DriverID,msg,wParam1,wParam2)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerMessage()",result)
       ProcedureReturn 0
     EndIf
 
EndProcedure
;
;общий ввод вывод
Procedure.i GetDeviceCount(devmode.l);
  Select devmode
        Case  #MIXER_OBJECTF_AUX
           devmode = auxGetNumDevs_()
        Case #MIXER_OBJECTF_MIXER, #MIXER_OBJECTF_HMIXER
           devmode = mixerGetNumDevs_()
        Case #MIXER_OBJECTF_WAVEIN, #MIXER_OBJECTF_HWAVEIN
           devmode = waveInGetNumDevs_()
        Case #MIXER_OBJECTF_WAVEOUT, #MIXER_OBJECTF_HWAVEOUT
           devmode = waveOutGetNumDevs_()
        Case #MIXER_OBJECTF_MIDIIN, #MIXER_OBJECTF_HMIDIIN
          devmode = midiInGetNumDevs_()
        Case #MIXER_OBJECTF_MIDIOUT, #MIXER_OBJECTF_HMIDIOUT
           devmode = midiOutGetNumDevs_()
       EndSelect
   ProcedureReturn devmode
EndProcedure
Procedure.s GetDeviceName(Index.l,devmode.l)
  DeviceName.s;{32}
  udtDevAU.AUXCAPS
  udtDevMX.MMIXERCAPS
    udtDevWO.WAVEOUTCAPS
    udtDevWI.WAVEINCAPS
    udtDevMI.MIDIINCAPS
    udtDevMO.MIDIOUTCAPS
   
    Select devmode
        Case  #MIXER_OBJECTF_AUX
          auxGetDevCaps_(Index, udtDevAU, SizeOf(AUXCAPS))
          DeviceName = PeekS(@udtDevAU\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIXER, #MIXER_OBJECTF_HMIXER
            mixerGetDevCaps_(Index, udtDevMX, SizeOf(MMIXERCAPS))
            DeviceName =udtDevMX\szPname; PeekS(@udtDevMX\szPname,-1,#PB_Unicode)  
        Case #MIXER_OBJECTF_WAVEIN, #MIXER_OBJECTF_HWAVEIN
            waveInGetDevCaps_(Index, udtDevWI, SizeOf(WAVEINCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_WAVEOUT, #MIXER_OBJECTF_HWAVEOUT
             waveOutGetDevCaps_(Index,udtDevWO, SizeOf(WAVEOUTCAPS))
             DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIDIIN, #MIXER_OBJECTF_HMIDIIN
            midiInGetDevCaps_(Index, udtDevMI, SizeOf(MIDIINCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIDIOUT, #MIXER_OBJECTF_HMIDIOUT
            midiOutGetDevCaps_(Index, udtDevMO, SizeOf(MIDIOUTCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)      
    EndSelect
   
    ProcedureReturn DeviceName
EndProcedure
 
 
 
 
 
Global MIXERCONTROL.tagMIXERCONTROL
 
 
Global MIXERLINECONTROLS.MIXERLINECONTROLS
MIXERLINECONTROLS\cbStruct=SizeOf(MIXERLINECONTROLS)
Global mMMIXERCAPS.MMIXERCAPS
Global MIXERLINE.MIXERLINE
Global hMixer.i
 
;Debug mixerGetNumDevs()
OpenMixer2(0,@hMixer,#MIXER_OBJECTF_HMIXER)
Debug hMixer
 
;=======================
;Debug SizeOf(mMMIXERCAPS)
;mixerGetDevCaps(hMixer,@mMMIXERCAPS,80);определение возможностей микшера
mixerGetDevCaps_(hMixer,@mMMIXERCAPS,80)
Debug mMMIXERCAPS\wMid
Debug mMMIXERCAPS\wPid
Debug mMMIXERCAPS\vDriverVersion
Debug PeekS(@mMMIXERCAPS\szPname,-1,#PB_Unicode)
Debug mMMIXERCAPS\fdwSupport
Debug mMMIXERCAPS\cDestinations
Debug "===========end mixerGetDevCaps============="
;========================
 
 
MIXERLINE\cbStruct=SizeOf(MIXERLINE)
MIXERLINE\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
mixerGetLineInfo(hMixer,@MIXERLINE,#MIXER_GETLINEINFOF_COMPONENTTYPE);Запрос по типу линии, заданному полем dwComponentType
;VizualstructuraMIXERLINE(@MIXERLINE);визуально просмотреть параметры структуры MIXERLINE
;==============
 
 
 
;MIXERLINECONTROLS\dwControlID
   ;#MIXER_GETLINECONTROLSF_ONEBYID
    MIXERLINECONTROLS\dwLineID = MIXERLINE\dwLineID
    MIXERLINECONTROLS\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME;#MIXERCONTROL_CONTROLTYPE_MUTE
    MIXERLINECONTROLS\cControls = 1
    MIXERLINECONTROLS\cbmxctrl = SizeOf(MIXERCONTROL)
    MIXERLINECONTROLS\pamxctrl = @MIXERCONTROL
mixerGetLineControls(hMixer,@MIXERLINECONTROLS,#MIXER_GETLINECONTROLSF_ONEBYTYPE);
 
Debug MIXERCONTROL\dwControlID
Debug MIXERCONTROL\dwControlType
Debug PeekS(@MIXERCONTROL\szShortName,-1,#PB_Unicode)
Debug PeekS(@MIXERCONTROL\szName,-1,#PB_Unicode)
Debug MIXERCONTROL\cbCustomData
Debug MIXERCONTROL\fdwControl
Debug MIXERCONTROL\cSteps
Debug MIXERCONTROL\cMultipleItems
Debug MIXERCONTROL\DUMMYSTRUCTNAME\lMinimum
Debug MIXERCONTROL\DUMMYSTRUCTNAME\lMaximum
Debug MIXERCONTROL\DUMMYSTRUCTNAME2\dwMinimum
Debug MIXERCONTROL\DUMMYSTRUCTNAME2\dwMaximum
 
 
;==========================================================
Global MIXERCONTROLDETAILS.MIXERCONTROLDETAILS
Global MIXERCONTROLDETAILS_BOOLEAN.MMIXERCONTROLDETAILS_BOOLEAN
   
   
    MIXERCONTROLDETAILS\cbStruct = SizeOf(MIXERCONTROLDETAILS)
    MIXERCONTROLDETAILS\cChannels = MIXERLINE\cChannels
    MIXERCONTROLDETAILS\dwControlID = MIXERCONTROL\dwControlID
    MIXERCONTROLDETAILS\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
    MIXERCONTROLDETAILS\paDetails = @MIXERCONTROLDETAILS_BOOLEAN
 
    mixerGetControlDetails(hMixer,@MIXERCONTROLDETAILS,#MIXER_GETCONTROLDETAILSF_VALUE)
     Debug MIXERCONTROLDETAILS_BOOLEAN\fValue
     
     
     
 ;===========
  ;   Global MIXERCONTROLDETAILS_LISTTEXT.MIXERCONTROLDETAILS_LISTTEXT
  ;   MIXERCONTROLDETAILS_LISTTEXT\dwParam1=MIXERLINE\dwLineID
     
   ; MIXERCONTROLDETAILS\cbStruct = SizeOf(MIXERCONTROLDETAILS)
  ;  MIXERCONTROLDETAILS\cChannels = MIXERLINE\cChannels
  ;  MIXERCONTROLDETAILS\dwControlID = MIXERCONTROL\dwControlID
  ;  MIXERCONTROLDETAILS\cbDetails = SizeOf(MIXERCONTROLDETAILS_LISTTEXT)
  ;  MIXERCONTROLDETAILS\paDetails = @MIXERCONTROLDETAILS_LISTTEXT
   
;mixerGetControlDetails(hMixer,@MIXERCONTROLDETAILS,#MIXER_GETCONTROLDETAILSF_LISTTEXT);пишим в структуру MIXERCONTROLDETAILS_LISTTEXT
 
;Debug PeekS(@MIXERCONTROLDETAILS_LISTTEXT\szName,-1,#PB_Unicode)
    ;Debug MIXERCONTROLDETAILS_LISTTEXT\dwParam1
    ;Debug MIXERCONTROLDETAILS_LISTTEXT\dwParam2
 ;================================================  
    ;Global v.i
   ;auxGetVolume_(0,@v)
    ;Debug v
   
   
   
;Debug GetDeviceName(hMixer,#MIXER_OBJECTF_HMIXER)
;Debug GetDeviceCount(#MIXER_OBJECTF_HMIXER)
;Debug GetDestinationName()
 
 
 
 
CloseMixer(@hMixer)
;Debug hMixer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Вс июл 14, 2019 10:50 am 
Не в сети
док

Зарегистрирован: Пн авг 23, 2010 12:25 am
Сообщений: 116
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Сергейчик писал(а):
Может ещё так как то. :roll:

С микшерами, что-то у меня, ни как не реагирует на изменение громкости :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Ср июл 17, 2019 9:57 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 880
Благодарил (а): 2 раз.
Поблагодарили: 42 раз.
Пункты репутации: 9
Надо ещё как то перехватывать сообщения от системного ползунка,что бы менять положение своего в программе.
PS:Как в прогах powermix,volime . :roll:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Получить системную громкость
СообщениеДобавлено: Чт июл 18, 2019 5:26 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 880
Благодарил (а): 2 раз.
Поблагодарили: 42 раз.
Пункты репутации: 9
Вот типа с приложения какойто микшер создаётся с обратной связью. :roll:
Код:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
 
;MIDIIN Системный номер входного MIDI–порта.
;MIDIOUT        Системный номер выходного MIDI–порта.
;MIXER  Системный номер микшера.
;WAVEIN Системный номер входного звукового (Wave) порта.
;WAVEOUT        Системный номер выходного звукового порта.
;AUX    Системный номер дополнительного (auxiliary) устройства.
;HMIDIIN        Ключ открытого входного MIDI–порта.
;HMIDIOUT       Ключ открытого выходного MIDI–порта.
;HMIXER Ключ открытого микшера (по умолчанию).
;HWAVEIN        Ключ открытого входного звукового (Wave) порта.
;HWAVEOUT       Ключ открытого выходного звукового порта.
;{;Structure MIXERCONTROLDETAILS_UNSIGNED;
;Structure MIXERCONTROLDETAILS_UNSIGNED;
;;dwValue.l
;EndStructure
;замечания
;Следующие стандартные типы элементов управления используют эту структуру для получения и установки свойств:
 
;Метр управления:
;MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER
 
;Номер управления:
;MIXERCONTROL_CONTROLTYPE_UNSIGNED
 
;Управление фейдером:
;MIXERCONTROL_CONTROLTYPE_BASS
;MIXERCONTROL_CONTROLTYPE_EQUALIZER
;MIXERCONTROL_CONTROLTYPE_FADER
;MIXERCONTROL_CONTROLTYPE_TREBLE
;MIXERCONTROL_CONTROLTYPE_VOLUME
 
;Контроль времени:
;MIXERCONTROL_CONTROLTYPE_MICROTIME
;MIXERCONTROL_CONTROLTYPE_MILLITIME
;MIXERCONTROL_CONTROLTYPE_PERCENT
;};
;{;Structure MIXERCONTROL и константы дя неё
;{вложенные структуры
Structure DUMMYSTRUCTNAME
      lMinimum.i;Минимальное значение со знаком для элемента управления, который имеет характер границы со знаком. Этот элемент нельзя использовать вместе с dwMinimum
      lMaximum.i;Максимальное значение со знаком для элемента управления, который имеет характер границы со знаком. Этот член не может использоваться вместе с dwMaximum
    EndStructure
    Structure DUMMYSTRUCTNAME2
      dwMinimum.l;Минимальное значение без знака для элемента управления, который имеет границу без знака. Этот член не может использоваться вместе с lMinimum.
      dwMaximum.l;Максимальное значение без знака для элемента управления, который имеет границу без знака. Этот элемент нельзя использовать вместе с lMaximum.
    EndStructure
  Structure Metrics
    cSteps.l;Количество дискретных диапазонов в пределах объединения, указанного для элемента управления, указанного элементом Bounds. Этот член перекрывается с другими членами члена структуры Metrics и не может использоваться совместно с этими членами
    cbCustomData.l;Размер в байтах, который должен содержать состояние пользовательского класса элемента управления. Этот член подходит только для класса управления MIXERCONTROL_CONTROLTYPE_CUSTOM.
    dwReserved.l[6];Зарезервированный; не использоват
  EndStructure
;};
Structure MMIXERCONTROL
    cbStruct.l;размер структуры
    dwControlID.l;определенный идентификатор микшера
    dwControlType.l;Класс элемента управления, для которого идентификатор указан в dwControlID(Существует восемь классификаций классов управления)
    fdwControl.l;Флаги состояния и поддержки для управления звуковой линией
    cMultipleItems.l;
    szShortName.u[16];Короткая строка, описывающая элемент управления звуковой линией, указанный в dwControlID. Это описание должно быть подходящим для использования в качестве краткой метки для элемента управления.
    szName.u[64];Строка, описывающая элемент управления звуковой линией, заданный параметром dwControlID. Это описание должно быть целесообразным для использования в качестве полного описания для контроля
  StructureUnion; Bounds
      DUMMYSTRUCTNAME.DUMMYSTRUCTNAME
      DUMMYSTRUCTNAME2.DUMMYSTRUCTNAME2
      dwReserved.l[6];Зарезервированный; не использовать
  EndStructureUnion
  StructureUnion; Metrics
      ;Metrics.Metrics
    cSteps.l;
    cbCustomData.l;
    dwwReserved.l[6]
  EndStructureUnion
EndStructure
;{;классы к dwControlID
#MIXERCONTROL_CT_CLASS_CUSTOM=$0;произвольный элемент, полностью управляется драйвером конкретного микшера.
;типы управления
#MIXERCONTROL_CONTROLTYPE_CUSTOM=$0
;
#MIXERCONTROL_CT_CLASS_METER=$10000000;индикатор состояния, уровня и т.п. Значения - логического, знакового и беззнакового типов:
;типы управления
#MIXERCONTROL_CONTROLTYPE_BOOLEANMETER=$10010000;индикатор из двух состояний - включено/выключено, есть/нет, выбрано/не выбрано и т.
#MIXERCONTROL_CONTROLTYPE_SIGNEDMETER=$10020000;индикатор значений со знаком
#MIXERCONTROL_CONTROLTYPE_PEAKMETER=$10020001;индикатор отклонения от нуля. Диапазон значений -32768..32767.
#MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER=$10030000;индикатор значений без знака
;
#MIXERCONTROL_CT_CLASS_SWITCH=$20000000;двухпозиционный переключатель. Представлен логическим (boolean) значением
;типы управления
#MIXERCONTROL_CONTROLTYPE_BOOLEAN=$20010000;переключатель с фиксацией произвольного вида.
#MIXERCONTROL_CONTROLTYPE_ONOFF=$20010001; кнопка или переключатель с фиксацией
#MIXERCONTROL_CONTROLTYPE_MUTE=$20010002; переключатель с фиксацией, заглушающий (отключающий) звук в линии
#MIXERCONTROL_CONTROLTYPE_MONO=$20010003; переключатель с фиксацией, объединяющий каналы линии в один.
#MIXERCONTROL_CONTROLTYPE_LOUDNESS=$20010004;(тонкомпенсация) - переключатель с фиксацией, поднимающий уровень низких частот на малых уровнях громкости.
#MIXERCONTROL_CONTROLTYPE_STEREOENH=$20010005;переключатель с фиксацией, включающий режим расширения стереобазы.
#MIXERCONTROL_CONTROLTYPE_BASS_BOOST=$20012277
#MIXERCONTROL_CONTROLTYPE_BUTTON=$21010000; кнопка без фиксации. Установка значения TRUE требует от драйвера однократного выполнения определенного действия, значение FALSE игнорируется.
;
#MIXERCONTROL_CT_CLASS_NUMBER=$30000000;числовое поле, допускающее непосредственный ввод значения пользователем.
;типы управления
#MIXERCONTROL_CONTROLTYPE_SIGNED=$30020000;значение со знаком
#MIXERCONTROL_CONTROLTYPE_UNSIGNED=$30030000;значение без знака
#MIXERCONTROL_CONTROLTYPE_DECIBELS=$30040000;целое значение в десятых долях децибела
#MIXERCONTROL_CONTROLTYPE_PERCENT=$30050000;целое значение в десятых долях процента
;
#MIXERCONTROL_CT_CLASS_SLIDER=$40000000;подобен регулятору уровня, но ориентируется обычно горизонтально. Представляют целые знаковые (signed) значения
;типы управления
#MIXERCONTROL_CONTROLTYPE_SLIDER=$40020000;произвольный регулятор. Диапазон -32768..32767.
#MIXERCONTROL_CONTROLTYPE_PAN=$40020001;регулятор стереопанорамы. Диапазон -32768..32767.
#MIXERCONTROL_CONTROLTYPE_QSOUNDPAN=$40020002;регулятор панорамы эффекта расширенного стерео (QSound). Диапазон -15..15.
;
#MIXERCONTROL_CT_CLASS_FADER=$50000000;регулятор уровня, движок типа ползункового регулятора
;типы управления
#MIXERCONTROL_CONTROLTYPE_FADER=$50030000;произвольный регулятор
#MIXERCONTROL_CONTROLTYPE_VOLUME=$50030001;регулятор громкости
#MIXERCONTROL_CONTROLTYPE_BASS=$50030002;регулятор тембра по низким частотам
#MIXERCONTROL_CONTROLTYPE_TREBLE=$50030003;регулятор тембра по высоким частотам
#MIXERCONTROL_CONTROLTYPE_EQUALIZER=$50030004;многополосный регулятор тембра, состоит из нескольких движков
;
#MIXERCONTROL_CT_CLASS_TIME=$60000000;числовое поле для ввода временных интервалов, представляемых беззнаковыми значениями
;типы управления
#MIXERCONTROL_CONTROLTYPE_MICROTIME=$60030000;интервал в микросекундах
#MIXERCONTROL_CONTROLTYPE_MILLITIME=$61030000;интервал в миллисекундах
;
#MIXERCONTROL_CT_CLASS_LIST=$70000000;список текстовых строк, которые могут быть отмечены или выбраны
;типы управления
#MIXERCONTROL_CONTROLTYPE_SINGLESELECT=$70010000;произвольный список с возможностью выбора только одной строки.
#MIXERCONTROL_CONTROLTYPE_MUX=$70010001;список линий с возможностью выбора только одной линии. Реализует концепцию мультиплексора (селектора входов или выходов)
#MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT=$71010000;произвольный список с возможностью выбора нескольких строк
#MIXERCONTROL_CONTROLTYPE_MIXER=$71010001;список выходных линий с возможностью выбора нескольких линий. Реализует концепцию микшера.
;
#MIXERCONTROL_CT_CLASS_MASK=$F0000000;маска кода класса
#MIXERCONTROL_CT_SUBCLASS_MASK=$0F000000;маска кода подкласса
;UNITS_MASK - маска кода представления
;};
;{;константы на флаги fdwControl
#MIXERCONTROL_CONTROLF_DISABLED=$80000000;Управление отключено(Приложение может считывать текущие настройки с отключенного элемента управления, но не может применять настройки)
#MIXERCONTROL_CONTROLF_MULTIPLE=$00000002;
;Элемент управления имеет две или более настроек на канал. Эквалайзер, например, требует этот флаг, потому что для каждой полосы частот может
;быть установлено другое значение. Эквалайзер, который одинаково воздействует на оба канала стерео линии, также будет указывать флаг
#MIXERCONTROL_CONTROLF_UNIFORM=$00000001
;Управление действует по всем каналам многоканальной линии единообразно. Например, элемент управления, который заглушает оба канала стереофонической линии,
;установит этот флаг. Большинство элементов управления
;MIXERCONTROL_CONTROLTYPE_MUX и MIXERCONTROL_CONTROLTYPE_MIXER ;также указывают флаг MIXERCONTROL_CONTROLF_UNIFORM.
;};
;{;описание cMultipleItems
;Количество элементов на канал, составляющих элемент управления MIXERCONTROL_CONTROLF_MULTIPLE. Это число всегда два или больше для элементов управления
;несколькими элементами. Если элемент управления не является элементом управления, состоящим из нескольких элементов, не используйте этот элемент,будет ноль.
;};
;}
;{;Structure MIXERCONTROLDETAILS_LISTTEXT
Structure MIXERCONTROLDETAILS_LISTTEXT
  dwParam1.l;
  dwParam2.l;
  szName.c[64]
EndStructure
;{;описание
 
;Структура MIXERCONTROLDETAILS_LISTTEXT извлекает текст списка, текст метки и / или информацию о диапазоне диапазонов для элементов управления из
;нескольких элементов. Эта структура используется, когда в функции mixerGetControlDetails() указан флаг MIXER_GETCONTROLDETAILSF_LISTTEXT.
;dwParam1
;Контролируйте специфичные для класса значения. Следующие типы элементов управления перечислены с соответствующими значениями:
;
;ЭКВАЛАЙЗЕР
;MIXERCONTROL. Bounds dwMinimum член.
 
;MIXER и MUX
;MIXERLINE член dwLineID.
 
;МНОЖЕСТВЕННЫЙ и ОДИН ИЗБРАННЫЙ
;Неопределенный; должно быть ноль
;
;dwParam2
;Смотрите dwParam1.
;
;szName
;Имя, описывающее один элемент в элементе управления с несколькими элементами. Этот текст может использоваться как текст метки или элемента в зависимости от класса элемента управления.
;замечания
;Следующие стандартные типы элементов управления используют эту структуру для извлечения текстовых описаний элементов в элементах управления с несколькими элементами:
 
;Управление фейдером:
 
;MIXERCONTROL_CONTROLTYPE_EQUALIZER
 
;Список элементов управления:
 
;MIXERCONTROL_CONTROLTYPE_MIXER
;MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT
;MIXERCONTROL_CONTROLTYPE_MUX
;MIXERCONTROL_CONTROLTYPE_SINGLESELECT
;}
;};
;{;
 
Structure MMIXERCONTROLDETAILS_BOOLEAN
  fValue.f
EndStructure
Structure MMIXERCONTROLDETAILS_UNSIGNED
  dwValue.l
EndStructure
Structure MMIXERCONTROLDETAILS_SIGNED
  lValue.i
EndStructure
 
Structure MMIXERCAPS
  wMid.w
  wPid.w
  vDriverVersion.l
  szPname.s{32};.c[32]; с первым можно строку копировать без peeks()
  fdwSupport.l
  cDestinations.l
EndStructure
 
Structure HMixer;тупо для ссылки на процедуры
  hMixer.l
EndStructure
#CALLBACK_WINDOW=$00010000;для указания обратного вызова в окно
;сообщения msg окну от  микшера
#MM_MIXM_LINE_CHANGE =$3D0
#MM_MIXM_CONTROL_CHANGE =$3D1
;}
 
 
Procedure Error(funkciy$,ohibka.i)
  Select  ohibka
           Case #MIXERR_BASE
               MessageRequester(funkciy$,"Минимальное значение кода ошибки микшера")  
           Case #MIXERR_INVALLINE
               MessageRequester(funkciy$,"Недопустимый индекс/идентификатор линии")
            Case #MIXERR_INVALCONTROL
              MessageRequester(funkciy$,"Недопустимый индекс/идентификатор элемента управления")
            Case #MIXERR_INVALVALUE
              MessageRequester(funkciy$,"Недопустимое значение элемента управления")
            Case #MIXERR_LASTERROR
               MessageRequester(funkciy$,"Максимальное значение кода ошибки микшера")
            Case #MMSYSERR_ALLOCATED
               MessageRequester(funkciy$,"Устройство занято другим приложением")
            Case #MMSYSERR_BADDEVICEID
              MessageRequester(funkciy$,"Недопустимый номер устройства")
            Case #MMSYSERR_NOTENABLED
               MessageRequester(funkciy$,"Драйвер не активизирован")  
            Case #MMSYSERR_INVALFLAG
               MessageRequester(funkciy$,"Один или несколько флагов недействительны.")      
            Case #MMSYSERR_INVALHANDLE
               MessageRequester(funkciy$,"Недопустимый дискриптор открытого устройства")  
            Case #MMSYSERR_INVALPARAM
              MessageRequester(funkciy$,"Один или несколько параметров недействительны.")
            Case #MMSYSERR_NODRIVER
              MessageRequester(funkciy$,"Драйвер отсутствует")
            Case #MMSYSERR_NOMEM
              MessageRequester(funkciy$,"Недостаточно памяти для выделения")
            Case #MMSYSERR_NOTSUPPORTED
              MessageRequester(funkciy$,"Запрошенная функция не поддерживается")
            Case #MMSYSERR_HANDLEBUSY
              MessageRequester(funkciy$,"Над ключом выполняется операция от другой задачи (thread)")
            ;Case #MMSYSERR_NODRIVERCB 
              ;MessageRequester(funkciy$,"Драйвер не выполнил уведомления (callback)")  
            Case #MMSYSERR_BADERRNUM
              MessageRequester(funkciy$,"Код ошибки вне допустимого диапазона")
             Case #MMSYSERR_ERROR
              MessageRequester(funkciy$,"Неопределенная ошибка")          
          EndSelect
EndProcedure
;Открытие и Закрытие микшера
 
Procedure.i OpenMixer(DEVICEID.i,*HMixer.HMixer,flag.i,*dwCallback=0);получаем дискриптор устройства
  Protected idmikhera.l
  Protected result.i
  result= mixerGetID_(DEVICEID,@idmikhera,flag)
     If result=#MMSYSERR_NOERROR
       result= mixerOpen_(*HMixer.hMixer,idmikhera, *dwCallback, 0,flag)
        If result=#MMSYSERR_NOERROR
           ProcedureReturn 1
        Else
          Error("Error OpenMixer()",result)
        ProcedureReturn 0
        EndIf  
     Else
       Error("Error mixerGetID() V OpenMixer()-",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i OpenMixer2(DEVICEID.i,*HMixer.HMixer,flag.i,*dwCallback=0);получаем дискриптор устройства
 
  Protected result.i
     result= mixerOpen_(*HMixer.HMixer,DEVICEID, *dwCallback, 0,flag)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error OpenMixer2()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i CloseMixer(*HMixer);получаем дискриптор устройства
 Protected Mixer.i
 !mov dword eax,[p.p_HMixer]
 !mov dword eax,[eax]
 !mov dword [p.v_Mixer],eax
  If mixerClose_(Mixer)=#MMSYSERR_NOERROR
       !mov dword eax,[p.p_HMixer]
       !mov dword [eax],0
    ProcedureReturn 1
  Else
    MessageRequester("Error CloseMixer()","INVALIDE_HANDLE hMixer")
    ProcedureReturn 0
  EndIf
EndProcedure
;Получение идентификатора различных микшеров
Procedure.i MixerGetID(DEVICEID.i,flag.i);получаем id устройства
Protected idmikhera.i
  Protected result.i
     result= mixerGetID_(DEVICEID,@idmikhera,flag)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn idmikhera
     Else
       Error("Error MixerGetID()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;Опрос устройств
Procedure.i mixerGetDevCaps(DEVICEID.i,*MMIXERCAPS.MMIXERCAPS,sizeMMIXERCAPS.i);определение возможностей микшера
  Protected result.i
     result= mixerGetDevCaps_(DEVICEID,*MMIXERCAPS.MMIXERCAPS,sizeMIXERCAPS)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetDevCaps()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i mixerGetNumDevs();определение количесва микшерерных устройств или 0=недоступны
  ProcedureReturn mixerGetNumDevs_()
EndProcedure
;Получение Линии Управления
;{;flagi_Controls
#MIXER_GETLINECONTROLSF_ALL=$0
;Параметр pmxlc ссылается на список структур MIXERCONTROL, которые будут получать информацию обо всех элементах управления, связанных со звуковой линией,
;идентифицированной членом dwLineID структуры MIXERLINECONTROLS. Член cControls должен быть инициализирован числом элементов управления,
;связанных со строкой. Этот номер извлекается из члена cControls структуры MIXERLINE, возвращаемой функцией mixerGetLineInfo. Член cbmxctrl должен быть
;инициализирован в размере, в байтах, одной структуры MIXERCONTROL. Член pamxctrl должен указывать на первую структуру MIXERCONTROL, которая будет заполнена. Члены dwControlID и dwControlType игнорируются для этого запроса
;
#MIXER_GETLINECONTROLSF_ONEBYID=$1
;Параметр pmxlc ссылается на одну структуру MIXERCONTROL, которая будет получать информацию об элементе управления, идентифицированном членом dwControlID
;структуры MIXERCONTROL. Член pamxctrl должен указывать на структуру MIXERCONTROL, которая должна быть заполнена. Члены dwLineID и dwControlType
;игнорируются для этого запроса. Этот запрос обычно используется для обновления элемента управления после получения сообщения уведомления об изменении
;элемента управления MM_MIXM_CONTROL_CHANGE с помощью пользовательского обратного вызова (см. MixerOpen)
#MIXER_GETLINECONTROLSF_ONEBYTYPE=$2
;Функция mixerGetLineControls извлекает информацию о первом элементе управления определенного класса для запрашиваемой звуковой линии. Параметр pmxlc
;ссылается на одну структуру MIXERCONTROL, которая будет получать информацию о конкретном элементе управления. Аудио линия идентифицируется членом dwLineID. Класс управления указан в члене dwControlType структуры MIXERLINECONTROLS.
;Член dwControlID игнорируется для этого запроса. Этот запрос может использоваться приложением для получения информации об одном элементе управления,
;связанном со строкой. Например, вы можете захотеть, чтобы ваше приложение использовало пиковый измеритель только из выходной звуковой линии.
;
#MIXER_OBJECTF_MIXER=$0
;Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств,
;возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;
#MIXER_OBJECTF_WAVEOUT=$10000000
;Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств,
;возвращаемых функцией waveOutGetNumDevs.
;
#MIXER_OBJECTF_WAVEIN=$20000000
;Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств,
;возвращаемых функцией waveInGetNumDevs.
;
#MIXER_OBJECTF_MIDIOUT=$30000000
;Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше,
;чем количество устройств, возвращаемых функцией midiOutGetNumDevs
;
#MIXER_OBJECTF_MIDIIN=$40000000
;Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше,
;чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;
#MIXER_OBJECTF_AUX=$50000000
;Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых
;функцией auxGetNumDevs.
;
#MIXER_OBJECTF_HMIXER=$80000000
;Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;
#MIXER_OBJECTF_HWAVEOUT=$90000000
;Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;
#MIXER_OBJECTF_HWAVEIN=$A0000000
;Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;
#MIXER_OBJECTF_HMIDIOUT=$B0000000
;Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen
;
#MIXER_OBJECTF_HMIDIIN=$C0000000
;Параметр hmxobj является дескриптором устройства ввода MIDI. Этот дескриптор должен быть возвращен функцией midiInOpen.
;
#MIXER_OBJECTF_HANDLE=$80000000;?
;}
Procedure.i mixerGetLineControls(descriptor.i,*MIXERLINECONTROLS.MIXERLINECONTROLS,flagi_Controls.i)
    Protected result.i
     result= mixerGetLineControls_(descriptor,*MIXERLINECONTROLS.MIXERLINECONTROLS,flagi_Controls)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetLineControls()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;Получение информации о линии
;{;flagi mixerGetLineInfo
;#MIXER_GETLINEINFOF_COMPONENTTYPE Запрос по компоненту
;#MIXER_GETLINEINFOF_LINEID Запрос по идентификатору линии, заданному полем dwLineID.
;#MIXER_GETLINEINFOF_DESTINATION Запрос по индексу входной линии, заданному полем dwDestination.
;#MIXER_GETLINEINFOF_SOURCE Запрос по индексу входной линии, заданному полем dwDestination, и индексу соединенной с нею выходной линии, заданному полем dwSource
;#MIXER_GETLINEINFOF_TARGETTYPE Запрос по параметрам устройства, заданным полями dwType, wMid, wPid, vDriverVersion и szPname структуры Target. Не допускается указание UNDEFINED в поле dwType.
;#MIXER_GETLINEINFOF_QUERYMASK
;};
Procedure.i mixerGetLineInfo(descriptor.i,*MIXERLINE.MIXERLINE,flagi.i)
      Protected result.i
     result= mixerGetLineInfo_(descriptor,*MIXERLINE.MIXERLINE,flagi)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetLineInfo()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
Procedure.i VizualstructuraMIXERLINE(*MIXERLINE.MIXERLINE)
  Protected result$
  result$+"dwDestination  "+Str(*MIXERLINE\dwDestination)+#CRLF$
  result$+"dwSource  "+Str(*MIXERLINE\dwSource)+#CRLF$
  result$+"dwLineID  "+Str(*MIXERLINE\dwLineID)+#CRLF$
  result$+"fdwLine  "+Str(*MIXERLINE\fdwLine)
  Select *MIXERLINE\fdwLine
    Case #MIXERLINE_LINEF_ACTIVE
      result$+" #MIXERLINE_LINEF_ACTIVE (Аудио линия активна)"
    Case #MIXERLINE_LINEF_DISCONNECTED
      result$+"#MIXERLINE_LINEF_DISCONNECTED (Аудио линия отключена)"
    Case #MIXERLINE_LINEF_SOURCE
      result$+" #MIXERLINE_LINEF_SOURCE (Линия аудио - это строка аудиоисточника, связанная с одной линией аудио назначения)"
  EndSelect
  result$+#CRLF$
  result$+"dwUser "+Str(*MIXERLINE\dwUser)+#CRLF$
  result$+"dwComponentType  "+Str(*MIXERLINE\dwComponentType)
 
 
Select *MIXERLINE\dwComponentType
  Case #MIXERLINE_COMPONENTTYPE_DST_DIGITAL
   result$+" #MIXERLINE_COMPONENTTYPE_DST_DIGITAL (Аудио линия - это цифровое назначение (например, цифровой вход на аудиоустройство DAT или CD)"
  Case #MIXERLINE_COMPONENTTYPE_DST_HEADPHONES
   result$+" #MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (Аудио линия - место назначения, предназначенное для подключения наушников)"
  Case #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
   result$+" #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (Аудио линия - это регулируемое (усиление и / или затухание) место назначения, предназначенное для управления динамиками)"
  Case #MIXERLINE_COMPONENTTYPE_DST_LINE
   result$+" #MIXERLINE_COMPONENTTYPE_DST_LINE (Аудио линия - это пункт назначения линейного уровня (например, вход линейного уровня с аудиоустройства CD), который будет конечным источником записи для аналого-цифрового преобразователя (АЦП))"
  Case #MIXERLINE_COMPONENTTYPE_DST_WAVEIN
   result$+" #MIXERLINE_COMPONENTTYPE_DST_WAVEIN (Аудио линия - это пункт назначения, который будет конечным источником записи для входа аудио сигнала (АЦП))"
  Case #MIXERLINE_COMPONENTTYPE_DST_MONITOR
   result$+" #MIXERLINE_COMPONENTTYPE_DST_MONITOR (Аудио линия - это пункт назначения, используемый для монитора)"
  Case #MIXERLINE_COMPONENTTYPE_DST_TELEPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (Аудио линия - это пункт назначения, который будет направлен на телефонную линию)"
  Case #MIXERLINE_COMPONENTTYPE_DST_UNDEFINED
   result$+" #MIXERLINE_COMPONENTTYPE_DST_UNDEFINED (Аудио линия - это пункт назначения, который не может быть определен одним из стандартных типов компонентов. Устройство микшера должно использовать этот тип компонента для типов линейных компонентов, которые не были определены Microsoft Corporation)"
  Case #MIXERLINE_COMPONENTTYPE_DST_VOICEIN
   result$+" #MIXERLINE_COMPONENTTYPE_DST_VOICEIN (Аудио линия - это пункт назначения, который будет конечным источником записи для голосового ввода)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_DIGITAL  
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (Аудио линия - это цифровой источник (например, цифровой выход с DAT или аудио CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_ANALOG
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_ANALOG (Аудио линия - это аналоговый источник (например, аналоговый выход с видеокассеты)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (Аудио линия - это цифровое назначение (например, цифровой вход на аудиоустройство DAT или CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (Аудио линия - это источник, исходящий из выхода внутреннего аудио CD)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_LINE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_LINE (Аудио линия - это источник линейного уровня (например, вход линейного уровня от внешнего стерео)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_MICROPHON (Аудио линия является источником записи микрофона)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (Аудио линия - это источник, исходящий из динамика компьютера)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (Аудио линия - это источник, исходящий из выхода внутреннего синтезатора. Большинство звуковых карт для персональных компьютеров имеют своего рода синтезатор MIDI)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (Аудио линия - это источник, исходящий из входящей телефонной линии)"
  Case #MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED
   result$+" #MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED (Аудио линия - это источник, который не может быть определен одним из стандартных типов компонентов. Устройство микшера должно использовать этот тип компонента для типов компонентов линии, которые не были определены Microsoft)"
EndSelect
result$+#CRLF$
result$+"cChannels  "+Str(*MIXERLINE\cChannels)+#CRLF$
result$+"cConnections  "+Str(*MIXERLINE\cConnections)+#CRLF$
result$+"cControls  "+Str(*MIXERLINE\cControls)+#CRLF$
Protected r.i=*MIXERLINE.MIXERLINE
r+40
result$+"szShortName  "+PeekS(r,-1,#PB_Unicode)+#CRLF$
r+32
result$+"szName  "+PeekS(r,-1,#PB_Unicode)+#CRLF$
 
result$+"Target\dwType  "+Str(*MIXERLINE\Target\dwType)
Select *MIXERLINE\Target\dwType
  Case #MIXERLINE_TARGETTYPE_AUX
    result$+" #MIXERLINE_TARGETTYPE_AUX(строго привязана к вспомогательному устройству, подробно описанному в оставшихся элементах элемента Target)"
  Case #MIXERLINE_TARGETTYPE_MIDIIN
    result$+" #MIXERLINE_TARGETTYPE_MIDIIN(строго привязана к устройству ввода MIDI, подробно описанному в остальных членах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_MIDIOUT
    result$+" #MIXERLINE_TARGETTYPE_MIDIOUT(строго привязана к устройству вывода MIDI, подробно описанному в остальных членах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_UNDEFINED
    result$+" #MIXERLINE_TARGETTYPE_UNDEFINED(не привязана строго к определенному типу медиа. Все остальные члены целевой структуры структуры MIXERLINE следует игнорировать)"
  Case #MIXERLINE_TARGETTYPE_WAVEIN
    result$+" MIXERLINE_TARGETTYPE_WAVEIN(строго привязана к устройству ввода аудио-формы сигнала, подробно описанному в оставшихся элементах члена структуры Target)"
  Case #MIXERLINE_TARGETTYPE_WAVEOUT
    result$+" #MIXERLINE_TARGETTYPE_WAVEOUT(строго привязана к устройству вывода аудио-формы сигнала, подробно описанному в оставшихся элементах члена целевой структуры структуры MIXERLINE)"
EndSelect
result$+#CRLF$
result$+"Target\dwDeviceID  "+Str(*MIXERLINE\Target\dwDeviceID)+#CRLF$
 
;e.w=*MIXERLINE\Target\wMid
;result$+"Target\wMid  "+Str(e)+#CRLF$
result$+"Target\wMid  "+Str(*MIXERLINE\Target\wMid)+#CRLF$
result$+"Target\wPid  "+Str(*MIXERLINE\Target\wPid)+#CRLF$
result$+"Target\vDriverVersion  "+Str(*MIXERLINE\Target\vDriverVersion)+#CRLF$
 
r+144
result$+"Target\szPname "+PeekS(r,-1,#PB_Unicode)
 
 MessageRequester("Информация структуры MIXERLINE",result$)
EndProcedure
 
;Изменение атрибутов управления
;{;flagi_Details
;MIXER_GETCONTROLDETAILSF_LISTTEXT Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур MIXERCONTROLDETAILS_LISTTEXT для получения текстовых меток для элементов управления из нескольких элементов. Приложение должно получить все элементы текста списка для элемента управления из нескольких элементов одновременно. Этот флаг нельзя использовать с элементами управления MIXERCONTROL_CONTROLTYPE_CUSTOM.
;MIXER_GETCONTROLDETAILSF_VALUE Получены текущие значения для элемента управления. Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур деталей, соответствующих классу управления.
;MIXER_OBJECTF_AUX Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией auxGetNumDevs.
;MIXER_OBJECTF_HMIDIIN Параметр hmxobj является дескриптором устройства ввода MIDI (цифровой интерфейс музыкальных инструментов). Этот дескриптор должен быть возвращен функцией midiInOpen.
;MIXER_OBJECTF_HMIDIOUT Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen.
;MIXER_OBJECTF_HMIXER Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;MIXER_OBJECTF_HWAVEIN Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;MIXER_OBJECTF_HWAVEOUT Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;MIXER_OBJECTF_MIDIIN Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;MIXER_OBJECTF_MIDIOUT Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiOutGetNumDevs.
;MIXER_OBJECTF_MIXER Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;MIXER_OBJECTF_WAVEIN Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveInGetNumDevs.
;MIXER_OBJECTF_WAVEOUT Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveOutGetNumDevs.
;}
Procedure.i mixerGetControlDetails(descriptor.i,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details.i)
  Protected result.i
     result= mixerGetControlDetails_(descriptor,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerGetControlDetails()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;{;flagi_Details
;MIXER_OBJECTF_AUX Параметр hmxobj является идентификатором вспомогательного устройства в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией auxGetNumDevs.
;MIXER_OBJECTF_HMIDIIN Параметр hmxobj является дескриптором устройства ввода MIDI. Этот дескриптор должен быть возвращен функцией midiInOpen.
;MIXER_OBJECTF_HMIDIOUT Параметр hmxobj является дескриптором устройства вывода MIDI. Этот дескриптор должен быть возвращен функцией midiOutOpen.
;MIXER_OBJECTF_HMIXER Параметр hmxobj - это дескриптор устройства микшера, возвращаемый функцией mixerOpen. Этот флаг не является обязательным.
;MIXER_OBJECTF_HWAVEIN Параметр hmxobj является дескриптором ввода аудио-формы сигнала, возвращаемого функцией waveInOpen.
;MIXER_OBJECTF_HWAVEOUT Параметр hmxobj является дескриптором звукового сигнала, возвращаемого функцией waveOutOpen.
;MIXER_OBJECTF_MIDIIN Параметр hmxobj является идентификатором устройства ввода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiInGetNumDevs.
;MIXER_OBJECTF_MIDIOUT Параметр hmxobj является идентификатором устройства вывода MIDI. Этот идентификатор должен находиться в диапазоне от нуля до единицы меньше, чем количество устройств, возвращаемых функцией midiOutGetNumDevs.
;MIXER_OBJECTF_MIXER Параметр hmxobj - это идентификатор устройства микшера в диапазоне от нуля до единицы, который меньше количества устройств, возвращаемых функцией mixerGetNumDevs. Этот флаг не является обязательным.
;MIXER_OBJECTF_WAVEIN Параметр hmxobj является идентификатором устройства ввода аудио-сигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveInGetNumDevs.
;MIXER_OBJECTF_WAVEOUT Параметр hmxobj является идентификатором устройства вывода аудиосигнала в диапазоне от нуля до единицы, который меньше числа устройств, возвращаемых функцией waveOutGetNumDevs.
;MIXER_SETCONTROLDETAILSF_CUSTOM Отображается пользовательское диалоговое окно для указанного пользовательского элемента управления микшером. Устройство микширования собирает необходимую информацию от пользователя и возвращает данные в указанный буфер. Дескриптор окна-владельца указывается в члене hwndOwner структуры MIXERCONTROLDETAILS. (Этот дескриптор может быть установлен в NULL.) Затем приложение может сохранить данные из диалогового окна и использовать их позже, чтобы сбросить элемент управления в то же состояние с помощью флага MIXER_SETCONTROLDETAILSF_VALUE.
;MIXER_SETCONTROLDETAILSF_VALUE Текущие значения для элемента управления установлены. Член paDetails структуры MIXERCONTROLDETAILS указывает на одну или несколько структур сведений о контроллере микшера соответствующего класса для управления.
;}
Procedure.i mixerSetControlDetails(descriptor.i,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details.i)
    Protected result.i
     result= mixerSetControlDetails_(descriptor,*MIXERCONTROLDETAILS.MIXERCONTROLDETAILS,flagi_Details)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerSetControlDetails()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;
Procedure.i mixerMessage(DriverID.i,msg.i,wParam1.i,wParam2.i); отправляет пользовательское сообщение драйвера микшера непосредственно в драйвер микшера.
      Protected result.i
     result= mixerMessage_(DriverID,msg,wParam1,wParam2)
     If result=#MMSYSERR_NOERROR
       ProcedureReturn 1
     Else
       Error("Error mixerMessage()",result)
       ProcedureReturn 0
     EndIf
EndProcedure
;
;общий ввод вывод
Procedure.i GetDeviceCount(devmode.l);
  Select devmode
        Case  #MIXER_OBJECTF_AUX
           devmode = auxGetNumDevs_()
        Case #MIXER_OBJECTF_MIXER, #MIXER_OBJECTF_HMIXER
           devmode = mixerGetNumDevs_()
        Case #MIXER_OBJECTF_WAVEIN, #MIXER_OBJECTF_HWAVEIN
           devmode = waveInGetNumDevs_()
        Case #MIXER_OBJECTF_WAVEOUT, #MIXER_OBJECTF_HWAVEOUT
           devmode = waveOutGetNumDevs_()
        Case #MIXER_OBJECTF_MIDIIN, #MIXER_OBJECTF_HMIDIIN
          devmode = midiInGetNumDevs_()
        Case #MIXER_OBJECTF_MIDIOUT, #MIXER_OBJECTF_HMIDIOUT
           devmode = midiOutGetNumDevs_()
       EndSelect
   ProcedureReturn devmode
EndProcedure
Procedure.s GetDeviceName(Index.l,devmode.l)
  DeviceName.s;{32}
  udtDevAU.AUXCAPS
  udtDevMX.MMIXERCAPS
    udtDevWO.WAVEOUTCAPS
    udtDevWI.WAVEINCAPS
    udtDevMI.MIDIINCAPS
    udtDevMO.MIDIOUTCAPS
   
    Select devmode
        Case  #MIXER_OBJECTF_AUX
          auxGetDevCaps_(Index, udtDevAU, SizeOf(AUXCAPS))
          DeviceName = PeekS(@udtDevAU\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIXER, #MIXER_OBJECTF_HMIXER
            mixerGetDevCaps_(Index, udtDevMX, SizeOf(MMIXERCAPS))
            DeviceName =udtDevMX\szPname; PeekS(@udtDevMX\szPname,-1,#PB_Unicode)  
        Case #MIXER_OBJECTF_WAVEIN, #MIXER_OBJECTF_HWAVEIN
            waveInGetDevCaps_(Index, udtDevWI, SizeOf(WAVEINCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_WAVEOUT, #MIXER_OBJECTF_HWAVEOUT
             waveOutGetDevCaps_(Index,udtDevWO, SizeOf(WAVEOUTCAPS))
             DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIDIIN, #MIXER_OBJECTF_HMIDIIN
            midiInGetDevCaps_(Index, udtDevMI, SizeOf(MIDIINCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)
        Case #MIXER_OBJECTF_MIDIOUT, #MIXER_OBJECTF_HMIDIOUT
            midiOutGetDevCaps_(Index, udtDevMO, SizeOf(MIDIOUTCAPS))
            DeviceName = PeekS(@udtDevMX\szPname,-1,#PB_Unicode)      
    EndSelect
   
    ProcedureReturn DeviceName
EndProcedure
 
;=======================
 
 
 
 
;Global MIXERCONTROL.MMIXERCONTROL
 
 
;Global MIXERLINECONTROLS.MIXERLINECONTROLS
;MIXERLINECONTROLS\cbStruct=SizeOf(MIXERLINECONTROLS)
;Global mMMIXERCAPS.MMIXERCAPS
;Global MIXERLINE.MIXERLINE
Global hMixer.i
 
;Debug mixerGetNumDevs()
 
;OpenMixer2(0,@hMixer,#MIXER_OBJECTF_HMIXER)
;Debug hMixer
 
;|#CALLBACK_WINDOW
 
;=======================
;Debug SizeOf(mMMIXERCAPS)
;mixerGetDevCaps(hMixer,@mMMIXERCAPS,80);определение возможностей микшера
;mixerGetDevCaps_(hMixer,@mMMIXERCAPS,80)
;Debug mMMIXERCAPS\wMid
;Debug mMMIXERCAPS\wPid
;Debug mMMIXERCAPS\vDriverVersion
;Debug PeekS(@mMMIXERCAPS\szPname,-1,#PB_Unicode)
;Debug mMMIXERCAPS\fdwSupport
;Debug mMMIXERCAPS\cDestinations
;Debug "===========end mixerGetDevCaps============="
;========================
 
 
;MIXERLINE\cbStruct=SizeOf(MIXERLINE)
;MIXERLINE\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_SPEAKERS
;mixerGetLineInfo(hMixer,@MIXERLINE,#MIXER_GETLINEINFOF_COMPONENTTYPE);Запрос по типу линии, заданному полем dwComponentType
;VizualstructuraMIXERLINE(@MIXERLINE);визуально просмотреть параметры структуры MIXERLINE
;==============
 
 
 
;MIXERLINECONTROLS\dwControlID
   ;#MIXER_GETLINECONTROLSF_ONEBYID
   ; MIXERLINECONTROLS\dwLineID = MIXERLINE\dwLineID
   ; MIXERLINECONTROLS\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME;#MIXERCONTROL_CONTROLTYPE_MUTE
   ; MIXERLINECONTROLS\cControls = 1
    ;MIXERLINECONTROLS\cbmxctrl = SizeOf(MIXERCONTROL)
   ; MIXERLINECONTROLS\pamxctrl = @MIXERCONTROL
;mixerGetLineControls(hMixer,@MIXERLINECONTROLS,#MIXER_GETLINECONTROLSF_ONEBYTYPE);
 
;Debug MIXERCONTROL\dwControlID
;Debug MIXERCONTROL\dwControlType
;Debug PeekS(@MIXERCONTROL\szShortName,-1,#PB_Unicode)
;Debug PeekS(@MIXERCONTROL\szName,-1,#PB_Unicode)
;Debug MIXERCONTROL\cbCustomData
;Debug MIXERCONTROL\fdwControl
;Debug MIXERCONTROL\cSteps
;Debug MIXERCONTROL\cMultipleItems
;Debug MIXERCONTROL\DUMMYSTRUCTNAME\lMinimum
;Debug MIXERCONTROL\DUMMYSTRUCTNAME\lMaximum
;Debug MIXERCONTROL\DUMMYSTRUCTNAME2\dwMinimum
;Debug MIXERCONTROL\DUMMYSTRUCTNAME2\dwMaximum
 
 
;==========================================================
;Global MIXERCONTROLDETAILS.MIXERCONTROLDETAILS
;Global MIXERCONTROLDETAILS_BOOLEAN.MMIXERCONTROLDETAILS_BOOLEAN
   
   
  ;  MIXERCONTROLDETAILS\cbStruct = SizeOf(MIXERCONTROLDETAILS)
  ;  MIXERCONTROLDETAILS\cChannels = MIXERLINE\cChannels
   ; MIXERCONTROLDETAILS\dwControlID = MIXERCONTROL\dwControlID
 ;  MIXERCONTROLDETAILS\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
  ;  MIXERCONTROLDETAILS\paDetails = @MIXERCONTROLDETAILS_BOOLEAN
 
  ;  mixerGetControlDetails(hMixer,@MIXERCONTROLDETAILS,#MIXER_GETCONTROLDETAILSF_VALUE)
   ;  Debug MIXERCONTROLDETAILS_BOOLEAN\fValue
     
     
     
 ;===========
  ;   Global MIXERCONTROLDETAILS_LISTTEXT.MIXERCONTROLDETAILS_LISTTEXT
  ;   MIXERCONTROLDETAILS_LISTTEXT\dwParam1=MIXERLINE\dwLineID
     
   ; MIXERCONTROLDETAILS\cbStruct = SizeOf(MIXERCONTROLDETAILS)
  ;  MIXERCONTROLDETAILS\cChannels = MIXERLINE\cChannels
  ;  MIXERCONTROLDETAILS\dwControlID = MIXERCONTROL\dwControlID
  ;  MIXERCONTROLDETAILS\cbDetails = SizeOf(MIXERCONTROLDETAILS_LISTTEXT)
  ;  MIXERCONTROLDETAILS\paDetails = @MIXERCONTROLDETAILS_LISTTEXT
   
;mixerGetControlDetails(hMixer,@MIXERCONTROLDETAILS,#MIXER_GETCONTROLDETAILSF_LISTTEXT);пишим в структуру MIXERCONTROLDETAILS_LISTTEXT
 
;Debug PeekS(@MIXERCONTROLDETAILS_LISTTEXT\szName,-1,#PB_Unicode)
    ;Debug MIXERCONTROLDETAILS_LISTTEXT\dwParam1
    ;Debug MIXERCONTROLDETAILS_LISTTEXT\dwParam2
 ;================================================  
    ;Global v.i
   ;auxGetVolume_(0,@v)
    ;Debug v
   
   
   
;Debug GetDeviceName(hMixer,#MIXER_OBJECTF_HMIXER)
;Debug GetDeviceCount(#MIXER_OBJECTF_HMIXER)
;Debug GetDestinationName()
 
Procedure GetDestinationVolume(Index.l,channel.l = -1)
 
    udtMXCD.MIXERCONTROLDETAILS
    udtMXLC.MIXERLINECONTROLS
    udtMXL.MIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MIXERCONTROLDETAILS_UNSIGNED(1)
   
    i.l
    lngVolMax.l
    lngPer.l
 
    If hMixer = 0
        ProcedureReturn -1
    EndIf
 
    ; information about destination
    udtMXL\cbStruct = SizeOf(MIXERLINE)
    udtMXL\dwDestination = Index
 
    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf
 
    ; Control Id of volume setting for destination
    udtMXLC\cbStruct = SizeOf(MIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
   
    udtMXLC\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC
 
    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
         ProcedureReturn -1
    EndIf
 
    ; space for the volume of every channel
    ReDim udtVol.MIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)
 
    ; get the volume for every channel of the destination
    udtMXCD\cbStruct = SizeOf(MIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MIXERCONTROLDETAILS_UNSIGNED)
    udtMXCD\paDetails = @udtVol(0)
 
    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
       ProcedureReturn -1
    EndIf
 
    ; volume in percent
    If channel = -1
        ; all channels, return average
        For i = 0 To udtMXL\cChannels - 1
            lngPer = (udtVol(i)\dwValue / (udtMC\DUMMYSTRUCTNAME\lMaximum - udtMC\DUMMYSTRUCTNAME\lMinimum) * 100)
 
            If lngPer > lngVolMax
                lngVolMax = lngPer
            EndIf
        Next
 
        ProcedureReturn lngVolMax
    Else
        ProcedureReturn udtVol(channel)\dwValue / (udtMC\DUMMYSTRUCTNAME\lMaximum - udtMC\DUMMYSTRUCTNAME\lMinimum) * 100
    EndIf
EndProcedure
Procedure GetSourceVolume(Destination.l,Index.l,channel.l = -1)
 
    udtMXCD.MIXERCONTROLDETAILS
    udtMXLC.MIXERLINECONTROLS
    udtMXL.MIXERLINE
    udtMC.MMIXERCONTROL
    Dim udtVol.MIXERCONTROLDETAILS_UNSIGNED(1)
    i.l
    lngVolMax.l
    lngPer.l
 
    If hMixer = 0
        ProcedureReturn -1
    EndIf
 
    ; information about source
    udtMXL\cbStruct = SizeOf(MIXERLINE)
    udtMXL\dwDestination = Destination
    udtMXL\dwSource = Index
 
    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_SOURCE)
        ProcedureReturn -1
    EndIf
 
    ; get Control Id of volume setting for source
    udtMXLC\cbStruct = SizeOf(MIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC
 
    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
      ProcedureReturn -1
    EndIf
 
 
    ; space for volume of every channel
    ReDim udtVol.MIXERCONTROLDETAILS_UNSIGNED(udtMXL\cChannels - 1)
 
    ; get volume for every channel
    udtMXCD\cbStruct = SizeOf(MIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MIXERCONTROLDETAILS_UNSIGNED)
    udtMXCD\paDetails = @udtVol(0)
 
    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
        ProcedureReturn -1
    EndIf
 
    ; volume in percent
    If channel = -1
        ; all channels requested, return average
                 
        For i = 0 To udtMXL\cChannels - 1
            ;lngPer = (udtVol(i)\fValue / (udtMC\lMaximum - udtMC\lMinimum) * 100)
           
            fx.f = udtVol(i)\dwValue
            lngPer = (fx / (udtMC\DUMMYSTRUCTNAME\lMaximum - udtMC\DUMMYSTRUCTNAME\lMinimum) * 100)
           
           
            If lngPer > lngVolMax
                lngVolMax = lngPer
            EndIf
        Next
 
        ProcedureReturn lngVolMax
    Else
        ProcedureReturn udtVol(channel)\dwValue/ (udtMC\DUMMYSTRUCTNAME\lMaximum - udtMC\DUMMYSTRUCTNAME\lMinimum) * 100
    EndIf
EndProcedure
Procedure GetDestinationMute(Index.l)
 
    udtMXCD.MIXERCONTROLDETAILS
    udtMXLC.MIXERLINECONTROLS
    udtMXL.MIXERLINE
    udtMC.MMIXERCONTROL
    udtMute.MIXERCONTROLDETAILS_BOOLEAN
 
    If hMixer = 0
        ProcedureReturn -1
    EndIf
 
    udtMXL\cbStruct = SizeOf(MIXERLINE)
    udtMXL\dwDestination = Index
 
    If mixerGetLineInfo_(hMixer,udtMXL,#MIXER_GETLINEINFOF_DESTINATION)
        ProcedureReturn -1
    EndIf
 
    ; get the Control Id of mute setting for destination
    udtMXLC\cbStruct = SizeOf(MIXERLINECONTROLS)
    udtMXLC\dwLineID = udtMXL\dwLineID
    udtMXLC\dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE
    udtMXLC\cControls = 1
    udtMXLC\cbmxctrl = SizeOf(MMIXERCONTROL)
    udtMXLC\pamxctrl = @udtMC
 
    If mixerGetLineControls_(hMixer,udtMXLC,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
      ProcedureReturn -1
    EndIf
 
    ; get the mute setting
    udtMXCD\cbStruct = SizeOf(MIXERCONTROLDETAILS)
    udtMXCD\cChannels = udtMXL\cChannels
    udtMXCD\dwControlID = udtMC\dwControlID
    udtMXCD\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
    udtMXCD\paDetails = @udtMute
 
    If mixerGetControlDetails_(hMixer,udtMXCD,#MIXER_GETCONTROLDETAILSF_VALUE)
      ProcedureReturn -1
    EndIf
 
    ProcedureReturn udtMute\fValue
EndProcedure
 
 
 
 
;==========================================================mixer v okne
 
Procedure.i GetVolumeControl(Mixer,*control.MMIXERCONTROL)
  line.mixerline
  controls.mixerlinecontrols
 
  Line\cbStruct = SizeOf(mixerline)
  Line\dwComponentType = #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 
 
  If mixerGetLineInfo(Mixer,@Line,#MIXER_GETLINEINFOF_COMPONENTTYPE)
   
    Controls\cbStruct = SizeOf(mixerlinecontrols);
    Controls\dwLineID = Line\dwLineID;
    Controls\cControls = 1;
    Controls\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME;
    Controls\cbmxctrl = SizeOf(MMIXERCONTROL);
    Controls\pamxctrl = *Control;
       ProcedureReturn mixerGetLineControls_(Mixer,@Controls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
     Else
       ProcedureReturn 0
     EndIf
EndProcedure
 
 
 
Procedure SetVolume(Mixer,value)
  MasterVolume.MMIXERCONTROL
  Details.MIXERCONTROLDETAILS
  UnsignedDetails.MMIXERCONTROLDETAILS_UNSIGNED
  code.l
 
  code=GetVolumeControl(Mixer,@MasterVolume)
  If code=#MMSYSERR_NOERROR
    Details\cbStruct = SizeOf(MIXERCONTROLDETAILS);
    Details\dwControlID = MasterVolume\dwControlID;
    Details\cChannels = 1;  // set all channels
    Details\cMultipleItems= 0;
    Details\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED);
    Details\paDetails = @UnsignedDetails;
    UnsignedDetails\dwValue=Value
    code=mixerSetControlDetails_(Mixer,Details, #MIXER_SETCONTROLDETAILSF_VALUE);
  EndIf
  ProcedureReturn code
EndProcedure
 
Procedure GetVolume(mixer)
  MasterVolume.MMIXERCONTROL
  Details.MIXERCONTROLDETAILS
  UnsignedDetails.MMIXERCONTROLDETAILS_UNSIGNED
  code.l
 
  code=GetVolumeControl(Mixer,@MasterVolume)
  If code=#MMSYSERR_NOERROR
    Details\cbStruct = SizeOf(MIXERCONTROLDETAILS);
    Details\dwControlID = MasterVolume\dwControlID;
    Details\cChannels = 1;  // set all channels
    Details\cMultipleItems= 0;
    Details\cbDetails = SizeOf(MMIXERCONTROLDETAILS_UNSIGNED);
    Details\paDetails = @UnsignedDetails;
    mixerGetControlDetails_(Mixer,Details, #MIXER_SETCONTROLDETAILSF_VALUE);
  EndIf
  ProcedureReturn UnsignedDetails\dwValue
EndProcedure
 
 
Procedure.i mixercalbak(hwnd,msg,wparam,lparam)
 
  Select msg
     
      Case #MM_MIXM_CONTROL_CHANGE;отправляется устройством микшера, чтобы уведомить приложение об изменении состояния элемента управления, связанного со звуковой линией
 
        ; Debug wParam ;Дескриптор к устройству микшера
        ;Debug lParam;dwControlID(Идентификатор элемента управления микшера, который изменил состояние. Этот идентификатор совпадает с элементом dwControlID структуры MIXERCONTROL, возвращаемой функцией GetLineControls)
       Select  lParam
           Case 1
             
 
           
 
  ;code=GetVolumeControl(wParam,@MasterVolume)
 ;Debug  hMixer
 ; Debug wParam
 ; If GetVolumeControl(wParam,@MasterVolume)=0;code=#MMSYSERR_NOERROR
  line.mixerline
 
 
  Line\cbStruct = SizeOf(mixerline)
 ; Line\dwComponentType = #MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
 ;If mixerGetLineInfo(wParam,@Line,#MIXER_GETLINEINFOF_COMPONENTTYPE)
  ;;;;
  ;line\dwLineID=MixerGetID(wParam,#MIXER_OBJECTF_HMIXER);пишет компакт диск
  ;If mixerGetLineInfo(wParam,@Line,#MIXER_GETLINEINFOF_LINEID)
  ;;;;  
   If mixerGetLineInfo(wParam,@Line,#MIXER_OBJECTF_HMIXER)
 
 
 ; Debug Line\cChannels
 ; Debug line\cConnections
 ; Debug line\cControls
  ;  Debug line\dwComponentType
  ;  Debug line\dwDestination
   ; Debug line\dwLineID
  ;  Debug line\dwSource
   ; Debug line\dwUser
   ; Debug line\fdwLine
   ; Debug PeekS(@line\szName,-1,#PB_Unicode)
   ; Debug PeekS(@line\szShortName,-1,#PB_Unicode)
   ; Debug line\Target\dwDeviceID
   ; Debug line\Target\dwType
   ; Debug PeekS(@line\Target\szPname,-1,#PB_Unicode)
   ; Debug line\Target\vDriverVersion
   ; Debug line\Target\wMid
   ; Debug line\Target\wPid
   
    MMIXERCONTROL.MMIXERCONTROL
    ;MMIXERCONTROL\dwControlID=0
   
    controls.mixerlinecontrols
   
    Controls\cbStruct = SizeOf(mixerlinecontrols);
    Controls\dwLineID = Line\dwLineID;
    Controls\cControls = 1;
    Controls\dwControlType = #MIXERCONTROL_CONTROLTYPE_VOLUME;
    Controls\cbmxctrl = SizeOf(MMIXERCONTROL);
    Controls\pamxctrl = @MMIXERCONTROL;
    mixerGetLineControls(wParam,@Controls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
   
     EndIf        
             
   Details.MIXERCONTROLDETAILS
   UnsignedDetails.MMIXERCONTROLDETAILS_UNSIGNED
   
   
   
             
    Details\cbStruct = SizeOf(MIXERCONTROLDETAILS);
    Details\dwControlID = MMIXERCONTROL\dwControlID;
    Details\cChannels = 1;lparam;  // set all channels
    Details\cMultipleItems= 0;
    Details\cbDetails = SizeOf(UnsignedDetails);
    Details\paDetails = @UnsignedDetails;
    mixerGetControlDetails_(wParam,Details, #MIXER_GETCONTROLDETAILSF_VALUE);
 ;EndIf
    Debug UnsignedDetails\dwValue
    SetGadgetState(0,UnsignedDetails\dwValue>>8)
   
           Case 2
             
           Case 3
             
           Case 4
             
           Case 5
             
           Case 6  
             
           
        EndSelect
      Case #MM_MIXM_LINE_CHANGE;отправляется устройством микшера для уведомления приложения об изменении состояния аудиолинии на указанном устройстве
        ; Debug wParam ;Дескриптор к устройству микшера
         ;Debug lParam;dwLineID(Идентификатор линии для аудио линии, которая изменила состояние. Этот идентификатор совпадает с элементом dwLineID структуры MIXERLINE, возвращаемой функцией GetLineInfo)
       
       
  EndSelect
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
 
 
 OpenWindow(0,0,0,100,280,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  SetWindowCallback(@mixercalbak())
 
 OpenMixer2(0,@hMixer,#MIXER_OBJECTF_HMIXER|#CALLBACK_WINDOW,WindowID(0))
 TrackBarGadget(0,10,10,80,20,0,255)
 SetVolume(hMixer,GetGadgetState(0)<<8)
 TrackBarGadget(1,10,30,80,20,0,255)
 TrackBarGadget(2,10,50,80,20,0,255)
 TrackBarGadget(3,10,70,80,20,0,255)
 TrackBarGadget(4,10,90,80,20,0,255)
 TrackBarGadget(5,10,110,80,20,0,255)
 
 
 ;SetGadgetState(0,GetMasterVolume(0)>>8)
 ;SetGadgetState(1,GetSOUNDVolume(0)>>8)
;
; ;Debug GetMasterVolume(0)>>8
;
 Repeat
  Event=WaitWindowEvent()
   If Event=#PB_Event_Gadget
     If EventGadget()=0
       SetVolume(hMixer,GetGadgetState(0)<<8)
     EndIf
 
;    
   EndIf
Until Event=#PB_Event_CloseWindow
 
 
CloseMixer(@hMixer)
 
;Debug hMixer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


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

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB