<?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=407980&amp;view=findpost&amp;p=3652340</guid>
        <pubDate>Wed, 10 Feb 2016 10:12:57 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652340</link>
        <description><![CDATA[Pavia: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652327'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-10T12:37:59+03:00">10.02.16, 09:37</time></span><div class='quote '>Кстати, правильно ли я понимаю, что нет смысла каждый раз делать waveInPrepareHeader перед waveInAddBuffer? Можно сделать это один раз и только сбрасывать бит WHDR_DONE (на всякий случай)?</div></div><br>
Верно.]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652339</guid>
        <pubDate>Wed, 10 Feb 2016 10:08:33 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652339</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>нет смысла каждый раз делать waveInPrepareHeader перед waveInAddBuffer? </div></div><br>
Нет смысла. <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Можно сделать это один раз и только сбрасывать бит WHDR_DONE (на всякий случай)?</div></div><br>
Можно сделать один раз и на всякий случай сбрасывать WHDR_DONE(хотя я его не сбрасываю и проблемы с waveinaddbuffer пока ни разу не возникали). :-?]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652337</guid>
        <pubDate>Wed, 10 Feb 2016 10:06:56 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652337</link>
        <description><![CDATA[Pavia: Менеджер памяти я плохо знаю.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652327'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-10T09:37:59+00:00">10.02.16, 09:37</time></span><div class='quote '>GMEM_MOVEABLE, а не GMEM_FIXED ?</div></div><br>
В старых ОС GlobalLock фиксирует в расширенной области. Возможно это область была одна. Соответственно адрес надо было &quot;переместить&quot;.<br>
А потом когда стала возможно делать несколько расширенных областей. Надобность в GMEM_MOVEABLE отпала.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652327'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-10T09:37:59+00:00">10.02.16, 09:37</time></span><div class='quote '>Выглядит так, будто я это должен сделать...</div></div><br>
Да.Вы. Смотри пример:<br>
<a class='tag-url' href='https://msdn.microsoft.com/en-us/library/windows/desktop/dd797970(v=vs.85).aspx' target='_blank'>https://msdn.microsoft.com/en-us/library/wi...0(v=vs.85).aspx</a><br>
<br>
Но в новых ОС начиная с win 2000 это требование убрали. <br>
<br>
См пример:<br>
<a class='tag-url' href='https://msdn.microsoft.com/en-us/library/windows/desktop/dd317593(v=vs.85).aspx' target='_blank'>https://msdn.microsoft.com/en-us/library/wi...3(v=vs.85).aspx</a>]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652327</guid>
        <pubDate>Wed, 10 Feb 2016 09:37:59 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652327</link>
        <description><![CDATA[Jin X: Кстати, правильно ли я понимаю, что нет смысла каждый раз делать <strong class='tag-b'>waveInPrepareHeader</strong> перед <strong class='tag-b'>waveInAddBuffer</strong>? Можно сделать это один раз и только сбрасывать бит WHDR_DONE (на всякий случай)? <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="2016-02-10T09:41:50+00:00">10.02.16, 09:41</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652124'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T12:45:14+00:00">09.02.16, 12:45</time></span><div class='quote '>The WAVEHDR structure and the data block pointed to by its lpData member must be allocated by using the GlobalAlloc function and the GMEM_MOVEABLE flag, and must be locked by using the GlobalLock function. Preparing a header that has already been prepared will have no effect, and the function will return zero.</div></div>Выглядит так, будто я это должен сделать... <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="2016-02-10T09:44:08+00:00">10.02.16, 09:44</time></span></span><br>
Хотя, стоп. Почему GMEM_MOVEABLE, а не GMEM_FIXED ?  :huh:]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652322</guid>
        <pubDate>Wed, 10 Feb 2016 09:30:27 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652322</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652298'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-10T08:22:45+00:00">10.02.16, 08:22</time></span><div class='quote '>Это нигде не написано.</div></div>А где написано, что dwBytesRecorded может обозначать что-либо кроме кол-ва записанных байт (т.е., например, позицию, с которой нужно начинать)?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652298'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-10T08:22:45+00:00">10.02.16, 08:22</time></span><div class='quote '>Чем больше вы контролируете при написании программы, тем проще вам будет на этапе отладке.</div></div>Вот с этим согласен ;)]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652320</guid>
        <pubDate>Wed, 10 Feb 2016 09:27:56 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652320</link>
        <description><![CDATA[Prince: Люди, вы загнались в каие-то дебри. Перед вызовом wavinprepareheader флаги  заголовка должны быть обнулены.<br>При добавлении уже подготовленноо буфера в очередь записи, в колбек-фанкшн, флаги не нужно трогать(т.е., можно оставить флаг done как есть, на скорость ветра это не влияет).]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652298</guid>
        <pubDate>Wed, 10 Feb 2016 08:22:45 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652298</link>
        <description><![CDATA[Pavia: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652224'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T20:20:42+00:00">09.02.16, 20:20</time></span><div class='quote '>Зачем, если эти функции сами пишут туда что им надо?</div></div><br>
Официально функции  waveInPrepareHeader или waveOutPrepareHeader устанавливают только 1 бит.<br>
Поэтому что-бы избежать ошибки не инициированных данных. Нужно их проиницировать.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652224'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T20:20:42+00:00">09.02.16, 20:20</time></span><div class='quote '>Я в callback-функции не обнуляю dwBytesRecorded, а добавляю тот же буфер, при этом запись идёт в самого начала.</div></div><br>
Это нигде не написано. Более того такое поведение зависит от драйвера. А вот какой индус что там написал большой вопрос. <br>
А может как в том анекдоте: Пешеход, не трамвай объедет. Водитель, не столб отойдёт. А в результате авария.<br>
<br>
Всё что вы не контролируете рано или поздно вернётся к вам ошибками. Вот вы на всех драйверах проверили?<br>
Мы тут как-то в соседней теме нашли что разные драйвера по разному обрабатывают TWAVEFORMATEX. Притом с точностью до наоборот  :blink: <br>
Код работающий в 1 драйвере не работал во 2. А код работающий во 2 не работал в 1.<br>
 <br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=310684&view=findpost&p=2669139' target='_blank'>как записать звук с микрофона в буфер? (сообщение #2669139)</a><br>
Вначале думали что дело в ОС. Но потом выяснилось, что в драйвере. У одного звуковой чип был от RealTek у другого от VIA.<br>
<br>
Чем больше вы контролируете при написании программы, тем проще вам будет на этапе отладке.]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652224</guid>
        <pubDate>Tue, 09 Feb 2016 20:20:42 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652224</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T19:10:40+00:00">09.02.16, 19:10</time></span><div class='quote '>Head содержит указатель на то, сколько данных записалось и с какой позиции писать. dwBytesRecorded Так что обнулять надо.</div></div>Что dwBytesRecorded ?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T19:10:40+00:00">09.02.16, 19:10</time></span><div class='quote '>dwBytesRecorded - пишет ОС. Читает ваше приложение.<br>
Если ваше приложение начнёт писать. То предположительно запись начнётся, а вернее продолжится с указанно числа.</div></div>Я в callback-функции не обнуляю dwBytesRecorded, а добавляю тот же буфер, при этом запись идёт в самого начала.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T19:10:40+00:00">09.02.16, 19:10</time></span><div class='quote '>Эти рекомендую очистить перед первым вызовом waveInPrepareHeader или waveOutPrepareHeader</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652213'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Pavia &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T19:10:40+00:00">09.02.16, 19:10</time></span><div class='quote '>Системные.<br>
lpNext	Reserved; do not use. <br>
reserved	Reserved; do not use. <br>
Эти рекомендую очистить перед первым вызовом waveInPrepareHeader или waveOutPrepareHeader</div></div>Зачем, если эти функции сами пишут туда что им надо?]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652214</guid>
        <pubDate>Tue, 09 Feb 2016 19:18:39 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652214</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Иначе как драйвер узнает что приложение закончило работу с этим буфером и можно повторно его использовать?</div></div><br>
По-моему, драйверу всё равно. При вызове waveinaddbuffer, драйверу нужен адрес заголовка и факт, что заголовок/буфер подготовлен функцией prepare. Флаг done устанавливается драйвером, но не проверяется. По моим наблюдениям.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652213</guid>
        <pubDate>Tue, 09 Feb 2016 19:10:40 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652213</link>
        <description><![CDATA[Pavia: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652190'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Jin X &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T16:23:10+00:00">09.02.16, 16:23</time></span><div class='quote '> оно вообще надо? Обнулять...</div></div><br>
Head содержит указатель на то, сколько данных записалось и с какой позиции писать. dwBytesRecorded Так что обнулять надо. <br>
<br>
<a class='tag-url' href='https://msdn.microsoft.com/en-us/library/dd743837(v=vs.85).aspx' target='_blank'>https://msdn.microsoft.com/en-us/library/dd...7(v=vs.85).aspx</a><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Remarks<br>
<br>
Use the WHDR_BEGINLOOP and WHDR_ENDLOOP flags in the dwFlags member to specify the beginning and ending data blocks for looping. To loop on a single block, specify both flags for the same block. Use the dwLoops member in the WAVEHDR structure for the first block in the loop to specify the number of times to play the loop.<br>
<br>
The <strong class='tag-b'>lpData</strong>, <strong class='tag-b'>dwBufferLength</strong>, and <strong class='tag-b'>dwFlags</strong> members must be <strong class='tag-b'>set</strong> before calling the waveInPrepareHeader or waveOutPrepareHeader function. (For either function, the dwFlags member must be set to zero.)<br>
</div></div><br>
Думаю тут ошибка.  Для waveOutWrite и waveInAddBuffer<br>
Буфер и заголовок должны быть подготовлены(Prepared).<br>
Проще всего такую проверку сделать по флагу. <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>WHDR_PREPARED	Data buffer has been prepared by using the waveInPrepareHeader or waveOutPrepareHeader function. This flag is set <strong class='tag-b'>by Windows</strong>. <br>
</div></div><br>
<br>
Когда мы вызываем память она всегда выделяется не очищенной. И в ней может лежать мусор. Перед дальнейшем использованием её надо очистить от мусора. А затем надо заполнить разумными начальными данными.<br>
 <br>
Но стоит понимать что часть данных в WAVEHDR - системные, а часть прикладные. Системные заполняет система. И их изменять не надо, а другие надо.<br>
<br>
Пользовательские.<br>
lpData	Points to the waveform data buffer. <br>
dwBufferLength	Specifies the length of the data buffer. <br>
dwUser	Specifies 32 bits of user data. <br>
dwLoops	Specifies the number of times to play the loop. This parameter is used only with output data buffers. <br>
<br>
Системные.<br>
lpNext	Reserved; do not use. <br>
reserved	Reserved; do not use. <br>
Эти рекомендую очистить перед <strong class='tag-b'>первым</strong> вызовом waveInPrepareHeader или waveOutPrepareHeader<br>
<br>
<br>
Смешанные:<br>
dwBytesRecorded	Specifies the amount of data in the buffer, if the header is used in input. <br>
dwFlags	Specifies flags that provide information about the data buffer. This member can be one or more of the following values: <br>
<br>
<br>
dwBytesRecorded - пишет ОС. Читает ваше приложение.<br>
Если ваше приложение начнёт писать. То предположительно запись начнётся, а вернее продолжится с указанно числа. <br>
<br>
dwFlags - пользовательскими являются 2 и 3 биты отсчёт от 0.<br>
Отвечающие за <br>
WHDR_BEGINLOOP	Buffer is the first buffer in a loop. This flag is used only with output data buffers. <br>
WHDR_ENDLOOP	Buffer is the last buffer in a loop. This flag is used only with output data buffers. <br>
<br>
Остальные биты системные. <br>
Из них 0 бит отвечающий за WHDR_DONE	управляется драйвером звукового устройства.<br>
<br>
Бит 1 отсчёт от 0 отвечающий за WHDR_PREPARED	системный. За него отвечает виндоус. <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>This flag is set by Windows.</div></div>  <br>
Вы командуете виндоусу подготовить буфер при помощи вызова waveInPrepareHeader. И если виндоус его подготовли, то он отвечает что буфер готов, путем выставки этого флага.<br>
На самом деле насколько понимаю его тоже выставляет драйвер.<br>
Если вы сами начнёте двигать этот бит, то получите ошибки. <br>
<br>
 <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>И надо ли сбрасывать флаг WHDR_DONE</div></div><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="2016-02-09T19:15:33+00:00">09.02.16, 19:15</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>И надо ли сбрасывать флаг WHDR_DONE в заголовке при добавлении буфера (т.е. в callback-функции я добавляю тот же буфер без &quot;переподготовки&quot;)?</div></div><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>For either function, the dwFlags member must be set to zero</div></div> По моему эти строчки как раз и относятся к вашему случаю. Кога Done выставлен. Дело в том что waveInPrepareHeader обнуляет этот флаг.<br>
И функцию можно вызывать для уже подготовленных буферов. Ошибки не будет.<br>
А вот если вы не вызываете waveInPrepareHeader, то соответственно за сброс бита WHDR_DONE должны отвечать вы сами.]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652197</guid>
        <pubDate>Tue, 09 Feb 2016 16:55:09 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652197</link>
        <description><![CDATA[Prince: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>А оно вообще надо? Обнулять...</div></div><br>
For either function, the dwFlags member must be set to zero.<br>
Надо. Проверял когда-то.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>И надо ли сбрасывать флаг WHDR_DONE</div></div><br>
Я не сбрасываю. Подозреваю, что waveinaddbuffer именно этот флаг не проверяет. И устанавливается он при заполнении буфера, перед посылкой уведомления приложению, независимо от его текущего значения.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652190</guid>
        <pubDate>Tue, 09 Feb 2016 16:23:10 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652190</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=407980&view=findpost&p=3652083'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2016-02-09T08:49:07+00:00">09.02.16, 08:49</time></span><div class='quote '>Т.е., кроме как обнулить перед вызовом waveinprepare</div></div>А оно вообще надо? Обнулять... <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="2016-02-09T16:31:21+00:00">09.02.16, 16:31</time></span></span><br>
И надо ли сбрасывать флаг WHDR_DONE в заголовке при добавлении буфера (т.е. в callback-функции я добавляю тот же буфер без &quot;переподготовки&quot;)?]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652124</guid>
        <pubDate>Tue, 09 Feb 2016 12:45:14 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652124</link>
        <description><![CDATA[Pavia: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Mайкрософт на этот предмет молчит как рыба об лёд.</div></div> Не совсем. Вод старый документ. Но с тех пор аудио подсистема раза 2 переписывалась. Так что сейчас там может быть всё что угодно. <br>
<br>
Microsoft Windows NT 3.1 SDK<br>
<br>
MMRESULT waveInPrepareHeader(hWaveIn, lpwh, cbwh)<br>
<br>
HWAVEIN hWaveIn;	/* handle of waveform device	*/<br>
LPWAVEHDR lpwh;	/* address of structure with device information	*/<br>
UINT cbwh;	/* size of structure, in bytes	*/<br>
<br>
<br>
The waveInPrepareHeader function prepares a buffer for waveform input. <br>
<br>
Parameter	Description<br>
<br>
hWaveIn	Identifies the waveform input device. <br>
lpwh	Points to a WAVEHDR structure that identifies the buffer to be prepared. <br>
cbwh	Specifies the size, in bytes, of the WAVEHDR structure. <br>
<br>
Returns<br>
<br>
If the function succeeds, the return value is zero; otherwise, it is an error code, which can be one of the following: <br>
<br>
Value	Meaning<br>
<br>
MMSYSERR_INVALHANDLE	The specified device handle is invalid. <br>
MMSYSERR_NOMEM	The system is unable to allocate or lock memory. <br>
MMSYSERR_HANDLEBUSY	The handle hWaveIn is in use on another thread. <br>
<br>
<strong class='tag-b'>Comments</strong><br>
<br>
The <span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>WAVEHDR</strong></span> structure and the data block pointed to by its lpData member must be allocated by using the <span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>GlobalAlloc</strong></span> function and the <span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>GMEM_MOVEABLE</strong></span> flag, and must be locked by using the <span class="tag-color tag-color-named" data-value="green" style="color: green"><strong class='tag-b'>GlobalLock</strong></span> function. Preparing a header that has already been prepared will have no effect, and the function will return zero. <br>
<br>
See Also<br>
<br>
waveInUnprepareHeader]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652083</guid>
        <pubDate>Tue, 09 Feb 2016 08:49:07 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652083</link>
        <description><![CDATA[Prince: WaveInStop приостанавливает запись. При этом текущий буфер(заголовок) в очереди помечается флагом done, а поле dwBytesRecorded содержит количество записанных байт до момента отработки WaveInStop. Приложение получит уведомление о том, что есть буфер, требующий обработки, через выбранный в waveinOpen механизм сallback. Все остальные, &quot;пустые&quot; буферы, остаются в очереди. Позиция записи сохраняется.<br>
WaveInReset стбрасывает позицию записи в ноль, выбрасывает все буферы из очереди записи(помечает их флагом done), приложению сыпятся уведомления по количеству буферов, и фактически устройство приводится к состоянию, как если бы оно было только что открыто функцией waveinopen.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В общем, буду считать, что waveInReset нужен тогда, когда имеет смысл вызывать callback-функцию, а waveInStop, когда нет</div></div><br>
В ситуциии, когда в очереди записи находится хотя бы один буфер, callback механизм будет задействоан в любом случае. В случае stop приложению прилетит одно уведомление(нужно обработать один буфер), после reset прилетит столько сообщений, сколько буферов/заголовков было в очереди записи.<br>
<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>нужно ли использовать waveInStop перед/после waveInReset</div></div><br>
Это независимые функции. <br>
Если хочешь приостановить запись(поставить на паузу) - waveinstop. Хотя можно использовать и waveinreset. зависит от логики программы.<br>
Если хочешь вообще прекратить запись(и затем, например, закрыть устройство, или сбросить устройство в исходное состояние) - waveinreset. <br>
Опять же, зависит от логики программы.<br>
<br>
waveinreset МОЖНО вызывать сразу после waveinstop(но зачем).<br>
Вызов waveinstop после waveinreset лишён смысла, так как очередь буферов после reset уже не существует, хотя ошибки не произойдёт, функция stop просто ничего не выполнит. &quot;Посмотрит&quot;, что ей в этой ситуации делать нечего, подумает &quot;сплю себе, никого не трогаю...&quot;, и вернёт MMSYSERR_NOERROR(ноль). <br>
<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>waveInPrepareHeader/waveInUnprepareHeader</div></div><br>
Из того, что я где-то читал и интуитивно понял, функция prepare каким-то образом лочит область памяти(страницу памяти), не позволяя винде перемещать её(сбрасывать с своп?) и устанавливает соотвествущий флаг в заголовке. unprepare, cоответственно, разлочивает область памяти. Mайкрософт на этот предмет молчит как рыба об лёд.<br>
<br>
Первый вызов Waveinaddbuffer создаёт дополнительный поток, в котором происходит обработка сообщений wim_data, и вообще обработка очереди записи.<br>
waveinreset не только выбрасывает все буферы из очереди но и убивает сам поток. Поэтому Waveinunprepare нельзя вызыват из callback - функции после waveinreset. Этот момент обсуждался в разделе программирования звука, в какой теме не помню, не так давно(относительно).<br>
waveinstop &quot;замораживает&quot; процесс записи. Позволяя продолжить его вызовом waveinstart.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
У меня 2 основных вопроса при организации записи с микрофона</div></div><br>
Фунции wavin никак не связаны конкретно с микрофоном. Они осуществляют захват потока данных с выхода АЦП аудиокодека. Т.е., позволяют писать с любого входа/комбинации входов, в зависимости от настроек микшера. <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="2016-02-09T09:26:06+00:00">09.02.16, 09:26</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Приложение получает сообщение сигнал о том что буфер заполнен. Оно копирует данные из буфера. И выставляет флаг WHDR_PREPARED что буфер готов к следующей загрузки данных.</div></div><br>
&quot;Вручную&quot; не следует трогать флаг WHDR_PREPARED. Т.е., кроме как обнулить перед вызовом waveinprepare/ Его выставляет подсистема записи как раз посредством waveinprepare. А что она делает с буфером/закоголовком помимо этого, это только смотреть реализацию функции.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652076</guid>
        <pubDate>Tue, 09 Feb 2016 07:30:50 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652076</link>
        <description><![CDATA[Jin X: <strong class='tag-b'>Pavia</strong>, весьма подробно. Спасибо  :victory: ++<br>
В общем, буду считать, что  <strong class='tag-b'>waveInReset</strong> нужен тогда, когда имеет смысл вызывать callback-функцию, а <strong class='tag-b'>waveInStop</strong>, когда нет :)<br>
<br>
p.s. Я тут подумал, что <strong class='tag-b'>waveOutStop</strong>, возможно, не сделан потому, что <strong class='tag-b'>waveInReset</strong> отменяет запись и возвращает значение длины записанного, равную нулю, т.е. по сути, запись в последний буфер не проиводится (поэтому смысл вызывать callback-функцию не всегда есть), а <strong class='tag-b'>waveOutReset</strong> отмечает последний буфер как полностью проигранный (даже если это не так), тогда какой смысл делать <strong class='tag-b'>waveOutStop</strong> ?]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652055</guid>
        <pubDate>Mon, 08 Feb 2016 22:55:39 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652055</link>
        <description><![CDATA[Pavia: Тут на днях переделал модуль видео захвата, добавил автомат. Все эти плай, стой, ресет, опен, клоз. <br>Думаю мысли мои совпадут с разработчиками.<br>Так что далее мои домыслы. Насколько они верны не могу сказать. <br><br>waveInStop<br>waveInReset<br><br>Согласно MSDN waveInReset отличается от waveInStop, тем что сбрасывает позиция в проигрываемом файле в 0.<br><br>Источником звука может быть компакт диск и/или его проигыватель. А ещё лучше магнитная лента на кассете.<br><br>В теории:<br>Stop просто прекращает цикл приема. Барабан с плёнкой перестаёт крутиться. Но устройство продолжает быть открытым.  <br>Reset закрывает и открывает устройство. По сути это последовательность команд STOP CLOSE OPEN. Попутно около Open происходит обнуление всех внутренних буферов. Всех счётчиков, инициализация переменных в начальное значение. А значит наша катушка с плёнкой должна перемотаться назад в начальное(0) положение. А это время ну пусть в 8 раз быстрее времени воспроизведения. Т.е очень долго секунды или минуты. С диском проще несколько десятков мс.<br><br>С точки зрения прикладного программиста, разницы нет. Разве что Reset будет работать дольше. Зато если вдруг произойдёт какая-то внутренняя ошибка устройства, драйвера и тп, то Reset сбросит, устранит её. А в случае STOP это не так. Как говориться 7 бед один Reset. У железячников, чипмейкеров reset по всюду&#33; Начиная от простого тригера. А вот программисты с ним редко встречаются. Разве что при разработке автомата или машины состояний. <br><br>На практике:<br>Насколько знаю Майкрософт это так и не доделала. Так что по сути Stop и Reset у них это одно и тоже.<br><br><br>waveOutStop - нету. Могли бы и сделать, но видимо сочли не нужным. Может быть сочли что OUT(вывод), не есть REC (запись). А значит вывод не надо останавливать. Такая игра слов.<br>Вообще тут большой вопрос о том как строить конвейер кто им должен управлять. Толи конечное устройство в цепочке, толи начальное. Толи сторонний механизм.<br>Я сторонник когда управляет конечное и далее по цепочки распространяется воздействие. Поэтому OutStop не должно существовать. <br>Но у майкрософт тут все довольно сложно намешано. видимо хотели сделать что-бы прикладной программист мог выбирать кто будет управлять. Так что видимо waveOutStop должен был быть. Просто не доделали как и Reset.  <br>Когда я спроектировал свой конвейр с автоматом со всеми состояниями он у меня получился очень сложным, хотя до внедрения автомата был простым. <br><br><br>Согласно MSDN waveInUnprepareHeader связана с функцией  waveInPrepareHeader.<br>В DirectX эта часть сделана гораздо проще. <br><br>Ваше приложение говорит что буфер готов к записи и вызывает  waveInPrepareHeader драйвер пишет данные в буфер, когда буфер заполнен в Header выставляется флаг Done.<br>Приложение получает сообщение сигнал о том что буфер заполнен. Оно копирует данные из буфера. И выставляет флаг WHDR_PREPARED что буфер готов к следующей загрузки данных.<br><br>Но тогда для чего нужна waveInUnprepareHeader? Все просто. <br><br>Звуковая аппаратура работает с физическими адресами. А приложение с вируальными. При вызове waveInPrepareHeader ОС фиксирует страницы в памяти. В этих страницах лежат буферы данных. А при завершении приложении надо вызвать waveInUnprepareHeader чтобы сделать свободными. <br>Если страница зафиксирована это значит что она не будет менять свои физические адреса, до тех пор пока вы не открепите её. А если её не зафиксировать, то в один момент драйвер может начать писать не туда.<br>Зачем вообще странице менять адрес? К примеру свап страниц, когда ОС не хватает физической памяти она выгружает часть страниц на жёсткий диск. <br>Есть и другие причины. <br><br>А вообще такая вот фиксация была реализована в первых виндоусах через SharedMomory. Которая в свою очередь была ещё и ограниченным ресурсом. В том смысле что макрософт разрешала создавать только небольшие по тем временам объемы общей памяти.<br>С выходом 3D Sound во времена эдак Win98, механизмы работы со звуком поменялись. А вот интерфейс остался старым.  Так что сейчас waveInPrepareHeader и waveInUnprepareHeader это скорее атавизм, эдакий привет из 80-тых годов. <br>Так что сейчас waveInPrepareHeader врятли выполняет фиксацию буфера, скорее всего сейчас она только установка флага WHDR_PREPARED и более ничего. И надобность в <br>waveInUnprepareHeader - отпала. <br><br>Не не думай-те что история закончилась в 90-тых. С 2000 по примерно 2010 года существовали мобильные телефоны, планшеты, карманные компьютеры.<br>В них уж точно нет 3D Sound. А следовательно с большой долей вероятности в них использовалась старая схема с фиксацией буфера.  <br><br>Так что спешить выкидывать waveInUnprepareHeader не стоит.]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652047</guid>
        <pubDate>Mon, 08 Feb 2016 21:51:31 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652047</link>
        <description><![CDATA[Jin X: Я, в общем-то, не против :)]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652045</guid>
        <pubDate>Mon, 08 Feb 2016 21:41:20 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652045</link>
        <description><![CDATA[Pavia: Лучше тему перенести в этот раздел:<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showforum=108' target='_blank'>Программирование звука</a><br>
Там быстрее ответят.]]></description>
        <author>Pavia</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652044</guid>
        <pubDate>Mon, 08 Feb 2016 21:35:28 +0000</pubDate>
        <title>waveInStop, waveInUnprepareHeader</title>
        <link>https://forum.sources.ru/index.php?showtopic=407980&amp;view=findpost&amp;p=3652044</link>
        <description><![CDATA[Jin X: У меня 2 основных вопроса при организации записи с микрофона:<br>
<br>
1. Зачем нужна функция <strong class='tag-b'>waveInStop</strong>, если есть <strong class='tag-b'>waveInReset</strong> (и вообще, нужно ли использовать <strong class='tag-b'>waveInStop</strong> перед/после <strong class='tag-b'>waveInReset</strong>... и если да, то перед или после?)<br>
Либо наоборот: зачем <strong class='tag-b'>waveInReset</strong>, если есть <strong class='tag-b'>waveInStop</strong> (неужели просто ради того, чтобы вызвать callback-функцию с пустым буфером?)<br>
Функции <strong class='tag-b'>waveOutStop</strong> же нет, зачем <strong class='tag-b'>waveInStop</strong>?<br>
<br>
2. Зачем нужна функция <strong class='tag-b'>waveInUnprepareHeader</strong>? Я спрашиваю не об описании функции, а о смысле её использования? Она что, освобождает какие области памяти или дескрипторы? В чём смысл её использования?]]></description>
        <author>Jin X</author>
        <category>Программирование звука</category>
      </item>
	
      </channel>
      </rss>
	