<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Matthew van Eerde's web log</title><link>http://blogs.msdn.com/b/matthew_van_eerde/</link><description /><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>An attempt to explain the twin prime conjecture to a five-year-old</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2013/06/09/an-attempt-to-explain-the-twin-prime-conjecture-to-a-five-year-old.aspx</link><pubDate>Sun, 09 Jun 2013 08:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10424617</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10424617</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2013/06/09/an-attempt-to-explain-the-twin-prime-conjecture-to-a-five-year-old.aspx#comments</comments><description>&lt;p&gt;Back in April, &lt;a href="http://en.wikipedia.org/wiki/Zhang_Yitang"&gt;Zhang Yitang came up with a result that is a major step toward proving the &lt;em&gt;twin prime conjecture&lt;/em&gt;&lt;/a&gt;&amp;nbsp;that there are infinitely many primes &lt;em&gt;p&lt;/em&gt;&amp;nbsp;for which &lt;em&gt;p&lt;/em&gt;&amp;nbsp;+ 2 is also prime.&lt;/p&gt;
&lt;p&gt;In a &lt;a href="http://www.reddit.com/r/math/comments/1fvd55/ongoing_progress_on_tightening_zhangs_bound/"&gt;reddit.com/r/math thread&lt;/a&gt; on the subject, &lt;a href="http://www.reddit.com/r/math/comments/1fvd55/ongoing_progress_on_tightening_zhangs_bound/caerk8u"&gt;I made the following comment&lt;/a&gt; as an attempt to explain the twin prime conjecture to a five-year-old:&lt;/p&gt;
&lt;div style="padding-left: 30px;"&gt;
&lt;p&gt;ELI5 attempt at the twin prime conjecture&lt;/p&gt;
&lt;p&gt;Think of cookie parties.&lt;/p&gt;
&lt;p&gt;If you have 100 cookies, you could have a cookie party:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;by yourself (you get all the cookies)&lt;/li&gt;
&lt;li&gt;with two people (each person gets 50 cookies)&lt;/li&gt;
&lt;li&gt;with four people (each person gets 25 cookies)&lt;/li&gt;
&lt;li&gt;with five people (each person gets 20 cookies)&lt;/li&gt;
&lt;li&gt;with ten people (each person gets ten cookies)&lt;/li&gt;
&lt;li&gt;with 20 people (each person gets five cookies)&lt;/li&gt;
&lt;li&gt;with 25 people (each person gets four cookies)&lt;/li&gt;
&lt;li&gt;with 50 people (each person gets two cookies)&lt;/li&gt;
&lt;li&gt;with 100 people (each person gets one cookie)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're the only person at your party, it's a sad party.&lt;/p&gt;
&lt;p&gt;If everyone at the party gets only one cookie, it's a sad party.&lt;/p&gt;
&lt;p&gt;If someone gets more than someone else, it's a sad party.&lt;/p&gt;
&lt;p&gt;You don't want your party to be sad, so you have to be careful to have the right number of people to share your cookies.&lt;/p&gt;
&lt;p&gt;If you have two cookies, or three, or five, or seven, or eleven, then it's not possible to have a happy party. There's no "right number of people."&lt;/p&gt;
&lt;p&gt;People used to wonder whether you could be sure to have a happy party if you just had&amp;nbsp;&lt;em&gt;enough&lt;/em&gt;&amp;nbsp;cookies. A famous person named Euclid figured out that, no matter how many cookies you had, even if it was, like, more than a million, you might be unlucky and have a sad number of cookies.&lt;/p&gt;
&lt;p&gt;If it's a birthday party, the birthday kid's mom might give the birthday kid an extra cookie. (Or they might get something else instead.) That would be OK.&lt;/p&gt;
&lt;p&gt;If it's a birthday party, then, yes, you&amp;nbsp;&lt;em&gt;can&lt;/em&gt;&amp;nbsp;be sure to have a happy party if you just had enough cookies. In fact, even three cookies would be enough; you could have the birthday kid, and one friend; they would each have one cookie, and the birthday kid would get the extra one.&lt;/p&gt;
&lt;p&gt;But Sam and Jane have a problem. They're twins, and they always have the same birthday. One year they had 13 cookies, and it was a big problem. 13 is a sad number. Even if they both had an extra cookie, that would leave 11, and that is still a sad number.&lt;/p&gt;
&lt;p&gt;(If you allow the birthday kid to have two extra cookies, that would leave nine; they could invite one more person, give everyone three cookies, and then Sam and Jane could each have two extras. But this is not a happy party because the guests will get upset that the birthday kids got&amp;nbsp;&lt;em&gt;two&lt;/em&gt;&amp;nbsp;extra cookies. I mean,&amp;nbsp;&lt;em&gt;come on!&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Sam and Jane wondered whether they could be sure to have a happy party if they just had&amp;nbsp;&lt;em&gt;enough&lt;/em&gt;&amp;nbsp;cookies.&lt;/p&gt;
&lt;p&gt;So they asked their mom, who is, like, super smart.&lt;/p&gt;
&lt;p&gt;But even&amp;nbsp;&lt;em&gt;she&lt;/em&gt;&amp;nbsp;didn't know.&lt;/p&gt;
&lt;p&gt;In fact,&amp;nbsp;&lt;em&gt;no-one&lt;/em&gt;&amp;nbsp;knows. They don't think so. But they're not, like, super-sure.&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10424617" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Math/">Math</category></item><item><title>Grabbing the output of the Microsoft Speech API text-to-speech engine as audio data</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2013/03/13/grabbing-the-output-of-the-microsoft-speech-api-text-to-speech-engine-as-audio-data.aspx</link><pubDate>Wed, 13 Mar 2013 17:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10402057</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10402057</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2013/03/13/grabbing-the-output-of-the-microsoft-speech-api-text-to-speech-engine-as-audio-data.aspx#comments</comments><description>&lt;p&gt;A while ago I wrote a post on &lt;a href="http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/20/implementing-a-quot-say-quot-command-using-ispvoice-from-the-microsoft-speech-api.aspx"&gt;Implementing a "say" command using ISpVoice from the Microsoft Speech API&lt;/a&gt;&amp;nbsp;which showed how to use Speech API to do text-to-speech, but was limited to playing the generated audio out of the default audio device.&lt;/p&gt;
&lt;p&gt;Recently on the Windows Pro Audio forums, user falven asked a question about &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowspro-audiodevelopment/thread/149afcb1-a39a-453c-800e-78e04451aa19"&gt;how to grab the output of the text-to-speech engine as a stream for further processing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's how to do it.&lt;/p&gt;
&lt;p&gt;The key part is to use ISpStream::BindToFile to save the audio data to a .wav file, and ISpStream::SetBaseStream to&amp;nbsp;save to&amp;nbsp;a given&amp;nbsp;IStream. Then call ISpVoice::SetOutput with the ISpStream, prior to calling ISpVoice::Speak.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISpStream *pSpStream = nullptr;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = CoCreateInstance(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID_SpStream, nullptr, CLSCTX_ALL, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __uuidof(ISpStream),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void**)&amp;amp;pSpStream&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERR(L"CoCreateInstance(ISpVoice) failed: hr = 0x%08x", hr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReleaseOnExit rSpStream(pSpStream);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (File == where) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pSpStream-&amp;gt;BindToFile(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPFM_CREATE_ALWAYS,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;SPDFID_WaveFormatEx,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;fmt,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERR(L"ISpStream::BindToFile failed: hr = 0x%08x", hr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // stream&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pStream = SHCreateMemStream(NULL, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == pStream) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERR(L"SHCreateMemStream failed");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pSpStream-&amp;gt;SetBaseStream(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pStream,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SPDFID_WaveFormatEx,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;fmt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERR(L"ISpStream::SetBaseStream failed: hr = 0x%08x", hr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pSpVoice-&amp;gt;SetOutput(pSpStream, TRUE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ERR(L"ISpVoice::SetOutput failed: hr = 0x%08x", hr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Updated source and binaries attached.&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;gt;say.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;say "phrase" [--file &amp;lt;filename&amp;gt; | --stream]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;runs phrase through text-to-speech engine&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;if --file is specified, writes to .wav file&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;if --stream is specified, captures to a stream&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;if neither is specified, plays to default output&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Here's how to generate a .wav file (uh.wav attached)&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;gt;say.exe "uh" --file uh.wav&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;Stream is 1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;And here's how to generate an output stream. The app consumes this and prints the INT16 sample values to the console. uh.txt attached.&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;gt;say.exe "uh" --stream&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;Stream is 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 86&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 86;&amp;nbsp;&amp;nbsp;&amp;nbsp; -1052&amp;nbsp;&amp;nbsp;&amp;nbsp; -1052;&amp;nbsp;&amp;nbsp;&amp;nbsp; -2839&amp;nbsp;&amp;nbsp;&amp;nbsp; -2839;&amp;nbsp;&amp;nbsp;&amp;nbsp; -3774&amp;nbsp;&amp;nbsp;&amp;nbsp; -3774&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp; -4199&amp;nbsp;&amp;nbsp;&amp;nbsp; -4199;&amp;nbsp;&amp;nbsp;&amp;nbsp; -4581&amp;nbsp;&amp;nbsp;&amp;nbsp; -4581;&amp;nbsp;&amp;nbsp;&amp;nbsp; -4284&amp;nbsp;&amp;nbsp;&amp;nbsp; -4284;&amp;nbsp;&amp;nbsp;&amp;nbsp; -3640&amp;nbsp;&amp;nbsp;&amp;nbsp; -3640&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;&amp;nbsp;&amp;nbsp; -3100&amp;nbsp;&amp;nbsp;&amp;nbsp; -3100;&amp;nbsp;&amp;nbsp;&amp;nbsp; -2011&amp;nbsp;&amp;nbsp;&amp;nbsp; -2011;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -393&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -393;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 533&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 533&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new,courier;"&gt;...&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10402057" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-40-20-57/say.zip" length="56453" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Audio/">Audio</category><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>How to dump Speech API object properties</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/11/21/how-to-dump-speech-api-object-properties.aspx</link><pubDate>Thu, 22 Nov 2012 00:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10370777</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10370777</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/11/21/how-to-dump-speech-api-object-properties.aspx#comments</comments><description>&lt;p&gt;Stamatis Pap asked in&amp;nbsp;a forum thread&amp;nbsp;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowspro-audiodevelopment/thread/a9241198-9e54-4358-8608-0a21163e0654"&gt;how to use a Speech API ISpVoice with a non-default audio device&lt;/a&gt;.&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/jj127910.aspx"&gt;This MSDN article&lt;/a&gt; shows how to use SpEnumTokens to list all the currently active audio outputs, but the number and order of audio outputs is subject to change as things come and go, or as the default audio device changes.&lt;/p&gt;
&lt;p&gt;I spent some time poking around the Speech API documentation and discovered that each audio output object has a DeviceId string value which is the WASAPI endpoint ID; this is the way to recognize a given audio output rather than relying on enumeration order.&lt;/p&gt;
&lt;p&gt;As part of figuring this out, as a side effect I created a command-line tool to dump all the speech objects and all of their properties.&lt;/p&gt;
&lt;p&gt;Source and binaries attached.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;div style="padding-left: 30px; font-family: monospace;"&gt;&lt;br /&gt;for&amp;nbsp;each object category in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (audio outputs; audio inputs; voices; recognizers; etc.)&lt;/div&gt;
&lt;div style="padding-left: 30px; font-family: monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SpEnumTokens(category)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISpEnumTokens::GetCount();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each token&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ISpEnumTokens::Next(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SpGetDescription(ISpObjectToken);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log the description&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the ISpObjectToken is also an ISpDataKey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the ISpDataKey may also contain subkeys&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log all subkeys and their values recursively&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using ISpDataKey::EnumKeys and ISpDataKey::OpenKey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each subkey including this one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log all values in the ISpDataKey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; using ISpDataKey::EnumValues and ISpDataKey::GetStringValue&lt;/div&gt;
&lt;p&gt;Here's the output on my system.&amp;nbsp; Note the audio output has a DeviceId string value which matches the WASAPI endpoint ID.&lt;/p&gt;
&lt;div style="padding-left: 30px; font-family: monospace;"&gt;
&lt;p&gt;&amp;gt;speech-attributes.exe&lt;/p&gt;
&lt;p&gt;-- SPCAT_AUDIOOUT --&lt;br /&gt;&amp;nbsp; #1: [[Speakers] ([High Definition Audio Device])]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vendor = Microsoft&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Technology = MMSys&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = [[Speakers] ([High Definition Audio Device])]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {A8C680EB-3D32-11D2-9EE7-00C04F797396}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeviceName = [[Speakers] ([High Definition Audio Device])]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #ffff00;"&gt;DeviceId = {0.0.0.00000000}.{c2cbdacb-a70d-4629-8368-542a00f5a4b0}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;-- SPCAT_AUDIOIN --&lt;/p&gt;
&lt;p&gt;-- SPCAT_VOICES --&lt;br /&gt;&amp;nbsp; #1: Microsoft Zira Desktop - English (United States)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Version = 10.4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 409&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Gender = Female&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = Adult&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SharedPronunciation = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = Microsoft Zira Desktop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Vendor = Microsoft&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Microsoft Zira Desktop - English (United States)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LangDataPath = C:\Windows\Speech\Engines\TTS\en-US\MSTTSLocEnUS.dat&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VoicePath = C:\Windows\Speech\Engines\TTS\en-US\M1033ZIR&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 409 = Microsoft Zira Desktop - English (United States)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {C64501F6-E6E6-451f-A150-25D0839BC510}&lt;/p&gt;
&lt;p&gt;-- SPCAT_RECOGNIZERS --&lt;/p&gt;
&lt;p&gt;-- SPCAT_APPLEXICONS --&lt;/p&gt;
&lt;p&gt;-- SPCAT_PHONECONVERTERS --&lt;br /&gt;&amp;nbsp; #1: Simplified Chinese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 804&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Simplified Chinese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap =&amp;nbsp;&lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #2: English Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 409&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = English Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #3: French Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 40C&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = French Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #4: German Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 407&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = German Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #5: Japanese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 411&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericPhones = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoDelimiter = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Japanese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #6: Spanish Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 40A;C0A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Spanish Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #7: Traditional Chinese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = 404&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumericPhones = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoDelimiter = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Traditional Chinese Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;br /&gt;&amp;nbsp; #8: Universal Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Attributes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Language = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (default) = Universal Phone Converter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PhoneMap = &lt;em&gt;(lengthy value redacted)&lt;/em&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSID = {9185F743-1143-4C28-86B5-BFF14F20E5C8}&lt;/p&gt;
&lt;p&gt;-- SPCAT_RECOPROFILES --&lt;br /&gt;&amp;nbsp; None found.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10370777" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-37-07-77/speech_2D00_attributes.zip" length="17983" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Audio/">Audio</category><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>Generating sample first names</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/24/generating-sample-first-names.aspx</link><pubDate>Wed, 24 Oct 2012 20:57:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10362503</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10362503</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/24/generating-sample-first-names.aspx#comments</comments><description>&lt;p&gt;I had a need to write a script that would give me a random first name.&amp;nbsp; I grabbed the top 200 first names for baby boys in the US from 2000-2009, and the same list for baby girls:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ssa.gov/OACT/babynames/decades/names2000s.html"&gt;http://www.ssa.gov/OACT/babynames/decades/names2000s.html&lt;/a&gt;&lt;/p&gt;
&lt;table border="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Girls&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jacob&lt;/td&gt;
&lt;td&gt;Emily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Michael&lt;/td&gt;
&lt;td&gt;Madison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;My initial implementation just printed out the name, but I quickly realized I needed to print out the gender if I wanted to talk about what the (fictitious) person did.&amp;nbsp; So I updated it to print out the gender as well.&lt;/p&gt;
&lt;p&gt;In the course of this I realized that some names appeared on both lists.&amp;nbsp; In particular they are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alexis&lt;/li&gt;
&lt;li&gt;Angel&lt;/li&gt;
&lt;li&gt;Jordan&lt;/li&gt;
&lt;li&gt;Peyton&lt;/li&gt;
&lt;li&gt;Riley&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The script is called like this:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;&amp;gt;perl -w name.pl&lt;br /&gt;Wesley (male)&lt;/p&gt;
&lt;p&gt;And here's the source:&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;use strict;&lt;/p&gt;
&lt;p&gt;# prints a randomly chosen name&lt;/p&gt;
&lt;p&gt;sub read_words();&lt;/p&gt;
&lt;p&gt;my @words = read_words();&lt;br /&gt;print $words[ rand(@words) ];&lt;/p&gt;
&lt;p&gt;sub read_words() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my @words = &amp;lt;DATA&amp;gt;;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chomp @words;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return @words;&lt;br /&gt;}&lt;br /&gt;__DATA__&lt;br /&gt;Aaliyah (female)&lt;br /&gt;Aaron (male)&lt;br /&gt;Abby (female)&lt;br /&gt;Abigail (female)&lt;br /&gt;Abraham (male)&lt;br /&gt;Adam (male)&lt;br /&gt;Addison (female)&lt;br /&gt;Adrian (male)&lt;br /&gt;Adriana (female)&lt;br /&gt;Adrianna (female)&lt;br /&gt;Aidan (male)&lt;br /&gt;Aiden (male)&lt;br /&gt;Alan (male)&lt;br /&gt;Alana (female)&lt;br /&gt;Alejandro (male)&lt;br /&gt;Alex (male)&lt;br /&gt;Alexa (female)&lt;br /&gt;Alexander (male)&lt;br /&gt;Alexandra (female)&lt;br /&gt;Alexandria (female)&lt;br /&gt;Alexia (female)&lt;br /&gt;Alexis (female)&lt;br /&gt;Alexis (male)&lt;br /&gt;Alicia (female)&lt;br /&gt;Allison (female)&lt;br /&gt;Alondra (female)&lt;br /&gt;Alyssa (female)&lt;br /&gt;Amanda (female)&lt;br /&gt;Amber (female)&lt;br /&gt;Amelia (female)&lt;br /&gt;Amy (female)&lt;br /&gt;Ana (female)&lt;br /&gt;Andrea (female)&lt;br /&gt;Andres (male)&lt;br /&gt;Andrew (male)&lt;br /&gt;Angel (female)&lt;br /&gt;Angel (male)&lt;br /&gt;Angela (female)&lt;br /&gt;Angelica (female)&lt;br /&gt;Angelina (female)&lt;br /&gt;Anna (female)&lt;br /&gt;Anthony (male)&lt;br /&gt;Antonio (male)&lt;br /&gt;Ariana (female)&lt;br /&gt;Arianna (female)&lt;br /&gt;Ashley (female)&lt;br /&gt;Ashlyn (female)&lt;br /&gt;Ashton (male)&lt;br /&gt;Aubrey (female)&lt;br /&gt;Audrey (female)&lt;br /&gt;Austin (male)&lt;br /&gt;Autumn (female)&lt;br /&gt;Ava (female)&lt;br /&gt;Avery (female)&lt;br /&gt;Ayden (male)&lt;br /&gt;Bailey (female)&lt;br /&gt;Benjamin (male)&lt;br /&gt;Bianca (female)&lt;br /&gt;Blake (male)&lt;br /&gt;Braden (male)&lt;br /&gt;Bradley (male)&lt;br /&gt;Brady (male)&lt;br /&gt;Brandon (male)&lt;br /&gt;Brayden (male)&lt;br /&gt;Breanna (female)&lt;br /&gt;Brendan (male)&lt;br /&gt;Brian (male)&lt;br /&gt;Briana (female)&lt;br /&gt;Brianna (female)&lt;br /&gt;Brittany (female)&lt;br /&gt;Brody (male)&lt;br /&gt;Brooke (female)&lt;br /&gt;Brooklyn (female)&lt;br /&gt;Bryan (male)&lt;br /&gt;Bryce (male)&lt;br /&gt;Bryson (male)&lt;br /&gt;Caden (male)&lt;br /&gt;Caitlin (female)&lt;br /&gt;Caitlyn (female)&lt;br /&gt;Caleb (male)&lt;br /&gt;Cameron (male)&lt;br /&gt;Camila (female)&lt;br /&gt;Carlos (male)&lt;br /&gt;Caroline (female)&lt;br /&gt;Carson (male)&lt;br /&gt;Carter (male)&lt;br /&gt;Cassandra (female)&lt;br /&gt;Cassidy (female)&lt;br /&gt;Catherine (female)&lt;br /&gt;Cesar (male)&lt;br /&gt;Charles (male)&lt;br /&gt;Charlotte (female)&lt;br /&gt;Chase (male)&lt;br /&gt;Chelsea (female)&lt;br /&gt;Cheyenne (female)&lt;br /&gt;Chloe (female)&lt;br /&gt;Christian (male)&lt;br /&gt;Christina (female)&lt;br /&gt;Christopher (male)&lt;br /&gt;Claire (female)&lt;br /&gt;Cody (male)&lt;br /&gt;Colby (male)&lt;br /&gt;Cole (male)&lt;br /&gt;Colin (male)&lt;br /&gt;Collin (male)&lt;br /&gt;Colton (male)&lt;br /&gt;Conner (male)&lt;br /&gt;Connor (male)&lt;br /&gt;Cooper (male)&lt;br /&gt;Courtney (female)&lt;br /&gt;Cristian (male)&lt;br /&gt;Crystal (female)&lt;br /&gt;Daisy (female)&lt;br /&gt;Dakota (male)&lt;br /&gt;Dalton (male)&lt;br /&gt;Damian (male)&lt;br /&gt;Daniel (male)&lt;br /&gt;Daniela (female)&lt;br /&gt;Danielle (female)&lt;br /&gt;David (male)&lt;br /&gt;Delaney (female)&lt;br /&gt;Derek (male)&lt;br /&gt;Destiny (female)&lt;br /&gt;Devin (male)&lt;br /&gt;Devon (male)&lt;br /&gt;Diana (female)&lt;br /&gt;Diego (male)&lt;br /&gt;Dominic (male)&lt;br /&gt;Donovan (male)&lt;br /&gt;Dylan (male)&lt;br /&gt;Edgar (male)&lt;br /&gt;Eduardo (male)&lt;br /&gt;Edward (male)&lt;br /&gt;Edwin (male)&lt;br /&gt;Eli (male)&lt;br /&gt;Elias (male)&lt;br /&gt;Elijah (male)&lt;br /&gt;Elizabeth (female)&lt;br /&gt;Ella (female)&lt;br /&gt;Ellie (female)&lt;br /&gt;Emily (female)&lt;br /&gt;Emma (female)&lt;br /&gt;Emmanuel (male)&lt;br /&gt;Eric (male)&lt;br /&gt;Erica (female)&lt;br /&gt;Erick (male)&lt;br /&gt;Erik (male)&lt;br /&gt;Erin (female)&lt;br /&gt;Ethan (male)&lt;br /&gt;Eva (female)&lt;br /&gt;Evan (male)&lt;br /&gt;Evelyn (female)&lt;br /&gt;Faith (female)&lt;br /&gt;Fernando (male)&lt;br /&gt;Francisco (male)&lt;br /&gt;Gabriel (male)&lt;br /&gt;Gabriela (female)&lt;br /&gt;Gabriella (female)&lt;br /&gt;Gabrielle (female)&lt;br /&gt;Gage (male)&lt;br /&gt;Garrett (male)&lt;br /&gt;Gavin (male)&lt;br /&gt;Genesis (female)&lt;br /&gt;George (male)&lt;br /&gt;Gianna (female)&lt;br /&gt;Giovanni (male)&lt;br /&gt;Giselle (female)&lt;br /&gt;Grace (female)&lt;br /&gt;Gracie (female)&lt;br /&gt;Grant (male)&lt;br /&gt;Gregory (male)&lt;br /&gt;Hailey (female)&lt;br /&gt;Haley (female)&lt;br /&gt;Hannah (female)&lt;br /&gt;Hayden (male)&lt;br /&gt;Hector (male)&lt;br /&gt;Henry (male)&lt;br /&gt;Hope (female)&lt;br /&gt;Hunter (male)&lt;br /&gt;Ian (male)&lt;br /&gt;Isaac (male)&lt;br /&gt;Isabel (female)&lt;br /&gt;Isabella (female)&lt;br /&gt;Isabelle (female)&lt;br /&gt;Isaiah (male)&lt;br /&gt;Ivan (male)&lt;br /&gt;Jack (male)&lt;br /&gt;Jackson (male)&lt;br /&gt;Jacob (male)&lt;br /&gt;Jacqueline (female)&lt;br /&gt;Jada (female)&lt;br /&gt;Jade (female)&lt;br /&gt;Jaden (male)&lt;br /&gt;Jake (male)&lt;br /&gt;Jalen (male)&lt;br /&gt;James (male)&lt;br /&gt;Jared (male)&lt;br /&gt;Jasmin (female)&lt;br /&gt;Jasmine (female)&lt;br /&gt;Jason (male)&lt;br /&gt;Javier (male)&lt;br /&gt;Jayden (male)&lt;br /&gt;Jayla (female)&lt;br /&gt;Jazmin (female)&lt;br /&gt;Jeffrey (male)&lt;br /&gt;Jenna (female)&lt;br /&gt;Jennifer (female)&lt;br /&gt;Jeremiah (male)&lt;br /&gt;Jeremy (male)&lt;br /&gt;Jesse (male)&lt;br /&gt;Jessica (female)&lt;br /&gt;Jesus (male)&lt;br /&gt;Jillian (female)&lt;br /&gt;Jocelyn (female)&lt;br /&gt;Joel (male)&lt;br /&gt;John (male)&lt;br /&gt;Johnathan (male)&lt;br /&gt;Jonah (male)&lt;br /&gt;Jonathan (male)&lt;br /&gt;Jordan (female)&lt;br /&gt;Jordan (male)&lt;br /&gt;Jordyn (female)&lt;br /&gt;Jorge (male)&lt;br /&gt;Jose (male)&lt;br /&gt;Joseph (male)&lt;br /&gt;Joshua (male)&lt;br /&gt;Josiah (male)&lt;br /&gt;Juan (male)&lt;br /&gt;Julia (female)&lt;br /&gt;Julian (male)&lt;br /&gt;Juliana (female)&lt;br /&gt;Justin (male)&lt;br /&gt;Kaden (male)&lt;br /&gt;Kaitlyn (female)&lt;br /&gt;Kaleb (male)&lt;br /&gt;Karen (female)&lt;br /&gt;Karina (female)&lt;br /&gt;Kate (female)&lt;br /&gt;Katelyn (female)&lt;br /&gt;Katherine (female)&lt;br /&gt;Kathryn (female)&lt;br /&gt;Katie (female)&lt;br /&gt;Kayla (female)&lt;br /&gt;Kaylee (female)&lt;br /&gt;Kelly (female)&lt;br /&gt;Kelsey (female)&lt;br /&gt;Kendall (female)&lt;br /&gt;Kennedy (female)&lt;br /&gt;Kenneth (male)&lt;br /&gt;Kevin (male)&lt;br /&gt;Kiara (female)&lt;br /&gt;Kimberly (female)&lt;br /&gt;Kyle (male)&lt;br /&gt;Kylee (female)&lt;br /&gt;Kylie (female)&lt;br /&gt;Landon (male)&lt;br /&gt;Laura (female)&lt;br /&gt;Lauren (female)&lt;br /&gt;Layla (female)&lt;br /&gt;Leah (female)&lt;br /&gt;Leonardo (male)&lt;br /&gt;Leslie (female)&lt;br /&gt;Levi (male)&lt;br /&gt;Liam (male)&lt;br /&gt;Liliana (female)&lt;br /&gt;Lillian (female)&lt;br /&gt;Lilly (female)&lt;br /&gt;Lily (female)&lt;br /&gt;Lindsey (female)&lt;br /&gt;Logan (male)&lt;br /&gt;Lucas (male)&lt;br /&gt;Lucy (female)&lt;br /&gt;Luis (male)&lt;br /&gt;Luke (male)&lt;br /&gt;Lydia (female)&lt;br /&gt;Mackenzie (female)&lt;br /&gt;Madeline (female)&lt;br /&gt;Madelyn (female)&lt;br /&gt;Madison (female)&lt;br /&gt;Makayla (female)&lt;br /&gt;Makenzie (female)&lt;br /&gt;Malachi (male)&lt;br /&gt;Manuel (male)&lt;br /&gt;Marco (male)&lt;br /&gt;Marcus (male)&lt;br /&gt;Margaret (female)&lt;br /&gt;Maria (female)&lt;br /&gt;Mariah (female)&lt;br /&gt;Mario (male)&lt;br /&gt;Marissa (female)&lt;br /&gt;Mark (male)&lt;br /&gt;Martin (male)&lt;br /&gt;Mary (female)&lt;br /&gt;Mason (male)&lt;br /&gt;Matthew (male)&lt;br /&gt;Max (male)&lt;br /&gt;Maxwell (male)&lt;br /&gt;Maya (female)&lt;br /&gt;Mckenzie (female)&lt;br /&gt;Megan (female)&lt;br /&gt;Melanie (female)&lt;br /&gt;Melissa (female)&lt;br /&gt;Mia (female)&lt;br /&gt;Micah (male)&lt;br /&gt;Michael (male)&lt;br /&gt;Michelle (female)&lt;br /&gt;Miguel (male)&lt;br /&gt;Mikayla (female)&lt;br /&gt;Miranda (female)&lt;br /&gt;Molly (female)&lt;br /&gt;Morgan (female)&lt;br /&gt;Mya (female)&lt;br /&gt;Naomi (female)&lt;br /&gt;Natalia (female)&lt;br /&gt;Natalie (female)&lt;br /&gt;Nathan (male)&lt;br /&gt;Nathaniel (male)&lt;br /&gt;Nevaeh (female)&lt;br /&gt;Nicholas (male)&lt;br /&gt;Nicolas (male)&lt;br /&gt;Nicole (female)&lt;br /&gt;Noah (male)&lt;br /&gt;Nolan (male)&lt;br /&gt;Oliver (male)&lt;br /&gt;Olivia (female)&lt;br /&gt;Omar (male)&lt;br /&gt;Oscar (male)&lt;br /&gt;Owen (male)&lt;br /&gt;Paige (female)&lt;br /&gt;Parker (male)&lt;br /&gt;Patrick (male)&lt;br /&gt;Paul (male)&lt;br /&gt;Payton (female)&lt;br /&gt;Peter (male)&lt;br /&gt;Peyton (female)&lt;br /&gt;Peyton (male)&lt;br /&gt;Preston (male)&lt;br /&gt;Rachel (female)&lt;br /&gt;Raymond (male)&lt;br /&gt;Reagan (female)&lt;br /&gt;Rebecca (female)&lt;br /&gt;Ricardo (male)&lt;br /&gt;Richard (male)&lt;br /&gt;Riley (female)&lt;br /&gt;Riley (male)&lt;br /&gt;Robert (male)&lt;br /&gt;Ruby (female)&lt;br /&gt;Ryan (male)&lt;br /&gt;Rylee (female)&lt;br /&gt;Sabrina (female)&lt;br /&gt;Sadie (female)&lt;br /&gt;Samantha (female)&lt;br /&gt;Samuel (male)&lt;br /&gt;Sara (female)&lt;br /&gt;Sarah (female)&lt;br /&gt;Savannah (female)&lt;br /&gt;Sean (male)&lt;br /&gt;Sebastian (male)&lt;br /&gt;Serenity (female)&lt;br /&gt;Sergio (male)&lt;br /&gt;Seth (male)&lt;br /&gt;Shane (male)&lt;br /&gt;Shawn (male)&lt;br /&gt;Shelby (female)&lt;br /&gt;Sierra (female)&lt;br /&gt;Skylar (female)&lt;br /&gt;Sofia (female)&lt;br /&gt;Sophia (female)&lt;br /&gt;Sophie (female)&lt;br /&gt;Spencer (male)&lt;br /&gt;Stephanie (female)&lt;br /&gt;Stephen (male)&lt;br /&gt;Steven (male)&lt;br /&gt;Summer (female)&lt;br /&gt;Sydney (female)&lt;br /&gt;Tanner (male)&lt;br /&gt;Taylor (female)&lt;br /&gt;Thomas (male)&lt;br /&gt;Tiffany (female)&lt;br /&gt;Timothy (male)&lt;br /&gt;Travis (male)&lt;br /&gt;Trenton (male)&lt;br /&gt;Trevor (male)&lt;br /&gt;Trinity (female)&lt;br /&gt;Tristan (male)&lt;br /&gt;Tyler (male)&lt;br /&gt;Valeria (female)&lt;br /&gt;Valerie (female)&lt;br /&gt;Vanessa (female)&lt;br /&gt;Veronica (female)&lt;br /&gt;Victor (male)&lt;br /&gt;Victoria (female)&lt;br /&gt;Vincent (male)&lt;br /&gt;Wesley (male)&lt;br /&gt;William (male)&lt;br /&gt;Wyatt (male)&lt;br /&gt;Xavier (male)&lt;br /&gt;Zachary (male)&lt;br /&gt;Zoe (female)&lt;br /&gt;Zoey (female)&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10362503" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Math/">Math</category></item><item><title>Programmatically adding a folder to a shell library (e.g., the Music library)</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/18/programmatically-adding-a-folder-to-a-shell-library-e-g-the-music-library.aspx</link><pubDate>Thu, 18 Oct 2012 17:51:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10360892</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10360892</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/18/programmatically-adding-a-folder-to-a-shell-library-e-g-the-music-library.aspx#comments</comments><description>&lt;p&gt;I wrote a selfhost tool which allows me to add a folder (for example, C:\music) to a shell library (for example, the Music library.)&lt;/p&gt;
&lt;p&gt;This was before I found out about the &lt;a href="http://msdn.microsoft.com/library/dd940379"&gt;shlib shell library sample&lt;/a&gt; which &lt;a href="http://blogs.msdn.com/b/oldnewthing/archive/2012/08/28/10343980.aspx"&gt;Raymond Chen blogged about&lt;/a&gt;.&amp;nbsp; If you're looking for a sample on how to manipulate shell libraries, prefer that one to this.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;CoInitialize&lt;br /&gt;pShellLibrary = SHLoadLibraryFromKnownFolder(library GUID)&lt;br /&gt;SHAddFolderPathToLibrary(pShellLibrary, path)&lt;br /&gt;pShellLibrary-&amp;gt;Commit()&lt;br /&gt;CoUninitialize&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;&amp;gt;shelllibrary&lt;br /&gt;shelllibrary add &amp;lt;path&amp;gt; to &amp;lt;library&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;path&amp;gt; must already exist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;library&amp;gt; must be one of:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; documents&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; music&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pictures&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; videos&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; recorded tv&lt;br /&gt;&amp;gt;shelllibrary add C:\music to Music&lt;br /&gt;Added C:\music to Music library&lt;/p&gt;
&lt;p&gt;Source and binaries attached.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10360892" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-36-08-92/shelllibrary.zip" length="16235" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>Changing the desktop wallpaper using IDesktopWallpaper</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/10/changing-the-desktop-wallpaper-using-idesktopwallpaper.aspx</link><pubDate>Wed, 10 Oct 2012 13:20:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10358259</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10358259</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/10/changing-the-desktop-wallpaper-using-idesktopwallpaper.aspx#comments</comments><description>&lt;p&gt;About a year ago I wrote about &lt;a href="http://blogs.msdn.com/b/matthew_van_eerde/archive/2011/11/03/command-line-app-to-set-the-desktop-wallpaper.aspx"&gt;how to change the desktop wallpaper using SystemParametersInfo(SPI_SETDESKWALLPAPER)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Windows 8 desktop apps (not Store apps) can use the new &lt;a href="http://msdn.microsoft.com/en-us/library/hh706946(v=vs.85).aspx"&gt;IDesktopWallpaper API&lt;/a&gt; to get a more fine level of control.&amp;nbsp; So I wrote an app which uses the new API, though I just set the background on all monitors to the same image path, and I don't exercise any of the advanced features of the API.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;CoInitialize&lt;br /&gt;CoCreateInstance(DesktopWallpaper)&lt;br /&gt;pDesktopWallpaper-&amp;gt;SetWallpaper(NULL, full-path-to-image-file)&lt;br /&gt;pDesktopWallpaper-&amp;gt;Release()&lt;br /&gt;CoUninitialize&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;&amp;gt;desktopwallpaper.exe "%userprofile%\pictures\theda-bara.bmp"&lt;br /&gt;Setting the desktop wallpaper to C:\Users\MatEer\pictures\theda-bara.bmp succeeded.&lt;/p&gt;
&lt;p&gt;Source and binaries attached&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10358259" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-35-82-59/desktopwallpaper.zip" length="13570" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>Grabbing large amounts of text from STDIN in O(n) time</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/01/grabbing-large-amounts-of-text-from-stdin-in-o-n-time.aspx</link><pubDate>Mon, 01 Oct 2012 16:03:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10354800</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10354800</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/10/01/grabbing-large-amounts-of-text-from-stdin-in-o-n-time.aspx#comments</comments><description>&lt;p&gt;Last time &lt;a href="http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/28/finding-the-longest-substring-which-occurs-twice-in-a-given-string.aspx"&gt;I blogged about an O(&lt;em&gt;n&lt;/em&gt; log &lt;em&gt;n&lt;/em&gt;) solution to finding the longest duplicated substring in a given piece of text&lt;/a&gt;; I have since found an O(&lt;em&gt;n&lt;/em&gt;) algorithm, which I linked to in the comments.&lt;/p&gt;
&lt;p&gt;But my blog post used an O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;) algorithm to read the text from STDIN! It looked something like this:&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;while (!done) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; grab 2 KB of text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate a new buffer which is 2 KB bigger&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy the old text and the new text together into the new buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free the old buffer&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There are two better algorithms:&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;while (!done) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; grab an amount of text equal to the amount we've grabbed so far&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; allocate a new buffer which is twice as large as the last buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy the old text and the new text together into the new buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free the old buffer&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;And:&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;while (!done) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; grab 2 KB of text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; add this to the end of a linked list of text chunks&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;allocate a buffer whose size is the total size of all the chunks added together&lt;br /&gt;walk the linked list and copy the text of each chunk into the buffer&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Both "better" algorithms are O(&lt;em&gt;n&lt;/em&gt;) but the latter wastes less space.&lt;/p&gt;
&lt;p&gt;Here's the improved code:&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;struct Chunk {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR text[1024];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk() : next(nullptr) { text[0] = L'\0'; }&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;class DeleteChunksOnExit {&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteChunksOnExit() : m_p(nullptr) {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~DeleteChunksOnExit() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *here = m_p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (here) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *next = here-&amp;gt;next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete here;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; here = next;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Set(Chunk *p) { m_p = p; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;private:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *m_p;&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;LPWSTR ReadFromStdIn() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *head = nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *tail = nullptr;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteChunksOnExit dcoe;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t total_length = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool done = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!done) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunk *buffer = new Chunk();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == buffer) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for buffer");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == head) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // this runs on the first pass only&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; head = buffer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = buffer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dcoe.Set(buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tail-&amp;gt;next = buffer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tail = buffer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fgetws(buffer-&amp;gt;text, ARRAYSIZE(buffer-&amp;gt;text), stdin)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_length += wcslen(buffer-&amp;gt;text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else if (feof(stdin)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; done = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Error reading from STDIN");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // gather all the allocations into a single string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t size = total_length + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *text = new WCHAR[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == text) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for text");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteText(text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *temp = text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (Chunk *here = head; here; here = here-&amp;gt;next) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (wcscpy_s(temp, size, here-&amp;gt;text)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"wcscpy_s returned an error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t len = wcslen(here-&amp;gt;text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp += len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size -= len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleteText.Cancel();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return text;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10354800" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Math/">Math</category><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>Finding the longest substring which occurs twice in a given string</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/28/finding-the-longest-substring-which-occurs-twice-in-a-given-string.aspx</link><pubDate>Sat, 29 Sep 2012 00:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10354326</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10354326</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/28/finding-the-longest-substring-which-occurs-twice-in-a-given-string.aspx#comments</comments><description>&lt;p&gt;I'm reading &lt;a href="http://netlib.bell-labs.com/cm/cs/pearls/"&gt;Jon Bentley's Programming Pearls&lt;/a&gt; and one of the interesting exercises was to find the longest substring which occurs twice in a given string of length &lt;em&gt;n&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There's a na&amp;iuml;ve solution where you look at every pair of (distinct) indexes (&lt;em&gt;i&lt;/em&gt;, &lt;em&gt;j&lt;/em&gt;),&amp;nbsp;and&amp;nbsp;calculate the length of the common prefix of&amp;nbsp;the substrings starting at those locations; this is O(&lt;em&gt;n&lt;/em&gt;&lt;sup&gt;2&lt;/sup&gt;)&amp;nbsp;assuming that the length of the eventual maximum substring is&amp;nbsp;O(1) (that is, &amp;lt;&amp;lt; &lt;em&gt;n&lt;/em&gt;.)&lt;/p&gt;
&lt;p&gt;Jon shows that there is an O(&lt;em&gt;n&lt;/em&gt; log &lt;em&gt;n&lt;/em&gt;) algorithm, which is a significant savings if &lt;em&gt;n&lt;/em&gt; is large (e.g., &lt;em&gt;War and Peace&lt;/em&gt;.)&amp;nbsp; This involves building an array of all substrings, then sorting them lexically,&amp;nbsp;then walking the sorted array; the trick is that now we only need to check pairs of indexes that correspond to adjacent entries in the array.&amp;nbsp; That step can be done in O(&lt;em&gt;n&lt;/em&gt;) time; the O(&lt;em&gt;n&lt;/em&gt; log &lt;em&gt;n&lt;/em&gt;) comes from the sorting step.&lt;/p&gt;
&lt;p&gt;I wrote up a quick app that implements his suggested algorithm.&amp;nbsp; Source follows.&lt;/p&gt;
&lt;div style="font-family: monospace; padding-left: 30px;"&gt;
&lt;p&gt;// main.cpp&lt;/p&gt;
&lt;p&gt;#include &amp;lt;windows.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;search.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#define LOG(format, ...) wprintf(format L"\n", __VA_ARGS__)&lt;/p&gt;
&lt;p&gt;template&amp;lt;typename T&amp;gt;&lt;br /&gt;class DeleteArrayOnExit {&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit(T *p) : m_p(p), m_canceled(false) {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~DeleteArrayOnExit() { if (!m_canceled) { delete [] m_p; } }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Cancel() { m_canceled = true; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; void Swap(T *p) { m_p = p; }&lt;br /&gt;private:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; T *m_p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool m_canceled;&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;// caller must delete [] the buffer when done with it&lt;br /&gt;LPWSTR ReadFromStdIn();&lt;br /&gt;int __cdecl pwcscmp(const void *pstra, const void *pstrb) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return wcscmp(*(LPWSTR*)pstra, *(LPWSTR*)pstrb);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;// returns length of longest common substring&lt;br /&gt;// don't include the null terminator if both strings are identical&lt;br /&gt;// e.g., comlen(banana, bananas) == comlen(banana, banana) == 6&lt;br /&gt;int comlen(LPCWSTR a, LPCWSTR b) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // keep going while the strings are the same and not ended&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (a[i] &amp;amp;&amp;amp; (a[i] == b[i])) { i++; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return i;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;int _cdecl wmain() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR text = ReadFromStdIn();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == text) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteText(text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t size = wcslen(text) + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR *suffixes = new LPWSTR[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == suffixes) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for suffixes");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;LPWSTR&amp;gt; deleteSuffixes(suffixes);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (size_t i = 0; i &amp;lt; size; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; suffixes[i] = &amp;amp;text[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; qsort(suffixes, size, sizeof(LPWSTR), pwcscmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // find the longest common adjacent pair&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR szMax = suffixes[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t lenMax = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (size_t i = 0; i &amp;lt; size - 1; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t len = comlen(suffixes[i], suffixes[i + 1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (len &amp;gt; lenMax) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lenMax = len;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szMax = suffixes[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *substring = new WCHAR[lenMax + 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == substring) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for substring");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteSubstring(substring);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 != wcsncpy_s(substring, lenMax + 1, szMax, lenMax)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"wcsncpy_s failed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -__LINE__;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; substring[lenMax] = L'\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // intentionally not using LOG to avoid trailing newline&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wprintf(L"%s", substring);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;LPWSTR ReadFromStdIn() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *text = new WCHAR[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == text) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for text");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteText(text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; text[0] = L'\0';&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // read a 2 KB chunk&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const size_t buffer_size = 1024;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *buffer = new WCHAR[buffer_size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == buffer) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for buffer");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteBuffer(buffer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bool done = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (fgetws(buffer, buffer_size, stdin)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t size = wcslen(text) + wcslen(buffer) + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *new_text = new WCHAR[size];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nullptr == new_text) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Could not allocate memory for new text");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeleteArrayOnExit&amp;lt;WCHAR&amp;gt; deleteNewText(new_text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WCHAR *dest = new_text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 != wcscpy_s(dest, size, text)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"wcscpy_s failed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dest += wcslen(text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size -= wcslen(text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 != wcscpy_s(dest, size, buffer)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"wcscpy_s failed");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // that should do it for copying&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // now swap new_text =&amp;gt; text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete [] text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text = new_text;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleteText.Swap(new_text);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleteNewText.Cancel();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else if (feof(stdin)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; done = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(L"Error reading from STDIN");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nullptr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (!done);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; deleteText.Cancel();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return text;&lt;br /&gt;}&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10354326" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Math/">Math</category></item><item><title>Enumerating mixer devices, mixer lines, and mixer controls</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/27/enumerating-mixer-devices-mixer-lines-and-mixer-controls.aspx</link><pubDate>Fri, 28 Sep 2012 01:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10353976</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10353976</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/27/enumerating-mixer-devices-mixer-lines-and-mixer-controls.aspx#comments</comments><description>&lt;p&gt;The WinMM multimedia APIs include an API for enumerating and controlling all the paths through the audio device; things like bass boost, treble control, pass-through audio from your CD player to your headphones, etc.&amp;nbsp; This is called the "mixer" API and is the forerunner of the IDeviceTopology API.&lt;/p&gt;
&lt;p&gt;I wrote a quick app to enumerate all the mixer devices on the system; for each mixer device, enumerate each mixer line (that is, each source and destination); for each mixer line, enumerate all the controls (volume, mute, equalization, etc.); and for each control, query the associated text (if any) and the current value.&lt;/p&gt;
&lt;p&gt;Source and binaries attached.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;mixerGetNumDevs()&lt;br /&gt;for each mixer device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mixerGetDevCaps(dev)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each destination (line)&amp;nbsp;on the device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mixerGetLineInfo(dest)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mixerGetLineControls(dest)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for each control on the line&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if the control supports per-item description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mixerGetControlDetails(control, MIXER_GETCONTROLDETAILSF_LISTTEXT)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log the per-item description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mixerGetControlDetails(control, MIXER_GETCONTROLDETAILSF_VALUE)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log the value(s)&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;p style="font-family: monospace; padding-left: 30px;"&gt;&amp;gt;mixerenum.exe&lt;br /&gt;Mixer devices: 5&lt;br /&gt;-- 0: Contoso headset --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 104&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Contoso headset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destinations: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Destination 0: Master Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destination: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line ID: 0xffff0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERLINE_LINEF_ACTIVE (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User: 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Component Type: MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (5)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connections: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Master Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Target:&amp;nbsp; --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERLINE_TARGETTYPE_UNDEFINED (0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 1: Mute --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_MUTE (0x20010002)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 2: Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_VOLUME (0x50030001)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xffff on a scale of 0x0 to 0xffff&lt;br /&gt;-- 1: HDMI Audio (Contoso --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 104&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: HDMI Audio (Contoso&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destinations: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Destination 0: Master Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destination: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line ID: 0xffff0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERLINE_LINEF_ACTIVE (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User: 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Component Type: MIXERLINE_COMPONENTTYPE_DST_DIGITAL (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connections: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Master Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Target:&amp;nbsp; --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERLINE_TARGETTYPE_UNDEFINED (0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 1: Mute --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_MUTE (0x20010002)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 2: Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_VOLUME (0x50030001)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xffff on a scale of 0x0 to 0xffff&lt;br /&gt;-- 2: Speakers (Contoso --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 104&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Speakers (Contoso&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destinations: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Destination 0: Master Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destination: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line ID: 0xffff0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERLINE_LINEF_ACTIVE (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User: 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Component Type: MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connections: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Master Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Target:&amp;nbsp; --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERLINE_TARGETTYPE_UNDEFINED (0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 1: Mute --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_MUTE (0x20010002)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 2: Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_VOLUME (0x50030001)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xffff on a scale of 0x0 to 0xffff&lt;br /&gt;-- 3: Contoso headset --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 104&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Contoso headset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destinations: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Destination 0: Master Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destination: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line ID: 0xffff0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERLINE_LINEF_ACTIVE (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User: 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Component Type: MIXERLINE_COMPONENTTYPE_DST_WAVEIN (7)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connections: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Master Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Target: Contoso headset --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERLINE_TARGETTYPE_WAVEIN (2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 101&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Contoso headset&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 1: Mute --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_MUTE (0x20010002)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 2: Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_VOLUME (0x50030001)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xf332 on a scale of 0x0 to 0xffff&lt;br /&gt;-- 4: Microphone (Contoso --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 104&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Microphone (Contoso&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destinations: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Destination 0: Master Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Destination: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Source: -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Line ID: 0xffff0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERLINE_LINEF_ACTIVE (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User: 0x00000000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Component Type: MIXERLINE_COMPONENTTYPE_DST_WAVEIN (7)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Connections: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Controls: 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Master Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Target: Microphone (Contoso --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERLINE_TARGETTYPE_WAVEIN (2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 101&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 6.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Microphone (Contoso&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 1: Mute --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_MUTE (0x20010002)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Mute&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FALSE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Control 2: Volume --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type: MIXERCONTROL_CONTROLTYPE_VOLUME (0x50030001)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Status: MIXERCONTROL_CONTROLF_UNIFORM (0x1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Item count: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Short name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Long name: Volume&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Values --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xf332 on a scale of 0x0 to 0xffff&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10353976" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-35-39-76/mixerenum.zip" length="26034" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Audio/">Audio</category><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item><item><title>Enumerating MIDI devices</title><link>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/21/enumerating-midi-devices.aspx</link><pubDate>Fri, 21 Sep 2012 16:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10352100</guid><dc:creator>Maurits [MSFT]</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/matthew_van_eerde/rsscomments.aspx?WeblogPostID=10352100</wfw:commentRss><comments>http://blogs.msdn.com/b/matthew_van_eerde/archive/2012/09/21/enumerating-midi-devices.aspx#comments</comments><description>&lt;p&gt;In addition to audio playback and recording, &lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd743619(v=vs.85).aspx"&gt;Windows Multimedia (WinMM)&amp;nbsp;provides a Musical Instrument Digital Interface (MIDI) API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here's how to make a list of all the MIDI devices on the system, their capabilities, and the hardware device interface associated with each of them.&lt;/p&gt;
&lt;p&gt;Source and binaries attached.&lt;/p&gt;
&lt;p&gt;Pseudocode:&lt;/p&gt;
&lt;p style="padding-left: 30px; font-family: monospace;"&gt;midiInGetNumDevs&amp;nbsp;or midiOutGetNumDevs&lt;br /&gt;for each device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; midiInGetDevCaps or midiOutGetDevCaps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; log device capabilities&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; midiInMessage or midiOutMessage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; with DRV_QUERYDEVICEINTERFACESIZE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and DRV_QUERYDEVICEINTERFACE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; log the device interface&lt;/p&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p style="padding-left: 30px; font-family: monospace;"&gt;&amp;gt;midienum.exe&lt;br /&gt;midiIn devices: 1&lt;br /&gt;-- 0: USB2.0 MIDI Device --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 1.6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: USB2.0 MIDI Device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device interface: "\\?\usb#vid_&lt;em&gt;xxxx&lt;/em&gt;&amp;amp;pid_&lt;em&gt;yyyy&lt;/em&gt;&amp;amp;..."&lt;br /&gt;midiOut devices: 2&lt;br /&gt;-- 0: Microsoft GS Wavetable Synth --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 27&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 1.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: Microsoft GS Wavetable Synth&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Technology: 7 (MOD_SWSYNTH)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Voices: 32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Notes: 32&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channel mask: 0xffff&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MIDICAPS_VOLUME&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device interface: ""&lt;br /&gt;-- 1: USB2.0 MIDI Device --&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device ID: 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Manufacturer identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product identifier: 65535&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Driver version: 1.6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Product name: USB2.0 MIDI Device&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Technology: 1 (MOD_MIDIPORT)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Voices: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Notes: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channel mask: 0xffff&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Support: 0x0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device interface: "\\?\usb#vid_&lt;em&gt;xxxx&lt;/em&gt;&amp;amp;pid_&lt;em&gt;yyyy&lt;/em&gt;&amp;amp;..."&lt;/p&gt;
&lt;p&gt;(Actual device interface string suppressed.)&lt;/p&gt;
&lt;p&gt;Note the Microsoft GS Wavetable Synth device, which is always present.&lt;/p&gt;
&lt;p&gt;Why would you want to know the device interface? In our case, because we want to test all the&amp;nbsp;audio-related interfaces of a&amp;nbsp;particular device on the system.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10352100" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-35-21-00/midienum.zip" length="19266" type="application/zip" /><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Audio/">Audio</category><category domain="http://blogs.msdn.com/b/matthew_van_eerde/archive/tags/Win32/">Win32</category></item></channel></rss>