<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819482</guid>
        <pubDate>Tue, 28 Jan 2020 13:55:14 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819482</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416594&view=findpost&p=3819460'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2020-01-28T15:32:02+03:00">28.01.20, 12:32</time></span><div class='quote '>Задавался тем же вопросом. Ведь вызов из обработчика как бы сам собой напрашивается. Майкрософт хранит эту тайну.</div></div>Короче, нужно использовать поточный или оконный колбэк, вот что напрашивается :)<br>
При этом, если прога не оконная, придётся создавать поток и в нём крутить цикл GetMessage (и создавать окно, если привязываемся к окну).<br>
Я тут тоже тупанул: создал окно в текущем потоке + новый поток, в котором крутил цикл GetMessage. И думал: чего же это окно не получает сообщения? А ведь GetMessage получает сообщения только для окон, созданных в <strong class='tag-b'>текущем</strong> потоке :facepalm:<br>
В колбэк-функцией, кстати, есть ещё один неприятный момент. Если используется WAVE_MAPPER, то при смене аудиоустройства по умолчанию прога виснет. У меня, по крайней мере, такая канитель. Это WAVE_MAPPER, про другие не помню, вроде не должно.]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819460</guid>
        <pubDate>Tue, 28 Jan 2020 12:32:02 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819460</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Откуда же тогда вызывать waveInAddBuffer?</div></div><br>
Задавался тем же вопросом. Ведь вызов из обработчика как бы сам собой напрашивается. Майкрософт хранит эту тайну. <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.</div></div><br>
Тогда добавление буфера из callback-процедуры не должно вешать софт</div></div><br>
Помню, что waveinopen создает один дополнительный поток, и он не убивается вплоть до завершения работы приложения. Т.е., он не убивается даже после waveinclose . А после первого вызова waveinaddbuffer  создавался еще один поток, в котором и крутился цикл обработки сообщений . waveinreset этот пооток прибивал. <br>
<br>
Интуитивно, при вызове waveinreset уничтожается очередь заголовков буферов, поэтому waveinaddbuffer из обработчика после waveinreset - это как добавить элемент в динамический массив, когда самого массива уже нет. Ну это так, догадка.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819426</guid>
        <pubDate>Tue, 28 Jan 2020 10:50:42 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819426</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416594&view=findpost&p=3819419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2020-01-28T10:03:02+00:00">28.01.20, 10:03</time></span><div class='quote '>Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.</div></div>Тогда добавление буфера из callback-процедуры не должно вешать софт :)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416594&view=findpost&p=3819419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2020-01-28T10:03:02+00:00">28.01.20, 10:03</time></span><div class='quote '>Майкрософт сам же и говорит, что из callback нельзя вызывать никаких функций, кроме...</div></div>Кроме...? По крайней мере, waveInAddBuffer кроме как из callback-функции вызывать неоткуда.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416594&view=findpost&p=3819419'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2020-01-28T10:03:02+00:00">28.01.20, 10:03</time></span><div class='quote '>waveinstop не уничтожает объекты, а потому алгоритм дальнейших действий получается просчитываемым и предсказуемым.</div></div>:good: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-28T10:53:50+00:00">28.01.20, 10:53</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416594&view=findpost&p=3819426'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2020-01-28T10:50:42+00:00">28.01.20, 10:50</time></span><div class='quote '>Кроме...?</div></div><em class='tag-i'>Applications should not call any system-defined functions from inside a callback function, except for EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, and timeSetEvent. Calling other wave functions will cause deadlock.</em><br>
<br>
Откуда же тогда вызывать waveInAddBuffer?]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819419</guid>
        <pubDate>Tue, 28 Jan 2020 10:03:02 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819419</link>
        <description><![CDATA[Prince: Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.  <br>Такая же ернуда как c waveinaddbuffer будет, если waveoutwrite в callback использовать или да, waveInUnprepareHeader. Майкрософт сам же и говорит, что из callback нельзя вызывать никаких функций, кроме...<br>Поэтому от waveinreset отказался. Меньше мороки. waveinstop не уничтожает объекты, а потому алгоритм дальнейших действий получается просчитываемым и предсказуемым.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819413</guid>
        <pubDate>Tue, 28 Jan 2020 09:15:38 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819413</link>
        <description><![CDATA[Jin X: Как же waveInReset может убить поток, который потом вызывает (это я про waveInProc)?<br>
Если не добавлять буферы, то всё ок. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-28T09:17:02+00:00">28.01.20, 09:17</time></span></span><br>
Где обсуждалось – это я вчера перечитывал, я же и создавал тему (почти 4 года назад): <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=407980' target='_blank'>waveInStop, waveInUnprepareHeader</a> :)]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819376</guid>
        <pubDate>Mon, 27 Jan 2020 19:01:38 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819376</link>
        <description><![CDATA[Prince: waveinproc и waveinaddbuffer вызывается в отдельном потоке, если используется сallback function. ресет этот поток убивает. При таком раскладе, да, возникают сюрпризы. Где-то тут этот ньюанс обсуждался уже.<br><br>Отказался от функции ресет вообще в свое время. Только стоп.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819365</guid>
        <pubDate>Mon, 27 Jan 2020 17:30:05 +0000</pubDate>
        <title>waveInReset вешает прогу, а waveInStop работает нормально</title>
        <link>https://forum.sources.ru/index.php?showtopic=416594&amp;view=findpost&amp;p=3819365</link>
        <description><![CDATA[Jin X: Столкнулся с такой проблемой: при необходимости остановки записи вызов <strong class='tag-b'>waveInReset</strong> вешает прогу (через раз), а <strong class='tag-b'>waveInStop</strong> работает нормально.<br>
Хотя, в другой проге всё ок.<br>
Почему такое может быть?<br>
p.s. Понимаю, что по-хорошему нужно бы код выложить, но пока не могу... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-27T17:36:04+00:00">27.01.20, 17:36</time></span></span><br>
Разобрался.<br>
Блин, магия какая-то. Возишься-возишься, понять не можешь в чём проблема.<br>
Как только создашь тему на форуме, сразу находишь ошибку сам :)<br>
<br>
Короче, в waveInProc было добавление буфера (причём, при uMsg = WIM_DATA).<br>
Т.о. waveInReset вызывал waveInProc с uMsg = WIM_DATA для каждого буфера. Процедура добавляла новый буфер и процесс зацикливался... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-27T18:24:41+00:00">27.01.20, 18:24</time></span></span><br>
А, нет. вру. Не зацикливается. Просто зависает при попытке добавить буфер.]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      </channel>
      </rss>
	