|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Через миксер получаю доступ к контролам Volume/Mute, что в панели управления-> Аудио. Для этого достаточно миксера MIXERLINECONTROLS и открывать аудио канал не надо. Поэтому обычно в кодах начинают с этого: Код: vbnet 1. 2.
С ба-альшим риском не попасть в требуемый девайс, отчего куча рассуждений по поводу ОС и разных-де звуковых драйверах с кучей горе затычек. У меня у самого поначалу один пример на одном компе только работал, другой только на другом. Код: vbnet 1. 2.
На самом деле правильный прием следующий 1) Получить девайс id через waveOutGetNumDevs/waveInGetDevCaps например тупо по его имени (список Player/Receiver тоже извлекается этими ф-циями) 2) Но id это еще не ByVal uMxId As Long . Поэтому применяется (вытащил из Opal/ptlib и еще гуглил) следующая хитрость кот. дает гарантии: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
hWaveOut -это как раз и есть волшебный ID, кот. безошибочно тыкается в нужный миксер. Но - мне нужны только контролы миксера ( за ручки подергать ), мне не нужен "wav канал", кот. я открыл ф-цией waveOutOpen function В Opal аудио канал используется, но при этом миксер и все дела закрываются по завершении телефонного звонка. Именно это мне не нравится, т.к. нет звонка - не дергается "громкость". Вопрос в чем. Надо ли мне закрывать waveform-audio output device for playback 1) Можно ли это сделать сразу после mixerOpen? 2) Как это написать на VB6 и какие ф-ции использовать? waveOutClose function The waveOutClose function closes the given waveform-audio output device The close operation fails if the device is still playing a waveform-audio buffer that was previously sent by calling waveOutWrite. Before calling waveOutClose, the application must wait for all buffers to finish playing or call the waveOutReset function to terminate playback. waveOutReset function Ptlib делает так, но это слишком заумно. Я фактически использую только управление миксером , т.е. звук в канал не играю. Код: plaintext 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.
3) Код: vbnet 1. 2. 3.
-это API, здесь понятно. А как записать на VB6 и надо ли? следующее: Код: plaintext 1. 2.
4) Код: plaintext 1.
Это что-то типа Код: vbnet 1.
в цикле. 5) А вот то что у меня открыт постоянно (независимо) hMixer да еще и hWaveOut - просто чтоб независимо "дергать за громкость" на работу других приложений (в частности Opal открывает те же самые миксеры и каналы при звонке) - конфликтно-негативно не скажется? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:13 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Тут еще немного информации привел: Мультимедиа. Что делать с wav каналом, кот. я открыл только чтоб получить ID для миксера? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2012, 23:42 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Дмитрий77Вопрос в чем. Надо ли мне закрывать waveform-audio output device for playback 1) Можно ли это сделать сразу после mixerOpen? 2) Как это написать на VB6 и какие ф-ции использовать? Я думаю, чтоб не переживать надо сделать так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
waveOutClose вроде всегда MMSYSERR_NOERROR выводит, я ж с каналом реально не работал, звук в него не запускал. The close operation fails if the device is still playing a waveform-audio buffer that was previously sent by calling waveOutWrite. Второй вариант: Код: vbnet 1.
Т.е. могу вообще hWaveOut не открывать и использовать id mixerOpen function MIXER_OBJECTF_WAVEOUT The uMxId parameter is the identifier of a waveform-audio output device in the range of zero to one less than the number of devices returned by the waveOutGetNumDevs function. Но этот вариант плох, т.к. A "mapper" for audio mixer devices does not currently exist, so a mixer device identifier of -1 is not valid. что в переводе на русский означает что миксер для аудио-устройсва с именем "Default" найден не будет. А хитрость первого метода как раз в том, что можно выбрать устройство что задано в системе "по умолчанию": Код: vbnet 1. 2.
uDeviceID Identifier of the waveform-audio output device to open. It can be either a device identifier or a handle of an open waveform-audio input device. You can also use the following flag instead of a device identifier: Value Meaning WAVE_MAPPER The function selects a waveform-audio output device capable of playing the given format. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 02:34 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Ну я выкладываю целиком тестовый проект, т.к считаю это разумным в связи с полемикой в соседней теме: А что, в VB среде и в "EXE" логика разная? 13100750 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2012, 14:35 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Я работаю много с музыкой. Ты задаешь вопрос в конкретном направлении. Не знаю что тебе в целом конкретно нужно, для чего прога. Я использую библиотеку BASS. На готовых примерах многое чего понял. Возможно: - включать/выключать трек (пауза), общий стоп (отдельные плеера + можно указать на какую карточку, с каналами не играл если карта 8ми канальная) - регулировать: громкость, скорость, PAN, прикручивать: эквалайзер, delay/chorus/reverb - есть примеры конверт. с mp3 - wav, проигр.с переменной (буфера), пример записи в буфер - также показано как можно анализировать звук из плеера по id либо подключившись к каналу записи (микрофон, линейн, микшер...) - звук можно разложить на спектр, есть возможность анализировать по частотно (чем я также занимался. у меня цветомузыка на LPT порте работает. Под ритм управляет выходами). Что у меня не получалось, так это управлять громкостю (общая). Это нужно было делать через API. А все остальное там супер. Правда теги читать я там не умею, либо не нашел. Потом написал свою ф-цию на VB6 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 21:24 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Андрей159Не знаю что тебе в целом конкретно нужно, для чего прога.Конкретно пытаюсь сделать (а чего пытаться -надо делать, весь функционал под контролем) софтфон на базе Opal. От всего что здесь понаписано мне нужно: 1) Отобразить список девайсов (включая default) и выбрать Player/Recorder кот. будут переданы в Opal (в виде буков). 2) Для выбранной пары девайсов мне нужны контролы Volume/mute, т.к. Opal открывает доступ к ним только на момент, когда установлено соединение (через объекты Connection и stream при известном id вызова), при этом эти контролы однозначно определяются выбранными девайсами и к самому Opal никакого отношения не имеют. Такая модель мне не понравилась. Проще было написать свою реализацию в обход опаловских API, не говоря о том что тот сам лезет в Win32::SoundChannel в другую библиотеку ptlib. Ну, в общем-то я со всем этим справился. Самим SoundChannel я заниматься из VB6 не собираюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 00:59 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Код: vbnet 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.
Неа. ид. устройства ввода/вывода мне не попадалось на глаза в Bass.dll. В этом примере устройство выбирается, но .device там просто 1, 2 и т.д. Может в WMI есть хоть немного (список девайсов)... Хотя у тебя там коды, мозги можно сламать, наверное уже близок к завершению ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2012, 04:32 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Короче доделал я с "длинными именами". Крайний "рабочий" вариант прилагается, кому интересно. Но, куча недостатков. 1) waveOut(In)Open делать неправильно. Канал может оказаться заблокирован, локализован и т.п. (например моим же приложением со стороны Opal) и вместо hWaveIn будет ошибка. Причем если сразу его Close как я делаю, то на Висте (на 7-ке почему-то нет) контрол "потеряет управление". 2) На 7-ке "почти работает" -громкость микрофона почему-то не регулируется до нуля. Вообще говоря надо убрать "поправку для микрофона"(где я ищу MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE -это только для XP надо) - или на 7-ке только для миксера микрофона для рекордера будет работать. Причем recorder включается или не включается для разных миксеров в завис. от того чего из панели управления про аудио открыто и т.п.. 3) Попробовал делать поиск миксера через mixerGetDevCaps вместо waveOut(In) -ничего не помогает. На Висте для recorder вообще ничего не работает (работает только с большим скрипом при открытом через waveInOpen хандле hWaveIn -как сейчас понимаю Opal только за счет этого умеет регулировать громкость микрофона на Висте (делает это через свой hWaveIn, который открывается на время вызова). 4) Ну и насчет мастер Volume для Player -как правильно было замечено. Хотя к управлению "индивидуальным контролом" претензий вроде нет. Вкратце, на 7-ке и Висте это кухня глючит по части рекордера, при этом конкретно на Висте глючит по страшной. Видимо придется все-таки доосваивать Windows Core Audio APIs Но начало вроде положено (с длинными именами устройств), попробую добить, зря чтоль старался. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2012, 04:33 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Короче выложу на всяк. случай крайний вариант: Дмитрий77Вкратце, на 7-ке и Висте это кухня глючит по части рекордера, при этом конкретно на Висте глючит по страшной.Видимо придется все-таки доосваивать Windows Core Audio APIs . Сделал все через Windows Core Audio APIs (независимый код). Теперь на висте и 7-ке как часики. В принципе по этому методу даже в чем то проще, когда уже врубился. Не понял как делать CallBack (это когда меняешь громкость виндовыми органами) и приложение синхронно все отображает. IAudioEndpointVolume::RegisterControlChangeNotify но примеров для VB нет, метод тыка пока приводит к крашам. Да и бог с ним, не больно надо. Можно по таймеру долбить (как во французском примере), но это уж слишком просто. Дмитрий771) waveOut(In)Open делать неправильно. Канал может оказаться заблокирован, локализован и т.п. (например моим же приложением со стороны Opal) и вместо hWaveIn будет ошибка. Причем если сразу его Close как я делаю, то на Висте (на 7-ке почему-то нет) контрол "потеряет управление". Совершенно не обязательно открывать канал через waveOut(In)Open чтобы найти дефолтный девайс, это можно сделать не открывая канала, а потом открыть миксер по реальному индексу. Т.е. ответ на вопрос топика Как правильно закрыть канал? будет: не надо его вообще открывать чтоб не иметь проблем . Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
MIXER_OBJECTF_WAVEOUT The uMxId parameter is the identifier of a waveform-audio output device in the range of zero to one less than the number of devices returned by the waveOutGetNumDevs function Реальная (хотя и не очень существенная) проблема осталась одна (на XP): Дмитрий77Вообще говоря надо убрать "поправку для микрофона"(где я ищу MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE -это только для XP надо)" Если взглянуть в Панель управления -> Звуки и аудиоустройства -> Аудио -> запись звука -> Громкость, то там несколько контролов: Громкость CD, Микрофон, Громк. вх. линии (источники звука для аудио карты). Мой код всегда ищет только микрофон Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Громкость CD, Микрофон, Громк. вх. линии Как правило только один из них может быть выбран: отмечено "выбрать". Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран). Нет идей как сделать? Возможно MIXERLINE ->fdwLine Status and support flags for the audio line. This member is always returned to the application and requires no initialization. MIXERLINE_LINEF_ACTIVE Audio line is active. An active line indicates that a signal is probably passing through the line. Но не уверен. По хорошему при изменении источника (галочка "выбрать") контрол автоматически должен перестраиваться на регулировку громкости от другого источника. Вот думаю, есть ли такой волщебный флаг, или надо это отслеживать как-то. Программу которая автоматически и без перезагрузки детектит изменение выбора источника я видел. На висте/win7 эта проблема вообще отсутствует, там для каждого источника свой миксер. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2012, 22:40 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Дмитрий77Громкость CD, Микрофон, Громк. вх. линии Как правило только один из них может быть выбран: отмечено "выбрать". Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран). Ну это сделал через анализ MIXERCONTROL_CONTROLTYPE_MUX. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2012, 16:55 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Дмитрий77Дмитрий77Громкость CD, Микрофон, Громк. вх. линии Как правило только один из них может быть выбран: отмечено "выбрать". Т.е. чтоб сделать совсем по-нормальному надо автоматически привязать контрол к "выбранному" там источнику, а не к микрофону (который не обязательно выбран). Ну это сделал через анализ MIXERCONTROL_CONTROLTYPE_MUX. А никто мне этот крайний кусок кода не покритикует? Где я с MUX вожусь. Пример который sound_my9.zip якобы работал безупречно (сам по себе), но при добавлении в проект где использую Opal API стал безбожно глючить (только на XP) самым непонятным и случайным образом. То вроде запускается, то память не может быть read, OutOfMemory, ошибки в ntdll.dll. И все это без каких либо закономерностей. Все же понял что напортачил с MUX. И даже "исправил" двумя заменами типа Код: vbnet 1.
на Код: vbnet 1.
Но мне казалось что и как было нормально. Что сделал не понял, ну т.е. понял что захапал памяти с перестраховкой и это возможно спасло. Вот полный "сомнительный" код: Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2012, 06:23 |
|
Аудио мультимедиа кто серьезно занимался. Как правильно закрыть канал и миксер на VB6?
|
|||
---|---|---|---|
#18+
Дергать ползунком Звук (4104), Синтезатор (4100), Микрофон (4099), Громк. CD (4101), я умею. Но никак не пойму как добраться до ползунков Front, Rear и Side 8ми канальной карты. Методом тыка нашел Front (.dwComponentType = 4106). И даже Общую громкость (.dwComponentType = 4). Но вот как получить тот же Rear я пока что не знаю. Может кто подскажет куда копать? Вообще задача в раздельном выводе звука на каждый канал 8ми к. звуковой карты. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2014, 21:04 |
|
|
start [/forum/topic.php?fid=60&msg=37977789&tid=2156142]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 299ms |
total: | 468ms |
0 / 0 |