<?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=405927&amp;view=findpost&amp;p=3624128</guid>
        <pubDate>Sat, 12 Sep 2015 08:18:10 +0000</pubDate>
        <title>Колбек функция записи звука - как работает?</title>
        <link>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3624128</link>
        <description><![CDATA[tuchin: Спасибо большое, понял.]]></description>
        <author>tuchin</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3624036</guid>
        <pubDate>Fri, 11 Sep 2015 15:47:46 +0000</pubDate>
        <title>Колбек функция записи звука - как работает?</title>
        <link>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3624036</link>
        <description><![CDATA[Prince: MMRESULT waveInOpen(<br>
   LPHWAVEIN       phwi,<br>
   UINT            uDeviceID,<br>
   LPCWAVEFORMATEX pwfx,<br>
   DWORD_PTR       dwCallback,<br>
   DWORD_PTR       <strong class='tag-b'>dwCallbackInstance</strong>,<br>
   DWORD           fdwOpen<br>
);]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3624024</guid>
        <pubDate>Fri, 11 Sep 2015 15:25:48 +0000</pubDate>
        <title>Колбек функция записи звука - как работает?</title>
        <link>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3624024</link>
        <description><![CDATA[tuchin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=405927&view=findpost&p=3623231'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Prince &#064; <time class="tag-quote__quoted-time" datetime="2015-09-07T17:59:48+00:00">07.09.15, 17:59</time></span><div class='quote '><div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? </div></div><br>
Никак. <br>
Можете передать dwInstance в waveinopen. Это значение будет передано в колбек в одноименном параметре.<br>
Или использовать поле dwUser заголовка буфера.</div></div><br>
А как это сделать? Ведь dwInstance в waveinopen нет.]]></description>
        <author>tuchin</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3623231</guid>
        <pubDate>Mon, 07 Sep 2015 17:59:48 +0000</pubDate>
        <title>Колбек функция записи звука - как работает?</title>
        <link>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3623231</link>
        <description><![CDATA[Prince: <a class='tag-url' href='https://msdn.microsoft.com/en-us/library/windows/desktop/dd743849(v=vs.85).aspx' target='_blank'>https://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx</a><br>
Приложение передаёт звуковой подсистеме буферы посредством waveinaddbuffer. После заполнения буфера, звуковая подсистема выбрасывает его из своей очереди записи и уведомляет приложение о том, что буфер заполнен. В данном случае, посредством вызова функции, куда в качестве dwParam1 передает адрес заголовка, приведенный к DWORD.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ведь нигде в программе я не задаю, что dwParam1 связано с буферами</div></div><br>
Майкрософт задаёт.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Что значит и зачем строка:<br>
<br>
WAVEHDR *wvBuf = (WAVEHDR*) dwParam1;<br>
</div></div><br>
Присвоение значения dwParam1 локальной переменной wvBuf с одновременным приведением типа  DWORD к указателю на WAVEHDR. Зачем? Чтобы можно было обратиться к полям заголовка.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? </div></div><br>
Никак. <br>
Можете передать dwInstance в waveinopen. Это значение будет передано в колбек в одноименном параметре.<br>
Или использовать поле dwUser заголовка буфера.]]></description>
        <author>Prince</author>
        <category>Программирование звука</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3623209</guid>
        <pubDate>Mon, 07 Sep 2015 16:10:09 +0000</pubDate>
        <title>Колбек функция записи звука - как работает?</title>
        <link>https://forum.sources.ru/index.php?showtopic=405927&amp;view=findpost&amp;p=3623209</link>
        <description><![CDATA[tuchin: В программе <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=405027' target='_blank'>Как программа записи звука с микрофона прерывает запись?</a> формируются буферы<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;for(int j = jmin; j &#60; nKan; j++)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;wvRes = waveInOpen(&amp;hwvInDev, nDev, &amp;wvFormat, (DWORD)wvRecCallBack, 0L, CALLBACK_FUNCTION);</div><div class="code_line">&nbsp;&nbsp; &nbsp;wvErrorMes(&quot;\nУстройство для записи открыть не удалось!\n&quot;, wvRes);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(UINT i = 0; i &#60; numBuf; i++) </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;char &nbsp; &nbsp;*sbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= (char*) &nbsp; &nbsp;malloc(numBufSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WAVEHDR *wvBuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = (WAVEHDR *)malloc(sizeof(*wvBuf));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvBuf -&#62; lpData &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= sbuf; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvBuf -&#62; dwFlags &nbsp; &nbsp; &nbsp; &nbsp; = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvBuf -&#62; dwLoops &nbsp; &nbsp; &nbsp; &nbsp; = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvBuf -&#62; dwUser &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvBuf -&#62; dwBufferLength &nbsp;= numBufSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvRes = &nbsp;waveInPrepareHeader(hwvInDev, wvBuf, sizeof(*wvBuf));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvErrorMes(&quot;\nНе удалось подготовить буфер для записи!\n&quot;, wvRes);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvRes = &nbsp;waveInAddBuffer(hwvInDev, wvBuf, sizeof(*wvBuf)); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvErrorMes(&quot;\nНе удалось добавить буфер для записи!\n&quot;, wvRes);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} </div><div class="code_line">&nbsp;&nbsp; &nbsp;wvRes = waveInStart(hwvInDev); &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;wvErrorMes(&quot;\nНе удалось начать запись!\n&quot;, wvRes);</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>и используется колбек функция:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void CALLBACK wvRecCallBack(HWAVEIN hwvInDev, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;WAVEHDR *wvBuf = (WAVEHDR*) dwParam1; &nbsp;</div><div class="code_line">&nbsp;&nbsp;MMRESULT wvRes = 0; </div><div class="code_line">&nbsp;&nbsp;switch(uMsg) </div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;case WIM_OPEN:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;\nЗапись началась\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case WIM_DATA:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(!mode)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;Операции с буфером\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;fwrite(wvBuf -&#62; lpData, wvBuf -&#62; dwBytesRecorded, 1, pf);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(mode == stop)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;cout &#60;&#60; &quot;Операции завершения записи&quot; &#60;&#60; endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;wvRes = waveInUnprepareHeader(hwvInDev, wvBuf, sizeof(*wvBuf));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;wvErrorMes(&quot;\nНе удалось освободить буфер!\n&quot;, wvRes); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;free(wvBuf -&#62; lpData);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;free((WAVEHDR*)dwParam1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;numBufCyr--;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;} &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvRes = &nbsp;waveInAddBuffer(hwvInDev, wvBuf, sizeof(*wvBuf)); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;wvErrorMes(&quot;\nНе удалось добавить буфер для записи!\n&quot;, wvRes); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case WIM_CLOSE:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;printf(&quot;\nЗапись закончилась\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div>Возникли следующие вопросы:<br>
1. Буферы сформированы, колбек функция задана. Что значит и зачем строка:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">WAVEHDR *wvBuf = (WAVEHDR*) dwParam1;</div></ol></div></div></div></div>Она передает  сформированные буферы в колбек функцию? Как колбек функция определяет, что выделенные в программе буферы должны быть переданы через dwParam1?  <br>
2. Допустим, я хочу передать в колбек функцию целое число через dwParam2. Как это сделать? Ведь нигде в программе я не задаю, что dwParam1 связано с буферами, как колбек функция определит, с каким числом связан dwParam2?]]></description>
        <author>tuchin</author>
        <category>Программирование звука</category>
      </item>
	
      </channel>
      </rss>
	