Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

ошибка waveOutClose

Привет!

Я пишу dll библиотеку для работы со звуком. Для этого использую
библиотеку winmm.lib. Возникла проблема, с закрытием устройства.
Если я открываю waveOutOpen() и закрываю устройство в вызовах
моей dll, то все хорошо. Но если я закрываю устройство
в DllMain на DLL_PROCESS_DETACH, то waveOutClose ругается
MMSYSERR_NOTENABLED. Не зависимо от того где устройство было открыто,
в отдельном вызове или при DLL_PROCESS_ATTACH. Что бы это значило?

// псевдокод
HWAVEOUT mm_device;
DllMain()
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
res = waveOutOpen(&mm_device, 0, &pcm, 0, 0, CALLBACK_NULL);
// res == MMSYSERR_NOERROR
break;

case DLL_PROCESS_DETACH:
res = waveOutClose(mm_device);
// res == MMSYSERR_NOTENABLED
break;
}
}

Подобная история возникает с msacm32.lib. Если я открываю поток для
декомпрессии mp3 формата в pcm, используя фраунгоферовский кодак,
идущий с winXP по дефолту (up to 56kbp/s), то при вызове acmStreamClose
в DLL_PROCESS_DETACH у меня возникает исключение где то внутри кодака:

First-chance exception in SaudioTester.exe (L3CODECA.ACM): 0xC0000005: Access
Violation.

Помогите разобраться.

Компилятор - 6я студия. Все под WinXP SP1.

С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3195
Возраст листа : 257 (дней)
Количество подписчиков : 416
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/162491
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Fri, 4 Jun 2004 01:39:36 -0700 (#162491)

 

Ответы:

Здравствуйте !

...

Может, перед waveOutClose вызывать waveOutReset ?
Может, поможет.

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
Номер выпуска : 3213
Возраст листа : 259 (дней)
Количество подписчиков : 414
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/164383
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 7 Jun 2004 20:47:06 +0400 (#164383)

 

[08.06.2004 1:01] Обнаружено письмо от Victor V. Vakchturov
[08.06.2004 1:01] Тема "ошибка waveOutClose"

Здравствуйте, Виктор!

waveOutReset() срабатывает правильно, возвращает хидера. Но
все равно waveOutClose() возвращает 3. Я его не вписал, пытаясь свести
к мининмуму количество кода.

С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3214
Возраст листа : 259 (дней)
Количество подписчиков : 414
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/164505
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Tue, 8 Jun 2004 01:03:33 -0700 (#164505)

 

[13.06.2004 15:03] Обнаружено письмо от Elmo
[13.06.2004 15:03] Тема "ошибка waveOutClose"

<skip>

В статье "GDI+: графика нового поколения" [1], я прочитал следующее:

Мне кажется это как то связано с моей проблемой. Может кто нибудь
пояснит, почему _обычно_ нельзя вызвать библиотечные функции инициализации
и очистки, как это пытался сделать я?

[1] http://www.rsdn.ru/article/gdi/gdiplus1.xml
С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3243
Возраст листа : 265 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/168886
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Sun, 13 Jun 2004 15:07:26 -0700 (#168886)

 

Нельзя вызывать функции из других библиотек в DLL_PROCESS_ATTACH.
Для этого обычно пишут явные функции инициализации и очистки. И явно
вызывают их в программе после LoadLibrary();

Ответить   Ivan Mikheikin Sun, 13 Jun 2004 16:49:09 +0400 (#168952)

 

[13.06.2004 22:08] Обнаружено письмо от Ivan Mikheikin
[13.06.2004 22:08] Тема "ошибка waveOutClose"

Вот я и спрашиваю: Почему?

С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3247
Возраст листа : 265 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/169068
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Sun, 13 Jun 2004 22:08:54 -0700 (#169068)

 

Hello Elmo,

DLL инициализируют себя, используя функции DllMain. К моменту выполнения
твоей DllMain другие DLL в том же адресном пространстве могут не успеть
выполнить свои функции DllMain, т. e. они окажутся неинициализированными.
Поэтому нужно избегать обращений из DllMain к функциям, импортируемым из других
DLL.
Кроме того, ненужно вызывайть из DllMain функции LoadLibrary(Ex) и FreeLibrary,
так как это может привести к взаимной блокировке.

В документации Platform SDK утверждается, что DllMain должна выполнять лишь простые
виды инициализации -- настройку локальной памяти потока, создание объектов ядра,
открытие файлов и т. д. Нужно избегать обращений к функциям, связанным с User,
Shell, ODBC, COM, RPC и сокетами (а также к функциям, которые их вызывают),
потому что соответствующие DLL могут быть еще не инициализированы.
Кроме того, подобные функции могут вызывать LoadLibrary(Ex) и тем самым
приводить к взаимной блокировке.

Ответить   Mon, 14 Jun 2004 22:46:55 +0500 (#170044)

 

Нельзя - это слишком категорично. Обычно как раз можно.

Но бывают тонкости, связанные с ошибками реализации тех или иных
библиотек; иногда проблемы могут возникать из-за операционки.
Например, есть глюк в коде выгрузки библиотеки "riched20.dll",
проявляющийся на Win NT 4 (у нее, похоже, немного
кривой алгоритм вызова DllEntryPoint - или это
мне так повезло с версией).

Решение таких проблем уже было приведено в листе - делать
отдельные функции инициализации и освобождения
ресурсов, если это помогает.

Так что проблема с waveOutClose, IMHO,
это не правило, а проявление
какого-то мелкого глюка.

--
Номер выпуска : 3259
Возраст листа : 267 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/170072
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Tue, 15 Jun 2004 12:21:49 +0400 (#170072)

 

Здравствуйте !

Можно попробовать сделать в dll что то типа функции YourDllUninitialize,
которая будет все что надо убивать. Просто, если, например, dll запускала
потоки, то, скорее всего при закрытии приложения до момента вызова
DllMain, система убьет уже часть или все потоки (может,
отсюда и глюки).
Вон, для OLE есть, например, CoInitialize, и CoUninitialize,
которую надо вызывать независимо от успешности CoInitialize.

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
Номер выпуска : 3250
Возраст листа : 266 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/169187
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 14 Jun 2004 02:33:37 +0400 (#169187)