<?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 : Audio</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx</link><description>Tags: Audio</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to turn on HDCP or SCMS in an audio playback app</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/11/10/how-to-turn-on-hdcp-or-scms-in-an-audio-playback-app.aspx</link><pubDate>Tue, 10 Nov 2009 19:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9920366</guid><dc:creator>Maurits</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9920366.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9920366</wfw:commentRss><description>
&lt;p&gt;There's an &lt;a href="http://msdn.microsoft.com/en-us/library/dd756608%28VS.85%29.aspx" mce_href="http://msdn.microsoft.com/en-us/library/dd756608(VS.85).aspx"&gt;MSDN sample&lt;/a&gt; of how to turn on HDCP or SCMS in a playback app.&amp;nbsp; The sample is loosely based on a test app I wrote, but there are still some rough edges.&amp;nbsp; For example, the &lt;span style="font-family: monospace;"&gt;CMFAttributeImpl&amp;lt;T&amp;gt;&lt;/span&gt; template is not part of the SDK or the DDK.&amp;nbsp; Also, there's a leak in the &lt;span style="font-family: monospace;"&gt;GetDigitalAudioEndpoint&lt;/span&gt; implementation.&amp;nbsp; (Using the private template was my bug.&amp;nbsp; The leak was someone else's.)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Exercise:&lt;/i&gt; find the leak.&lt;/p&gt;

&lt;p&gt;There are also rough edges in the test app.&amp;nbsp; For one thing, it doesn't play audio - the way to use the app is to&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start playing audio using your favorite audio playback application, to the digital output on which want to turn on HDCP or SCMS.&lt;/li&gt;

&lt;li&gt;Run the trustedaudiodrivers2.exe command line to do what you want it to.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Source and binaries (x86 and amd64) attached.&lt;/p&gt;

&lt;blockquote style="font-family: monospace;"&gt;
&amp;gt;trustedaudiodrivers2&lt;br&gt;trustedaudiodrivers2 --list-devices&lt;br&gt;&lt;br&gt;trustedaudiodrivers2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --device [ communications | console | multimedia | &lt;device-name&gt; &amp;lt;device-name&amp;gt;]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --copy-ok [ 0 | 1 ]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --digital-output-disable [ 0 | 1 ]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --test-certificate-enable [ 0 | 1 ]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --drm-level&lt;drm-level&gt; &amp;lt;drm-level&amp;gt;&lt;br&gt;&lt;br&gt;
--list-devices: displays a list of output devices.&lt;br&gt;&lt;br&gt;Sets a Trusted Audio Drivers 2 output policy on a given audio endpoint.&lt;br&gt;--device&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; communications: set policy on default communications render endpoint.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; console: set policy on default console render endpoint.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; multimedia: set policy on default multimedia render endpoint.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;device-name&amp;gt;&lt;device-name&gt;: set policy on the endpoint with this long name.&lt;br&gt;--copy-ok: 1 or 0. Set to 0 to turn on "copy protection" (SCMS or HDCP)&lt;br&gt;--digital-output-disable: 1 or 0. Set to 1 to disable output (or turn on HDCP.)
--test-certificate-enable: 1 or 0. Set to 1 to allow the test certificate.&lt;br&gt;--drm-level: set to a number. 1100 is a good default.
&lt;/device-name&gt;&lt;/drm-level&gt;&lt;/device-name&gt;&lt;/blockquote&gt;

&lt;p&gt;Here's a sample command line which should disable the digital out (or enable HDCP, if the driver supports it.)&amp;nbsp; This is line-wrapped for readability only.&lt;br&gt;&lt;/p&gt;

&lt;blockquote style="font-family: monospace;"&gt;
&lt;p&gt;&amp;gt;trustedaudiodrivers2.exe&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --device "Acer H213H (High Definition Audio Device)"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --copy-ok 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --digital-output-disable 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --test-certificate-enable 1&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --drm-level 1300 &lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If all goes well the output should look something like this:&lt;/p&gt;

&lt;blockquote style="font-family: monospace;"&gt;
&lt;p&gt;Output Trust Authorities on this endpoint: 2&lt;br&gt;Processing Output Trust Authority #1 of 2&lt;br&gt;OTA action is PEACTION_PLAY (1)&lt;br&gt;GetOriginatorID() called&lt;br&gt;GetOriginatorID() called&lt;br&gt;GenerateRequiredSchemas() called&lt;br&gt;dwAttributes: MFOUTPUTATTRIBUTE_DIGITAL (0x00000001)&lt;br&gt;guidOutputSubType: MFCONNECTOR_HDMI ({57CD596D-CE47-11D9-92DB-000BDB28FF98})&lt;br&gt;cProtectionSchemasSupported: 1&lt;br&gt;MFPROTECTION_TRUSTEDAUDIODRIVERS ({65BDF3D2-0168-4816-A533-55D47B027101})&lt;br&gt;MFPROTECTION_TRUSTEDAUDIODRIVERS supported.&lt;br&gt;IMFOutputSchema::GetSchemaType called&lt;br&gt;IMFOutputSchema::GetConfigurationData called&lt;br&gt;IMFOutputTrustAuthority::SetPolicy returned 0x00000000&lt;br&gt;Processing Output Trust Authority #2 of 2&lt;br&gt;OTA action is PEACTION_EXTRACT (4)&lt;br&gt;Skipping as the OTA action is not PEACTION_PLAY&lt;br&gt;Policy successfully applied.&amp;nbsp; Press any key to release IMFTrustedOutput... &lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At that point I pressed a key, which redacted the policy, and the music started playing again.&lt;/p&gt;

&lt;p&gt;Common causes of failures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No audio is playing to that device.&amp;nbsp; Setting protection requires an active audio stream.&lt;/li&gt;

&lt;li&gt;The audio device is not S/PDIF or HDMI.&lt;br&gt;&lt;/li&gt;

&lt;li&gt;The audio driver is not capable of enforcing the protection.&lt;/li&gt;

&lt;li&gt;The audio driver is test-signed only; try --test-certificate-enable 1&lt;/li&gt;

&lt;li&gt;Kernel debugging is enabled.&lt;/li&gt;

&lt;li&gt;Driver verifier is enabled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This source should compile with just publically available headers and no special voodoo on the part of the developer.&lt;br&gt;&lt;br&gt;&lt;b&gt;EDIT: 11/13/2009 10:05 AM&lt;/b&gt;&lt;br&gt;&lt;br&gt;A subtle problem was called to my attention.&amp;nbsp; This line triggers an ATL &lt;span style="font-family: monospace;"&gt;ASSERT&lt;/span&gt;:&lt;/p&gt;

&lt;blockquote style="font-family: monospace;"&gt;
&lt;p&gt;hr = pMFOutputTrustAuthority-&amp;gt;SetPolicy(&amp;amp;pMFOutputPolicy, 1, &amp;amp;pbTicket, &amp;amp;cbTicket);&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;span style="font-family: monospace;"&gt;ASSERT&lt;/span&gt; is in &lt;span style="font-family: monospace;"&gt;CComPtr&amp;lt;IMFOutputPolicy&amp;gt;::operator&amp;amp;&lt;/span&gt; which &lt;span style="font-family: monospace;"&gt;ASSERT&lt;/span&gt;s if the pointer &lt;span style="font-family: monospace;"&gt;CComPtr&amp;lt;IMFOutputPolicy&amp;gt;::p&lt;/span&gt; is not &lt;span style="font-family: monospace;"&gt;NULL&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;My first instinct was to bypass the assertion like this:&lt;/p&gt;

&lt;blockquote style="font-family: monospace;" e=""&gt;
&lt;p&gt;hr = pMFOutputTrustAuthority-&amp;gt;SetPolicy(&amp;amp;pMFOutputPolicy&lt;span style="background-color: yellow;"&gt;.p&lt;/span&gt;, 1, &amp;amp;pbTicket, &amp;amp;cbTicket);&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But &lt;span style="font-family: monospace;"&gt;ASSERT&lt;/span&gt;s are there for a reason.&amp;nbsp; The fundamental problem here is that I'm trying to be too clever.&lt;/p&gt;

&lt;p&gt;Despite its name, &lt;span style="font-family: monospace;"&gt;IMFOutputTrustAuthority::SetPolicy&lt;/span&gt; takes, not an &lt;span style="font-family: monospace;"&gt;IMFOutputPolicy *&lt;/span&gt;, but an &lt;i&gt;array&lt;/i&gt; of &lt;span style="font-family: monospace;"&gt;IMFOutputPolicy *&lt;/span&gt;s.&amp;nbsp; A little confusing, yes.&amp;nbsp; As this is effectively a sample, I should be emphasizing this behavior, not covering it up.&lt;/p&gt;

&lt;p&gt;So here's the fix I decided on.&amp;nbsp; Updated source and binaries attached.&lt;/p&gt;

&lt;blockquote style="font-family: monospace;"&gt;// we're only setting a single policy but the API allows setting multiple policies&lt;br&gt;// (like WaitForMultipleObjects)&lt;br&gt;IMFOutputPolicy *rMFOutputPolicies[1] = { pMFOutputPolicy };&lt;br&gt;hr = pMFOutputTrustAuthority-&amp;gt;SetPolicy(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rMFOutputPolicies,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ARRAYSIZE(rMFOutputPolicies),&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pbTicket,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;cbTicket&lt;br&gt;);&lt;br&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9920366" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/matthew_van_eerde/attachment/9920366.ashx" length="46923" type="application/zip" /><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>How to calculate a sine sweep - the right way</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/08/07/how-to-calculate-a-sine-sweep-the-right-way.aspx</link><pubDate>Sat, 08 Aug 2009 01:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9860732</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9860732.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9860732</wfw:commentRss><description>&lt;p&gt;Three quarters are better than a dollar because they make noise!&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Lilly, &lt;i&gt;Lilly's Purple Plastic Purse&lt;/i&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Last time I talked about &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2009/08/03/how-to-calculate-a-sine-sweep-the-wrong-way.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2009/08/03/how-to-calculate-a-sine-sweep-the-wrong-way.aspx"&gt;how to calculate a sine sweep mathematically&lt;/a&gt;.&amp;nbsp; There's a closed-form solution which is quite elegant but, alas, useless in a practical computer implementation due to the very big numbers that are being fed to the sin(...) function.&lt;/p&gt;
&lt;p&gt;A computer implementation will care only about the discrete samples that need to be generated.&amp;nbsp; The integral in the previous post turns out to be counterproductive - we're much more interested in the infinite sequence of &lt;i&gt;φ&lt;/i&gt;&lt;sub&gt;&lt;i&gt;i&lt;/i&gt;&lt;/sub&gt;, and more particularly in their residue mod 2π.&lt;/p&gt;
&lt;p&gt;Here are Matlab scripts that implement a sine sweep both ways:&lt;/p&gt;
&lt;p&gt;First, the naïve mathematical solution that just calculates the exponential:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;function signal = sinesweep_nostate( ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seconds, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sample_rate, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amplitude, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; initial_phase, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc ...&lt;br&gt;)&lt;br&gt;% sinesweep_nostate returns a single-channel sine logarithmic sweep&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DO NOT USE THIS FUNCTION IN PRODUCTION&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; THIS IS A PEDAGOGICAL EXERCISE ONLY&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; THE SIGNAL THIS PRODUCES GRADUALLY DISTORTS&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; INSTEAD USE sinesweep&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start: starting frequency in Hz&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish: ending frequency in Hz&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; seconds: duration of sweep in seconds&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; samplerate: samples per second&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; amplitude: amplitude&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initial_phase: starting phase&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc: dc&lt;br&gt;&lt;br&gt;% echo these interesting intermediate values to the console&lt;br&gt;R = (finish / start) ^ (1 / seconds)&lt;br&gt;B = 2 * pi * start / log(R)&lt;br&gt;A = initial_phase - B&lt;br&gt;&lt;br&gt;time = 0 : 1 / sample_rate : seconds;&lt;br&gt;phase = A + B * R .^ time;&lt;br&gt;signal = amplitude * sin(phase) + dc;&lt;br&gt;&lt;br&gt;end % sinesweep_nostate&lt;br&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, the iterative version that adds up the little Δ&lt;i&gt;φ&lt;/i&gt;s to calculate &lt;i&gt;φ&lt;/i&gt;&lt;sub&gt;&lt;i&gt;i&lt;/i&gt;&lt;/sub&gt; iteratively:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;function signal = sinesweep( ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; start, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; seconds, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sample_rate, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; amplitude, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; initial_phase, ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc ...&lt;br&gt;)&lt;br&gt;% sinesweep returns a single-channel sine logarithmic sweep&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start: starting frequency in Hz&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; finish: ending frequency in Hz&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; seconds: duration of sweep in seconds&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; samplerate: samples per second&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; amplitude: amplitude&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initial_phase: starting phase&lt;br&gt;%&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc: dc&lt;br&gt;&lt;br&gt;time = 0 : 1 / sample_rate : seconds;&lt;br&gt;frequency = exp( ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; log(start) * (1 - time / seconds) + ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; log(finish) * (time / seconds) ...&lt;br&gt;);&lt;br&gt;&lt;br&gt;phase = 0 * time;&lt;br&gt;phase(1) = initial_phase;&lt;br&gt;for i = 2:length(phase)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; phase(i) = ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mod(phase(i - 1) + 2 * pi * frequency(i) / sample_rate, 2 * pi);&lt;br&gt;end&lt;br&gt;&lt;br&gt;signal = amplitude * sin(phase) + dc;&lt;br&gt;&lt;br&gt;end % sinesweep&lt;br&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If anything, one would expect the first to be more accurate, since it is mathematically precise, and the second is only an approximation.&amp;nbsp; But let's see how the signal produced by each of them holds up.&lt;/p&gt;&lt;p&gt;I calculate, and plot, the same sweep both ways, with a slight dc offset to facilitate seeing the different sweeps on the same plot.&amp;nbsp; In particular this is a logarithmic sweep from 20 kHz to 21 kHz, over 30 seconds, using 44100 samples per second, an amplitude of 0.2, an initial phase of π, and a dc of 0.25 for one and 0.26 for the other:&lt;br&gt;&lt;/p&gt;&lt;p&gt;plot(...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x, sinesweep(20000, 21000, 30, 44100, 0.2, pi, 0.2&lt;b&gt;5&lt;/b&gt;), 'd', ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x, sinesweep_nostate(20000, 21000, 30, 44100, 0.2, pi, 0.2&lt;b&gt;6&lt;/b&gt;), 's' ...&lt;br&gt;)&lt;/p&gt;&lt;p&gt;(x is just 1:30*44100 - necessary to allow a single plot statement.)&lt;br&gt;&lt;/p&gt;&lt;p&gt;Note that the approximate method is plotted in diamonds, and will be 0.01 &lt;i&gt;lower&lt;/i&gt; on the resulting graph than the "exact" method, plotted in squares.&lt;/p&gt;&lt;p&gt;(This takes a while to plot because there are a heckuva lot of points...)&lt;/p&gt;&lt;p&gt;Ah, a nice solid mass of green and blue.&amp;nbsp; I won't show it here.&lt;/p&gt;&lt;p&gt;OK, let's zoom in to a very early chunk of the signal - I expect these to match up closely, with only the dc offset separating the points:&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9860730/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9860730/original.aspx" height="391" width="473"&gt;&lt;/p&gt;&lt;p&gt;Yup.&amp;nbsp; Looks pretty good - give or take a pixel (quantization error in the display.)&lt;br&gt;&lt;/p&gt;&lt;p&gt;Now let's see what happens to the signal towards the end of the 30 seconds.&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9860731/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9860731/original.aspx" height="389" width="470"&gt;&lt;/p&gt;&lt;p&gt;Ick.&amp;nbsp; Something's rotten in the state of Denmark.&amp;nbsp; This distortion is so bad that it's &lt;i&gt;visible&lt;/i&gt; - you don't even have to take an FFT to see it.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Exercise:&lt;/i&gt; take an FFT and look at the distortion.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Advanced Exercise:&lt;/i&gt; demonstrate that the distortion is, in fact, in the "exact" method and not in the iterative method... that is to say, show which clock is right.&lt;/p&gt;&lt;p&gt;EDIT: On second glance it looks like the second picture is just showing a horizontal shift between the two signals, which is expected.&amp;nbsp; I'll need to dig deeper if I'm to prove my assertion that the iterative method produces less distortion than the "exact" method. &lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9860732" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>How to calculate a sine sweep - the wrong way</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/08/03/how-to-calculate-a-sine-sweep-the-wrong-way.aspx</link><pubDate>Tue, 04 Aug 2009 00:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9856522</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9856522.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9856522</wfw:commentRss><description>&lt;p&gt;Suppose you want to generate a continuous sine-sweep from time &lt;i&gt;t&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; to time &lt;i&gt;t&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;.  You want the starting frequency to be &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt;, and the ending frequency to be &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;; you want the sweep to be logarithmic, so that octaves are swept out in equal times.  (The alternative would be to sweep linearly, but usually logarithmic sweeping is what you want.)  For today we're going to have continuous time and sample values, so sample rate and bit depth will not be part of this discussion; in particular, the units of &lt;i&gt;t&lt;/i&gt; will be seconds, and our sample values will go from -1 to 1.

&lt;/p&gt;&lt;p&gt;Here's a picture of want we want to end up with:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856518/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856518/original.aspx" height="447" width="454"&gt;

&lt;/p&gt;&lt;p&gt;Without loss of generality, set &lt;i&gt;t&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; = 0.  This simplifies some of the math.
&lt;/p&gt;&lt;p&gt;Let &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) be the "instantaneous frequency" at time &lt;i&gt;t&lt;/i&gt;.  &lt;i&gt;Advanced Exercise:&lt;/i&gt; Define "instantaneous frequency" mathematically.
&lt;/p&gt;&lt;p&gt;Sweeping &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) logarithmically means that log &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) is swept &lt;i&gt;linearly&lt;/i&gt; from log &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; to log &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;.  So
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856509/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856509/original.aspx" height="332" width="457"&gt;
&lt;/p&gt;&lt;p&gt;Quick check: &lt;i&gt;ω&lt;/i&gt;(0) = &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt;, &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;) = &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;.  Yup.
&lt;/p&gt;&lt;p&gt;Let's define &lt;i&gt;R&lt;/i&gt; (the rate of change of the frequency) as (&lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt; / &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt;)&lt;sup&gt;1 / &lt;i&gt;t&lt;/i&gt;&lt;sub&gt;end&lt;/sub&gt;&lt;/sup&gt;.  This formula reduces to
&lt;/p&gt;&lt;p&gt;&lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; &lt;i&gt;R&lt;/i&gt;&lt;sup&gt;&lt;i&gt;t&lt;/i&gt;&lt;/sup&gt;
&lt;/p&gt;&lt;p&gt;Next step is to look at phase.  For a sine wave of &lt;i&gt;constant&lt;/i&gt; frequency &lt;i&gt;ω&lt;/i&gt;, phase progresses linearly with &lt;i&gt;t&lt;/i&gt; on the circular interval [0, 2π):&lt;br&gt;
&lt;i&gt;φ&lt;/i&gt; = &lt;i&gt;k&lt;/i&gt; &lt;i&gt;ω&lt;/i&gt; &lt;i&gt;t&lt;/i&gt;&lt;br&gt;
for some constant &lt;i&gt;k&lt;/i&gt;.  If the frequency of a sine wave was 1 cycle per second, the phase would go from 0 to 2π in a single second - this reveals that the correct value of &lt;i&gt;k&lt;/i&gt; is 2π:&lt;br&gt;
&lt;i&gt;φ&lt;/i&gt; = 2π &lt;i&gt;ω&lt;/i&gt; &lt;i&gt;t&lt;/i&gt;
&lt;/p&gt;&lt;p&gt;What happens with a variable frequency?  A little calculus provides the answer.  Consider a small change Δ&lt;i&gt;t&lt;/i&gt;, small enough so that &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) is almost constant over the interval:&lt;br&gt;
Δ&lt;i&gt;φ&lt;/i&gt; ≈ 2π &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) Δ&lt;i&gt;t&lt;/i&gt;&lt;br&gt;
because over that interval the sine sweep function is well approximated by a sine wave of &lt;i&gt;constant&lt;/i&gt; frequency &lt;i&gt;ω&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;).
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856519/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856519/original.aspx" height="447" width="454"&gt;
&lt;/p&gt;&lt;p&gt;Starting from an initial phase &lt;i&gt;φ&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt;, let Δ&lt;i&gt;t&lt;/i&gt; → 0, and:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856511/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856511/original.aspx" height="127" width="238"&gt;
&lt;/p&gt;&lt;p&gt;
Substitute:&lt;br&gt;
&lt;i&gt;u&lt;/i&gt; = &lt;i&gt;τ&lt;/i&gt; log &lt;i&gt;R&lt;/i&gt;&lt;br&gt;
&lt;i&gt;τ&lt;/i&gt; = &lt;i&gt;u&lt;/i&gt; / log &lt;i&gt;R&lt;/i&gt;&lt;br&gt;
&lt;i&gt;dτ&lt;/i&gt; = &lt;i&gt;du&lt;/i&gt; / log &lt;i&gt;R&lt;/i&gt;&lt;br&gt;
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856513/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856513/original.aspx" height="328" width="346"&gt;
&lt;/p&gt;&lt;p&gt;Define:&lt;br&gt;
&lt;i&gt;B&lt;/i&gt; = 2π &lt;i&gt;ω&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; / log &lt;i&gt;R&lt;/i&gt;&lt;br&gt;
&lt;i&gt;A&lt;/i&gt; = &lt;i&gt;φ&lt;/i&gt;&lt;sub&gt;start&lt;/sub&gt; - &lt;i&gt;B&lt;/i&gt;&lt;br&gt;
and we have:
&lt;/p&gt;&lt;p&gt;&lt;i&gt;φ&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = &lt;i&gt;A&lt;/i&gt; + &lt;i&gt;B&lt;/i&gt;&lt;i&gt;R&lt;/i&gt;&lt;sup&gt;&lt;i&gt;t&lt;/i&gt;&lt;/sup&gt;
&lt;/p&gt;&lt;p&gt;Just for fun, here's the explicit solution without intermediate values:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856514/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856514/original.aspx" height="133" width="495"&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now, the payoff: the signal is just the sine of the phase, so our sine sweep is:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856515/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856515/original.aspx" height="38" width="335"&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;or, more explicitly:
&lt;/p&gt;&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856516/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9856516/original.aspx" height="178" width="581"&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ah, beautiful mathematically.
&lt;/p&gt;&lt;p&gt;But useless practically.
&lt;/p&gt;&lt;p&gt;Why useless?
&lt;/p&gt;&lt;p&gt;Well, note that our equation for phase is an exponential.  That expression inside the sin(...) gets very big, very quickly.  &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/18/generating-a-sine-wave-with-phase.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/18/generating-a-sine-wave-with-phase.aspx"&gt;Any practical implementation of sin(...) is going to be utterly useless once its argument gets beyond a certain threshold&lt;/a&gt; - you'll get ugly chunky steps before you're halfway into the sweep.
&lt;/p&gt;&lt;p&gt;Nonetheless, there is a practical way to generate (pretty good) sine sweeps.  More on that next time.&lt;/p&gt;&lt;p&gt;EDIT: all logs are base &lt;i&gt;e&lt;/i&gt;. &lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9856522" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>Bug - jack detection on Windows 7 hdaudio.sys mixed capture</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/06/22/bug-jack-detection-on-windows-7-hdaudio-sys-mixed-capture.aspx</link><pubDate>Tue, 23 Jun 2009 00:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9798386</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9798386.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9798386</wfw:commentRss><description>&lt;p&gt;There's a bug that got away from me in Windows 7's HD Audio class driver (hdaudio.sys.)&lt;/p&gt;

&lt;p&gt;Before I explain the bug, a few caveats:&lt;/p&gt;

&lt;p&gt;If you're using Vista, there's no problem.&amp;nbsp; This only affects Windows 7.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;If you use the third-party audio driver, there's no problem.&amp;nbsp; This only affects the Microsoft HD Audio class driver (hdaudio.sys.)&lt;/p&gt;

&lt;p&gt;If your recording devices (mic and line in) are independent (can capture from both at the same time) or muxed (can capture from one or the other but not from their sum) then you're fine; this only affects mixed capture (can capture from one, from the other, or from their sum, but not from both sides of the mix independently.)&lt;/p&gt;

&lt;p&gt;If either of your recording devices doesn't support jack presence detection then you're fine; this only affects mixed capture where both sides of the mix support jack presence detection.&lt;/p&gt;

&lt;p&gt;Here's the bug.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There are various ways to "reset" the system and bring the OS recording device state into synchronization with the hardware state&lt;/li&gt;

&lt;ul&gt;
&lt;li&gt;reboot&lt;/li&gt;

&lt;li&gt;reset the HD Audio controller&lt;/li&gt;

&lt;li&gt;reinstall the audio driver&lt;/li&gt;

&lt;li&gt;restart the AudioEndpointBuilder service&lt;/li&gt;

&lt;li&gt;unplug all recording devices in the mix&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;li&gt;The first state change (plug or unplug) after a reset works&lt;/li&gt;

&lt;li&gt;The second and further state changes are not recognized by the OS until a reset.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a sample state diagram assuming a mixed Mic and Line In (click to view full-size:)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/9798381/original.aspx" target="_blank" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/9798381/original.aspx"&gt; &lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9798381/640x464.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9798381/640x464.aspx"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workarounds:&lt;/p&gt;

&lt;p&gt;Install the third-party audio driver instead of the HD Audio class driver.&lt;/p&gt;

&lt;p&gt;Use audio extension cables to fool the jack presence detection hardware into thinking something is always plugged in. &lt;br&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9798386" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>Why square waves have ears: Gibbs' phenomenon (Wilbraham's phenomenon)</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/05/07/why-square-waves-have-ears-gibbs-phenomenon-wilbraham-s-phenomenon.aspx</link><pubDate>Thu, 07 May 2009 22:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9594775</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9594775.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9594775</wfw:commentRss><description>&lt;p&gt;In &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2009/04/07/why-a-full-scale-sine-wave-has-an-intensity-of-3-db-fs.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2009/04/07/why-a-full-scale-sine-wave-has-an-intensity-of-3-db-fs.aspx"&gt;a recent post&lt;/a&gt; I sung the praises of square waves as a way to get a heckuva lot of power (3 dB more power than a sine wave) into a sample-range-limited signal.&amp;nbsp; It's time to take them down a notch now.&lt;/p&gt;

&lt;p&gt;A problem with square waves is they're impossible to generate in the analog domain.&amp;nbsp; In fact, you can't even get close.&lt;/p&gt;

&lt;p&gt;Signals generated in the analog domain are subject to physical laws regarding continuity (no teleportation) and whatnot. A common way to model these is to express (periodic) analog signals using a basis of sine waves with integral periods.&amp;nbsp; Suppose I want to generate the square wave:&lt;/p&gt;

&lt;blockquote&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td rowspan="3" style=""&gt;&lt;i&gt;f&lt;/i&gt;(&lt;i&gt;x&lt;/i&gt;) = &lt;/td&gt;

&lt;td&gt;1, -π &amp;lt; &lt;i&gt;x&lt;/i&gt; &amp;lt; 0&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;-1, 0 &amp;lt; &lt;i&gt;x&lt;/i&gt; &amp;lt; π&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/blockquote&gt;

&lt;p&gt;Graphed below are some approximations of this function using sine waves as a basis.&amp;nbsp; Note that only odd values of &lt;i&gt;n&lt;/i&gt; are used in the sums of sin(&lt;i&gt;nx&lt;/i&gt;).&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9594637/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9594637/original.aspx" height="392" width="479"&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;The sums converge to +/-1 quite well, but there are definite "ears" at &lt;i&gt;x&lt;/i&gt; near 0 where there's overshoot.&amp;nbsp; This doesn't appear to die down.&amp;nbsp; A closeup of one of the "ears":&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9594787/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9594787/original.aspx" height="382" width="475"&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;If anything, rather than dying down, the "ears" converge to max(&lt;i&gt;f&lt;sub&gt;n&lt;/sub&gt;&lt;/i&gt;) → about 1.18, or about 9% of the "jump" from -1 to 1.&amp;nbsp; (Dym and McKean, in their 1972 book &lt;a href="http://www.ams.org/mathscinet/search/publdoc.html?pg1=INDI&amp;amp;s1=61225&amp;amp;vfpref=html&amp;amp;r=109&amp;amp;mx-pid=442564" mce_href="http://www.ams.org/mathscinet/search/publdoc.html?pg1=INDI&amp;amp;s1=61225&amp;amp;vfpref=html&amp;amp;r=109&amp;amp;mx-pid=442564"&gt;Fourier Series and Integrals&lt;/a&gt;, get the 9% right but incorrectly assert that the convergence is to 1.09.)&lt;/p&gt;

&lt;p&gt;This mathematical phenomenon - &lt;a href="http://en.wikipedia.org/wiki/Gibbs_phenomenon" mce_href="http://en.wikipedia.org/wiki/Gibbs_phenomenon"&gt;Gibbs' phenomenon&lt;/a&gt; - is a good illustration of the difference between &lt;i&gt;convergence&lt;/i&gt; of a series of functions and &lt;i&gt;uniform convergence&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;In this case, the series of partial sums &lt;i&gt;pointwise converge&lt;/i&gt; to the square wave... for any given point &lt;i&gt;x&lt;/i&gt; &amp;gt; 0 and ε &amp;gt; 0, the ear will eventually move to the left, and I can choose an &lt;i&gt;N&lt;/i&gt; such that &lt;i&gt;f&lt;sub&gt;n&lt;/sub&gt;&lt;/i&gt;(&lt;i&gt;x&lt;/i&gt;) is within of ε of 1 for all &lt;i&gt;n&lt;/i&gt; &amp;gt; &lt;i&gt;N...&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;... but the series does not &lt;i&gt;uniformly&lt;/i&gt; converge to the square wave.&amp;nbsp; The following assertion is &lt;i&gt;false:&lt;/i&gt; "for any given ε &amp;gt; 0, I can pick an &lt;i&gt;N&lt;/i&gt; such that &lt;i&gt;f&lt;sub&gt;n&lt;/sub&gt;&lt;/i&gt;(&lt;i&gt;x&lt;/i&gt;) is within of ε of 1 for all &lt;i&gt;n&lt;/i&gt; &amp;gt; &lt;i&gt;N&lt;/i&gt; and all &lt;i&gt;x&lt;/i&gt; &amp;gt; 0."&amp;nbsp; This can be demonstrated by picking ε = 0.17, say.&amp;nbsp; For any &lt;i&gt;n&lt;/i&gt;, even, say, &lt;i&gt;n&lt;/i&gt; = 10&lt;sup&gt;100&lt;/sup&gt;, there is an &lt;i&gt;x&lt;/i&gt; close to 0 where &lt;i&gt;f&lt;/i&gt;&lt;sub&gt;1e100&lt;/sub&gt;(&lt;i&gt;x&lt;/i&gt;) &amp;gt; 1.17.
&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9594775" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>Why a full-scale sine wave has an intensity of -3 dB FS</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/04/07/why-a-full-scale-sine-wave-has-an-intensity-of-3-db-fs.aspx</link><pubDate>Wed, 08 Apr 2009 01:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9536922</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9536922.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9536922</wfw:commentRss><description>&lt;p&gt;I was asked one day why this full-scale sine wave was being measured by our signal analysis tools as -3 dB FS, even though it hits the maximum and the minimum sample values:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536821/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536821/original.aspx" width="750" height="565"&gt;&lt;/p&gt;

&lt;p&gt;The answer is "because it's a sine wave, not a square wave."&amp;nbsp; The intensity of a signal can be calculated from the following formula:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536816/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536816/original.aspx" width="456" height="234"&gt;&lt;/p&gt;

&lt;p&gt;The inner integral does not depend on &lt;i&gt;t&lt;/i&gt; - it's just the average sample value - so it's usually precalculated:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536805/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536805/original.aspx"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536819/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536819/original.aspx" width="321" height="127"&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/audiofool/archive/2007/06/21/you-can-t-hear-dc.aspx" mce_href="http://blogs.msdn.com/audiofool/archive/2007/06/21/you-can-t-hear-dc.aspx"&gt;The importance of taking dc into account during analysis&lt;/a&gt; can be appreciated if you try to calculate the intensity of a signal with a high dc.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Exercise:&lt;/i&gt; calculate the intensity of &lt;i&gt;x&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) ≡ -0.5 using the formulas above; calculate the "naïve intensity" by using the last formula above and omitting dc. Note the difference.&lt;/p&gt;

&lt;p&gt;Now that we have the necessary formulas, let's analyze our full-scale sine wave signal.&amp;nbsp; Plugging in a full-scale sine wave and analyzing over a full period we get:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536793/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536793/original.aspx" width="285" height="381"&gt;&lt;/p&gt;

&lt;p&gt;As expected, the average value of the signal over a single period is 0.&lt;/p&gt;

&lt;p&gt;Evaluating the intensity requires finding the antiderivative of (sin(&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;))&lt;sup&gt;2&lt;/sup&gt;. This can be ascertained most easily by plotting a few values and realizing that (sin(&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;))&lt;sup&gt;2&lt;/sup&gt; = (1 - cos(2&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;))/2:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536822/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536822/original.aspx"&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536823/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536823/original.aspx" width="479" height="389"&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536813/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536813/original.aspx" width="408" height="657"&gt;&lt;/p&gt;

&lt;p&gt;This is a dimensionless number that ranges from 0 (signal is a flat line) to 1 (... we'll get to that later.)&lt;/p&gt;

&lt;p&gt;We can convert this into a dB FS measurement using the formula &lt;span style="font-style: italic;"&gt;I&lt;/span&gt;&lt;sub&gt;dB FS&lt;/sub&gt; = 20 log&lt;sub&gt;10&lt;/sub&gt; &lt;span style="font-style: italic;"&gt;I&lt;/span&gt;&lt;sub&gt;RMS&lt;/sub&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536814/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536814/original.aspx" width="455" height="58"&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-style: italic;"&gt;Et voilà&lt;/span&gt; - &lt;span style="font-style: italic;"&gt;that's&lt;/span&gt; where the -3 dB comes from.&lt;/p&gt;
&lt;p&gt;In contrast to a sine wave, a full-scale &lt;span style="font-style: italic;"&gt;square&lt;/span&gt; wave centered at 0 has an intensity of 0 dB FS:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536824/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9536824/original.aspx" width="750" height="565"&gt;&lt;/p&gt;
&lt;p&gt;To finish up, a couple of advanced exercises:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-style: italic;"&gt;Advanced Exercise:&lt;/span&gt; prove that, provided &lt;span style="font-style: italic;"&gt;t&lt;/span&gt;&lt;sub&gt;1&lt;/sub&gt; and &lt;span style="font-style: italic;"&gt;t&lt;/span&gt;&lt;sub&gt;2&lt;/sub&gt; are sufficiently far apart, the intensity of a general sine wave &lt;span style="font-style: italic;"&gt;x&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;) = &lt;span style="font-style: italic;"&gt;a&lt;/span&gt; sin(&lt;span style="font-style: italic;"&gt;ωt&lt;/span&gt; + &lt;span style="font-style: italic;"&gt;φ&lt;/span&gt;) + &lt;span style="font-style: italic;"&gt;c&lt;/span&gt; depends only on &lt;span style="font-style: italic;"&gt;a&lt;/span&gt; and not on &lt;span style="font-style: italic;"&gt;ω&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;φ&lt;/span&gt;, or &lt;span style="font-style: italic;"&gt;c&lt;/span&gt;.&lt;br&gt;&lt;br&gt;&lt;span style="font-style: italic;"&gt;Advanced Exercise:&lt;/span&gt; completely characterize the set of digital signals that achieve 0 dB FS intensity.&amp;nbsp; If you have, say, 1000 samples of mono 16-bit integer audio to play with, how many distinct signals achieve 0 dB FS intensity?&lt;br&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9536922" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>Sample - WASAPI exclusive-mode event-driven playback app, including the HD Audio alignment dance</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2009/04/03/sample-wasapi-exclusive-mode-event-driven-playback-app-including-the-hd-audio-alignment-dance.aspx</link><pubDate>Fri, 03 Apr 2009 18:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9530748</guid><dc:creator>Maurits</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9530748.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9530748</wfw:commentRss><description>&lt;P&gt;Attached to this post is a sample WASAPI exclusive-mode event-driven playback app, including amd64 and x86 binaries, source, and a modification of the ac3.wav Dolby Digital test tone&amp;nbsp;to include a "fact" chunk.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&amp;gt;play-exclusive.exe -?&lt;BR&gt;play-exclusive.exe -?&lt;BR&gt;play-exclusive.exe --list-devices&lt;BR&gt;play-exclusive.exe [--device "Device long name"] --file "WAV file name"&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -? prints this message.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --list-devices displays the long names of all active playback devices.&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;Plays the given file to the given device in WASAPI exclusive mode.&lt;BR&gt;If no device is specified, plays to the default console device.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;On the particular system I used to test this, these are the devices I have:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&amp;gt;play-exclusive.exe --list-devices&lt;BR&gt;Active render endpoints found: 3&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Digital Audio (S/PDIF) (2- High Definition Audio Device)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speakers (2- High Definition Audio Device)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sceptre (High Definition Audio Device)&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;And this is the output I get when I play the attached ac3.wav test tones to the Sceptre&amp;nbsp;HDMI output:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&lt;BR&gt;&amp;gt;play-exclusive --device "Sceptre (High Definition Audio Device)" --file ac3.wav&lt;BR&gt;Opening .wav file "ac3.wav"...&lt;BR&gt;The default period for this device is 30000 hundred-nanoseconds, or 144 frames.&lt;SPAN style="BACKGROUND-COLOR: yellow"&gt;&lt;BR&gt;Buffer size not aligned - doing the alignment dance.&lt;BR&gt;Trying again with periodicity of 33333 hundred-nanoseconds, or 160 frames.&lt;BR&gt;We ended up with a period of 33333 hns or 160 frames.&lt;/SPAN&gt;&lt;BR&gt;Successfully played all 460800 frames.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;A word on the "alignment dance" highlighted above... first, this scene from &lt;EM&gt;&lt;A class="" href="http://www.imdb.com/title/tt0395699/" mce_href="http://www.imdb.com/title/tt0395699/"&gt;The Pacifier&lt;/A&gt;&lt;/EM&gt;.&amp;nbsp; (Vin Diesel is so coordinated.)&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://www.imdb.com/rg/VIDEO_PLAY/LINK//video/screenplay/vi3988848921/" mce_href="http://www.imdb.com/rg/VIDEO_PLAY/LINK//video/screenplay/vi3988848921/"&gt;&lt;STRONG&gt;The Pacifier: The Peter Panda dance&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Here's the source for the dance (in play.cpp in the attached.)&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;// call IAudioClient::Initialize the first time&lt;BR&gt;// this may very well fail&lt;BR&gt;// if the device period is unaligned&lt;BR&gt;hr = pAudioClient-&amp;gt;Initialize(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUDCLNT_SHAREMODE_EXCLUSIVE,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUDCLNT_STREAMFLAGS_EVENTCALLBACK,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hnsPeriod, hnsPeriod, pWfx, NULL&lt;BR&gt;);&lt;BR&gt;// if you get a compilation error on AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED,&lt;BR&gt;// uncomment the #define below&lt;BR&gt;//#define AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED&amp;nbsp;AUDCLNT_ERR(0x019)&lt;BR&gt;if (&lt;SPAN style="BACKGROUND-COLOR: yellow"&gt;AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED&lt;/SPAN&gt; == hr) {&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if the buffer size was not aligned, need to do the alignment dance&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Buffer size not aligned - doing the alignment dance.\n");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get the buffer size, which will be aligned&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pAudioClient-&amp;gt;GetBufferSize(&amp;amp;nFramesInBuffer);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("IAudioClient::GetBufferSize failed: hr = 0x%08x\n", hr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return hr;&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; // throw away this IAudioClient&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pAudioClient-&amp;gt;Release();&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // calculate the new aligned periodicity&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hnsPeriod = // hns =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (REFERENCE_TIME)(&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; 10000.0 * // (hns / ms) *&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; 1000 * // (ms / s) *&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; nFramesInBuffer / // frames /&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; pWfx-&amp;gt;nSamplesPerSec&amp;nbsp; // (frames / s)&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; + 0.5 // rounding&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // activate a new IAudioClient&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDevice-&amp;gt;Activate(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __uuidof(IAudioClient),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CLSCTX_ALL, NULL,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (void**)&amp;amp;pAudioClient&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("IMMDevice::Activate(IAudioClient) failed: hr = 0x%08x\n", hr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return hr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // try initialize again&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Trying again with periodicity of %I64u hundred-nanoseconds, or %u frames.\n", hnsPeriod, nFramesInBuffer);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pAudioClient-&amp;gt;Initialize(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUDCLNT_SHAREMODE_EXCLUSIVE,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AUDCLNT_STREAMFLAGS_EVENTCALLBACK,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hnsPeriod, hnsPeriod, pWfx, NULL&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("IAudioClient::Initialize failed, even with an aligned buffer: hr = 0x%08x\n", hr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pAudioClient-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return hr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;} else if (FAILED(hr)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("IAudioClient::Initialize failed: hr = 0x%08x\n", hr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pAudioClient-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return hr;&lt;BR&gt;}&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;// OK, IAudioClient::Initialize succeeded&lt;BR&gt;// let's see what buffer size we actually ended up with&lt;BR&gt;hr = pAudioClient-&amp;gt;GetBufferSize(&amp;amp;nFramesInBuffer);&lt;BR&gt;if (FAILED(hr)) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("IAudioClient::GetBufferSize failed: hr = 0x%08x\n", hr);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pAudioClient-&amp;gt;Release();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return hr;&lt;BR&gt;}&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace"&gt;// calculate the new period&lt;BR&gt;hnsPeriod = // hns =&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (REFERENCE_TIME)(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10000.0 * // (hns / ms) *&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1000 * // (ms / s) *&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nFramesInBuffer / // frames /&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pWfx-&amp;gt;nSamplesPerSec&amp;nbsp; // (frames / s)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + 0.5 // rounding&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="FONT-FAMILY: monospace" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Note the new HRESULT.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;HD Audio works on a 128-byte aligned buffer size.&amp;nbsp; This dance ensures that the HD Audio driver is being fed data in chunks of 128 bytes.&amp;nbsp; It is somewhat complicated by the fact that IAudioClient::Initialize takes a parameter of hundred-nano-seconds, but IAudioClient::GetBufferSize sets a parameter of frames.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9530748" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/matthew_van_eerde/attachment/9530748.ashx" length="356346" type="application/x-zip-compressed" /><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Movies/default.aspx">Movies</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>Sample - WASAPI loopback capture (record what you hear)</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/12/16/sample-wasapi-loopback-capture-record-what-you-hear.aspx</link><pubDate>Tue, 16 Dec 2008 17:28:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9226955</guid><dc:creator>Maurits</dc:creator><slash:comments>22</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9226955.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9226955</wfw:commentRss><description>&lt;p&gt;In a previous post I showed &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/12/10/sample-playing-silence-via-wasapi-event-driven-pull-mode.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/12/10/sample-playing-silence-via-wasapi-event-driven-pull-mode.aspx"&gt;how to play silence to a given audio device&lt;/a&gt; and hinted at a possible application.&lt;/p&gt;

&lt;p&gt;Attached to this post is a sample WASAPI loopback capture app - amd64, x86 and source included.&amp;nbsp; This allows you to record the sound that is coming out of your speakers:&lt;/p&gt;

&lt;p style="font-family: monospace;"&gt;&amp;gt;loopback-capture -?&lt;br&gt;loopback-capture -?&lt;br&gt;loopback-capture --list-devices&lt;br&gt;loopback-capture [--device "Device long name"] [--file "file name"] [--int-16]&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -? prints this message.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --list-devices displays the long names of all active playback devices.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --device captures from the specified device (default if omitted)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --file saves the output to a file (loopback-capture.wav if omitted))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --int-16 attempts to coerce data to 16-bit integer format&lt;/p&gt;

&lt;p&gt;There are a couple of oddities for WASAPI loopback capture.&amp;nbsp; One is that "event mode" doesn't work for loopback capture; you can call pAudioClient-&amp;gt;Initialize(... AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ... ), you can call pAudioClient-&amp;gt;SetEventHandle(...), and everything will succeed... but the "data is ready" event will never fire.&amp;nbsp; So this app creates its own waitable timer.&lt;/p&gt;

&lt;p&gt;Another oddity is that WASAPI will only push data down to the render endpoint when there are active streams.&amp;nbsp; When nothing is playing, there is nothing to capture.&lt;/p&gt;
&lt;p&gt;For example, play a song, and then run loopback-capture.&amp;nbsp; While loopback-capture is running, stop the song, and then start it again.&amp;nbsp; You'll get this output when you start it back up:&lt;br&gt;&lt;/p&gt;
&lt;p style="font-family: monospace;"&gt;&amp;gt;loopback-capture&lt;br&gt;Press Enter to quit...&lt;br&gt;IAudioCaptureClient::GetBuffer set flags to 0x00000001 on pass 5381 after 1088829 frames&lt;br&gt;&lt;br&gt;Thread HRESULT is 0x8000ffff&lt;/p&gt;
&lt;p&gt;The flag in question is AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY.&amp;nbsp; When the song stopped, no more data was available to capture.&amp;nbsp; Eventually the song started up again, and WASAPI dutifully reported that there was a glitch detected.&amp;nbsp; This app stops on glitches.&lt;br&gt;&lt;/p&gt;&lt;p&gt;There are a couple of other possible ways to handle this.&amp;nbsp; One way is to ignore glitches; then if you stop a song, wait a few seconds, and start it again, then the recorded signal will omit the wait and abut the two "audio is playing" portions.&lt;/p&gt;&lt;p&gt;But my particular favorite way of handling this is to run silence.exe.&amp;nbsp; That way there are never any "nothing is playing" glitches, because there's always something playing.&lt;/p&gt;&lt;p&gt;EDIT 11/23/2009: Updated loopback-capture.exe to ignore the glitch flag on the first packet, since Windows 7 sets it.&amp;nbsp; Also improved the interaction between the capture thread bailing out and the user pressing Enter to finish.&lt;br&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9226955" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/matthew_van_eerde/attachment/9226955.ashx" length="27974" type="application/zip" /><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>Sample - playing silence via WASAPI event-driven (pull) mode</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/12/10/sample-playing-silence-via-wasapi-event-driven-pull-mode.aspx</link><pubDate>Wed, 10 Dec 2008 21:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9191984</guid><dc:creator>Maurits</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9191984.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9191984</wfw:commentRss><description>&lt;p&gt;Be vewy vewy quiet - we'we hunting wabbits.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;-- Elmer Fudd&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Attached is a mini-app I've written to play silence to any given playback device using WASAPI event-driven (pull) mode.&amp;nbsp; Source, x86 binary, and amd64 binary are attached.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Usage statement: &lt;br&gt;&lt;/p&gt;
&lt;p style="font-family: monospace;"&gt;&amp;gt;silence -?&lt;br&gt;silence&lt;br&gt;silence -?&lt;br&gt;silence --list-devices&lt;br&gt;silence --device "Device long name"&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With no arguments, plays silence to the default audio device.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -? prints this message.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --list-devices displays the long names of all active playback devices.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --device plays silence to the specified device.&lt;/p&gt;
&lt;p style="font-family: monospace;"&gt;&amp;gt;silence --list-devices&lt;br&gt;Active render endpoints found: 2&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Speakers (USB Audio Device)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Headphones (High Definition Audio Device)&lt;/p&gt;
&lt;p style="font-family: monospace;"&gt;&amp;gt;silence --device "Headphones (High Definition Audio Device)"&lt;br&gt;Press Enter to quit...&lt;br&gt;Received stop event after 488 passes&lt;br&gt;&lt;/p&gt;
&lt;p&gt;While it's playing it shows up in the Volume Mixer:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9191979/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9191979/original.aspx" alt="http://blogs.msdn.com/photos/matthew_van_eerde/images/9191979/original.aspx"&gt;&lt;/p&gt;
&lt;p&gt;Why would I write such a thing?&lt;/p&gt;
&lt;p&gt;Well, there is the pedagogical exercise of writing a WASAPI event-driven render loop.&lt;/p&gt;
&lt;p&gt;But there is also a practical application of an active silence stream, having to do with loopback capture.&amp;nbsp; More on this in a future post...&lt;/p&gt;&lt;p&gt;EDIT: 7/30/2009 - fixed bug where I was treating the GetCurrentPadding value as the amount of free space in the buffer when in fact it's the amount of used space.&lt;/p&gt;&lt;p&gt;While I was at it, added an icon and exited immediately on errors rather than waiting for the caller to hit Enter. &lt;br&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9191984" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/matthew_van_eerde/attachment/9191984.ashx" length="21447" type="application/zip" /><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>The case of the default audio device from the future</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/11/07/the-case-of-the-default-audio-device-from-the-future.aspx</link><pubDate>Sat, 08 Nov 2008 04:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9053458</guid><dc:creator>Maurits</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9053458.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9053458</wfw:commentRss><description>Hover the mouse over each picture (&lt;a href="http://www.xkcd.com/" mce_href="http://www.xkcd.com/"&gt;xkcd&lt;/a&gt;-style) in turn to get the text that tells the story.&lt;br&gt;
&lt;br&gt;
An amusing behavior of Windows Vista recently came to my attention... sometimes the Sound control panel wants to go
&lt;a href="http://www.imdb.com/title/tt0088763/" mce_href="http://www.imdb.com/title/tt0088763/"&gt;back... &lt;i&gt;to the future!&lt;/i&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;

&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053423/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053423/original.aspx" title="Note the time... 9:45 AM. The default device is the HD Audio device." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053427/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053427/original.aspx" title="Change it to something else..." height="459" width="415"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053428/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053428/original.aspx" title="... like that." height="459" width="415"&gt;&lt;br&gt;
&lt;br&gt;
So far, so good.&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053430/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053430/original.aspx" title="Now set the clock back..." height="459" width="415"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053431/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053431/original.aspx" title="... and change the default device back to HD Audio." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053433/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053433/original.aspx" title="It looks OK so far..." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053434/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053434/original.aspx" title="... but if you close the control panel..." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053435/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053435/original.aspx" title="... then when you reopen it, you can see that the default device is actually still USB." height="459" width="414"&gt;&lt;br&gt;
&lt;br&gt;
D'oh! Luckily, there's a way to recover...&lt;br&gt;
&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053436/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053436/original.aspx" title="Change the default as normal..." height="458" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053437/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053437/original.aspx" title="... like that.  It didn't work, but it /exposes the UI/ to let you do the real trick..." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053438/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053438/original.aspx" title="... now, /without closing the control panel/, make the still-actually-default device &amp;quot;doubly default&amp;quot;..." height="458" width="413"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053439/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053439/original.aspx" title="... like that..." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053440/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053440/original.aspx" title="... good.  Now, changing the default will actually work." height="459" width="415"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053442/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053442/original.aspx" title="This time it worked. Honest." height="459" width="415"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053443/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053443/original.aspx" title="To prove it, close the control panel..." height="459" width="414"&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053444/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9053444/original.aspx" title="... and open it back up." height="459" width="414"&gt;&lt;br&gt;
&lt;br&gt;
Voilà tout.&lt;br&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9053458" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>How long can the logoff sound be?</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/10/28/how-long-can-the-logoff-sound-be.aspx</link><pubDate>Tue, 28 Oct 2008 20:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9020856</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/9020856.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=9020856</wfw:commentRss><description>&lt;p&gt;Windows has a customizable soundtrack - when different things happen, sounds play.&amp;nbsp; You can live with the default sounds, turn all the sounds off, or substitute your own sounds.&amp;nbsp; All configurable via the Sound control panel:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9020631/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9020631/original.aspx" alt="http://blogs.msdn.com/photos/matthew_van_eerde/images/9020631/original.aspx"&gt;&lt;/p&gt;
&lt;p&gt;You can assign short or long, pleasant or annoying sounds to any event in the list.&amp;nbsp; For example, you could rip a CD to .wav format and assign it to the "Maximize" event.&lt;/p&gt;
&lt;p&gt;There are two events that are a little finicky about how long the sound is, though: the "Exit Windows" and "Windows Logoff" events.&amp;nbsp; If you assign a sound that is &lt;i&gt;too long&lt;/i&gt; to either of these events, it won't play.&amp;nbsp; It plays when you click the "Test" button, but when you actually log off or shut down, the sound doesn't play.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;How long is &lt;i&gt;too long&lt;/i&gt;?&lt;/p&gt;
&lt;p&gt;Before the answer, a quick review of .wav files.&lt;/p&gt;
&lt;p&gt;You can have any number of frames per second.&amp;nbsp; CDs use a sample rate of
44100 frames per second; DVDs use 48000 frames per second.&amp;nbsp; This is
usually one of (11025, 22050, 44100, 88200, 176400; 48000, 96000,
19200; 8000, 16000, 32000). &lt;br&gt;&lt;/p&gt;
&lt;p&gt;You can have any number of samples in a frame: mono (1 channel), stereo (two channels), surround (four channels), 5.1 (six channels), 7.1 (eight channels), or a different number. &lt;br&gt;&lt;/p&gt;
&lt;p&gt;Each sample is a number.&amp;nbsp; This can be a floating-point number (32 bits), an unsigned integer (8 bits), or a signed integer (16 bits, 20 bits, 24 bits, 32 bits.)&amp;nbsp; The 20 bit and 24 bit integers can be either in 24-bit containers or in 32-bit containers.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;The fatness of the samples, and how many there are per second, determines how many bytes a second of .wav data will contain.&amp;nbsp; The formula is:&lt;/p&gt;
&lt;p&gt;bytes/second = (samples/frame, AKA channels) * (frames/second, AKA sample rate) * (bits/sample) / (bits/byte, always 8)&lt;/p&gt;
&lt;p&gt;&lt;i&gt;For performance reasons, Windows Vista limits the size of shutdown/logoff sounds to 4 MB&lt;/i&gt;.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;So how long is 4MB?&amp;nbsp; Here's the answer in tabular form for most common formats.&amp;nbsp; Lengths are in seconds.&lt;/p&gt;&lt;p&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;&lt;meta name="ProgId" content="Word.Document"&gt;&lt;meta name="Generator" content="Microsoft Word 12"&gt;&lt;meta name="Originator" content="Microsoft Word 12"&gt;&lt;link href="file:///C:%5CUsers%5CMatEer%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List"&gt;&lt;link href="file:///C:%5CUsers%5CMatEer%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData"&gt;&lt;link href="file:///C:%5CUsers%5CMatEer%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping"&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves/&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:DoNotShowPropertyChanges/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:DontVertAlignCellWithSp/&gt;
   &lt;w:DontBreakConstrainedForcedTables/&gt;
   &lt;w:DontVertAlignInTxbx/&gt;
   &lt;w:Word11KerningPairs/&gt;
   &lt;w:CachedColBalance/&gt;
  &lt;/w:Compatibility&gt;
  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val="Cambria Math"/&gt;
   &lt;m:brkBin m:val="before"/&gt;
   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;
   &lt;m:smallFrac m:val="off"/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val="0"/&gt;
   &lt;m:rMargin m:val="0"/&gt;
   &lt;m:defJc m:val="centerGroup"/&gt;
   &lt;m:wrapIndent m:val="1440"/&gt;
   &lt;m:intLim m:val="subSup"/&gt;
   &lt;m:naryLim m:val="undOvr"/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267"&gt;
  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;
  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;
  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;
  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;
  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;
  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;
  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;
  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;
  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;
  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;
  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;
  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;
  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;
  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;
  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin-top:0in;
	mso-para-margin-right:0in;
	mso-para-margin-bottom:10.0pt;
	mso-para-margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:"Times New Roman";
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;

&lt;/p&gt;&lt;table class="MsoNormalTable" style="width: 5in; margin-left: 4.75pt; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0" width="480"&gt;
 &lt;tbody&gt;&lt;tr style="height: 15pt;"&gt;
  &lt;td colspan="6" style="padding: 0in 5.4pt; width: 5in; height: 15pt;" nowrap="nowrap" valign="bottom" width="480"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;unsigned 8-bit int&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;sample rate&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;mono&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;stereo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;surround&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;5.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;7.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;524.29&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;262.14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;87.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11025&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;380.44&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;190.22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;63.41&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;262.14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;22050&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;190.22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;31.70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;44100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;48000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;87.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;14.56&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;88200&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;96000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;176400&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;192000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td colspan="6" style="padding: 0in 5.4pt; width: 5in; height: 15pt;" nowrap="nowrap" valign="bottom" width="480"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;signed 16-bit int&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;sample rate&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;mono&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;stereo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;surround&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;5.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;7.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;262.14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11025&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;190.22&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;31.70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;22050&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8.19&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;44100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; background: yellow none repeat scroll 0% 0%; width: 53.5pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;48000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;88200&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;96000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;176400&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.98&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.49&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;192000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.82&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.37&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td colspan="6" style="padding: 0in 5.4pt; width: 5in; height: 15pt;" nowrap="nowrap" valign="bottom" width="480"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;24-bit container: signed
  20-bit int or signed 24-bit int&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;sample rate&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;mono&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;stereo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;surround&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;5.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;7.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;174.76&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;87.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;29.13&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11025&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;126.81&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;63.41&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;31.70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.14&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;87.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;14.56&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;22050&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;63.41&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;31.70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.57&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;43.69&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;44100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;31.70&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;48000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;29.13&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;14.56&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;4.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;88200&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.98&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;96000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;14.56&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.43&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.82&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;176400&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.98&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.99&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;192000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.28&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.82&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.21&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.91&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;&lt;br&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td colspan="6" style="padding: 0in 5.4pt; width: 5in; height: 15pt;" nowrap="nowrap" valign="bottom" width="480"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: center; line-height: normal;" align="center"&gt;&lt;b&gt;&lt;span style="color: red;"&gt;32-bit container: signed
  20-bit int, signed 24-bit int, or float32&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;sample rate&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;mono&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;stereo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;surround&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;5.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;b&gt;&lt;span style="color: black;"&gt;7.1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;131.07&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11025&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;95.11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;15.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;65.54&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8.19&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;22050&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;47.55&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;7.93&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;32.77&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;16.38&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;8.19&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;4.10&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;44100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;23.78&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.96&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;48000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;21.85&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;3.64&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;88200&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;11.89&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.98&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.49&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;96000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;10.92&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.82&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.37&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;176400&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.94&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.97&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.49&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.99&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.74&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr style="height: 15pt;"&gt;
  &lt;td style="padding: 0in 5.4pt; width: 92.7pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="124"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;192000&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;5.46&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 53.5pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="71"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;2.73&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 1in; height: 15pt;" nowrap="nowrap" valign="bottom" width="96"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;1.37&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.91&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
  &lt;td style="padding: 0in 5.4pt; width: 44.15pt; height: 15pt;" nowrap="nowrap" valign="bottom" width="59"&gt;
  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; text-align: right; line-height: normal;" align="right"&gt;&lt;span style="color: black;"&gt;0.68&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;

&amp;nbsp;&lt;p&gt;The most common audio format by far is 44.1 kHz / stereo / 16-bit; if your .wav file is of this format, you get just under 23 seconds before you hit the 4 MB limit.&lt;/p&gt;&lt;p&gt;If you want to go over this limit, or if you want a multichannel logoff sound, you can get away with downsampling.&amp;nbsp; If you shoehorn in a longer sound, though, you may run into this:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/9020846/original.aspx" alt="http://blogs.msdn.com/photos/matthew_van_eerde/images/9020846/original.aspx"&gt;&lt;/p&gt;&lt;p&gt;If you just wait, the sound will play to the end and logoff will continue.&lt;/p&gt;&lt;p&gt;If you click "Cancel", explorer.exe will exit anyway and you'll be logged in with no shell.&lt;/p&gt;&lt;p&gt;A trick to get the shell back: &lt;span style="font-style: italic;"&gt;Ctrl-Shift-Esc&lt;/span&gt; to bring up Task Manager, and &lt;span style="font-style: italic;"&gt;File | New Task (Run...) | explorer.exe&lt;/span&gt; to reinvoke the shell.&amp;nbsp; This also allows you to determine which of the notification area icons are well-behaved. :-)&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9020856" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category></item><item><title>Sample: find out if your default audio playback and audio capture devices are on the same hardware</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/06/13/sample-find-out-if-your-default-playback-and-capture-devices-are-on-the-same-hardware.aspx</link><pubDate>Sat, 14 Jun 2008 02:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8595180</guid><dc:creator>Maurits</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/8595180.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=8595180</wfw:commentRss><description>&lt;p&gt;vbBretty on the audio forums asked &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3467864&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3467864&amp;amp;SiteID=1"&gt;how to tell if a given audio output and a given audio input were on the same physical audio card&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I found the exercise interesting enough to share here: &lt;br&gt;&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;
// main.cpp&lt;br&gt;&lt;br&gt;#define INITGUID&lt;br&gt;&lt;br&gt;#include &amp;lt;windows.h&amp;gt;&lt;br&gt;#include &amp;lt;tchar.h&amp;gt;&lt;br&gt;&lt;br&gt;const GUID GUID_NULL = { 0 };&lt;br&gt;&lt;br&gt;#include &amp;lt;atlstr.h&amp;gt;&lt;br&gt;#include &amp;lt;mmdeviceapi.h&amp;gt;&lt;br&gt;#include &amp;lt;devicetopology.h&amp;gt;&lt;br&gt;#include &amp;lt;functiondiscoverykeys.h&amp;gt;&lt;br&gt;&lt;br&gt;#define LOG(formatstring, ...) _tprintf(formatstring _T("\n"), __VA_ARGS__)&lt;br&gt;&lt;br&gt;// helper class to CoInitialize/CoUninitialize&lt;br&gt;class CCoInitialize {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT m_hr;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CCoInitialize(PVOID pReserved, HRESULT &amp;amp;hr)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : m_hr(E_UNEXPECTED) { hr = m_hr = CoInitialize(pReserved); }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CCoInitialize() { if (SUCCEEDED(m_hr)) { CoUninitialize(); } }&lt;br&gt;};&lt;br&gt;&lt;br&gt;// helper class to CoTaskMemFree&lt;br&gt;class CCoTaskMemFreeOnExit {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PVOID m_p;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CCoTaskMemFreeOnExit(PVOID p) : m_p(p) {}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CCoTaskMemFreeOnExit() { CoTaskMemFree(m_p); }&lt;br&gt;};&lt;br&gt;&lt;br&gt;// helper class to PropVariantClear&lt;br&gt;class CPropVariantClearOnExit {&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROPVARIANT *m_p;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPropVariantClearOnExit(PROPVARIANT *p) : m_p(p) {}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CPropVariantClearOnExit() { PropVariantClear(m_p); }&lt;br&gt;};&lt;br&gt;&lt;br&gt;// find the default capture and render audio devices&lt;br&gt;// determine whether they are on the same audio hardware&lt;br&gt;int _tmain() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT hr = S_OK;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize COM&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CCoInitialize ci(NULL, hr);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("CoInitialize failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get enumerator&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IMMDeviceEnumerator&amp;gt; pMMDeviceEnumerator;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("CoCreateInstance(IMMDeviceEnumerator) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get default render/capture endpoints&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IMMDevice&amp;gt; pRenderEndpoint;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDeviceEnumerator-&amp;gt;GetDefaultAudioEndpoint(eRender, eConsole, &amp;amp;pRenderEndpoint);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("GetDefaultAudioEndpoint(eRender, eConsole) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IMMDevice&amp;gt; pCaptureEndpoint;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDeviceEnumerator-&amp;gt;GetDefaultAudioEndpoint(eCapture, eConsole, &amp;amp;pCaptureEndpoint);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("GetDefaultAudioEndpoint(eCapture, eConsole) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get endpoint device topologies&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IDeviceTopology&amp;gt; pRenderEndpointTopology;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pRenderEndpoint-&amp;gt;Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&amp;amp;pRenderEndpointTopology);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Render endpoint Activate(IDeviceTopology) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IDeviceTopology&amp;gt; pCaptureEndpointTopology;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pCaptureEndpoint-&amp;gt;Activate(__uuidof(IDeviceTopology), CLSCTX_ALL, NULL, (void**)&amp;amp;pCaptureEndpointTopology);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Capture endpoint Activate(IDeviceTopology) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get KS filter device IDs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR szRenderFilterId;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IConnector&amp;gt; pConnector;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pRenderEndpointTopology-&amp;gt;GetConnector(0, &amp;amp;pConnector);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Render endpoint topology GetConnector(0) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pConnector-&amp;gt;GetDeviceIdConnectedTo(&amp;amp;szRenderFilterId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Render connector GetDeviceIdConnectedTo() failed: hr = 0x%08x"), hr);&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; CCoTaskMemFreeOnExit freeRender(szRenderFilterId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("KS filter ID for render endpoint:\n\t%ls"), szRenderFilterId);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR szCaptureFilterId;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pConnector = NULL;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pCaptureEndpointTopology-&amp;gt;GetConnector(0, &amp;amp;pConnector);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Capture endpoint topology GetConnector(0) failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pConnector-&amp;gt;GetDeviceIdConnectedTo(&amp;amp;szCaptureFilterId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Capture connector GetDeviceIdConnectedTo() failed: hr = 0x%08x"), hr);&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; CCoTaskMemFreeOnExit freeCapture(szCaptureFilterId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("KS filter ID for capture endpoint:\n\t%ls"), szCaptureFilterId);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get IMMDevices for each associated devnode&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IMMDevice&amp;gt; pRenderDevnode;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDeviceEnumerator-&amp;gt;GetDevice(szRenderFilterId, &amp;amp;pRenderDevnode);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Getting render devnode via IMMDeviceEnumerator::GetDevice(\"%ls\") failed: hr = 0x%08x"), szRenderFilterId, hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IMMDevice&amp;gt; pCaptureDevnode;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pMMDeviceEnumerator-&amp;gt;GetDevice(szCaptureFilterId, &amp;amp;pCaptureDevnode);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Getting capture devnode via IMMDeviceEnumerator::GetDevice(\"%ls\") failed: hr = 0x%08x"), szCaptureFilterId, hr);&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; LOG(_T(""));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // open property set on each devnode&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IPropertyStore&amp;gt; pRenderDevnodePropertyStore;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pRenderDevnode-&amp;gt;OpenPropertyStore(STGM_READ, &amp;amp;pRenderDevnodePropertyStore);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Getting render devnode property store failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CComPtr&amp;lt;IPropertyStore&amp;gt; pCaptureDevnodePropertyStore;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pCaptureDevnode-&amp;gt;OpenPropertyStore(STGM_READ, &amp;amp;pCaptureDevnodePropertyStore);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Getting capture devnode property store failed: hr = 0x%08x"), hr);&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;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get PKEY_Device_InstanceId property&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROPVARIANT varRenderInstanceId; PropVariantInit(&amp;amp;varRenderInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPropVariantClearOnExit clearRender(&amp;amp;varRenderInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pRenderDevnodePropertyStore-&amp;gt;GetValue(PKEY_Device_InstanceId, &amp;amp;varRenderInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Render devnode property store GetValue(PKEY_Device_InstanceId) failed: hr = 0x%08x"), hr);&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; if (VT_LPWSTR != varRenderInstanceId.vt) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Render instance id variant type is %u - expected VT_LPWSTR"), varRenderInstanceId.vt);&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; LOG(_T("Instance Id of default render device: %ls"), varRenderInstanceId.pwszVal);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROPVARIANT varCaptureInstanceId; PropVariantInit(&amp;amp;varCaptureInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CPropVariantClearOnExit clearCapture(&amp;amp;varCaptureInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = pCaptureDevnodePropertyStore-&amp;gt;GetValue(PKEY_Device_InstanceId, &amp;amp;varCaptureInstanceId);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FAILED(hr)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Capture devnode property store GetValue(PKEY_Device_InstanceId) failed: hr = 0x%08x"), hr);&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; if (VT_LPWSTR != varCaptureInstanceId.vt) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Capture instance id variant type is %u - expected VT_LPWSTR"), varCaptureInstanceId.vt);&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; LOG(_T("Instance Id of default capture device: %ls"), varCaptureInstanceId.pwszVal);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T(""));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // paydirt&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 == _wcsicmp(varRenderInstanceId.pwszVal, varCaptureInstanceId.pwszVal)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Default render and capture audio endpoints ARE on the same hardware."));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(_T("Default render and capture audio endpoints ARE NOT on the same hardware."));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;br&gt;&lt;br&gt;
&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8595180" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>Spot the Bug - IMFOutputSchema</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/05/27/spot-the-bug-imfoutputschema.aspx</link><pubDate>Tue, 27 May 2008 19:38:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8555138</guid><dc:creator>Maurits</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/8555138.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=8555138</wfw:commentRss><description>&lt;p&gt;I found a simple but nasty bug the other day in this implementation of the &lt;a href="http://msdn.microsoft.com/en-us/library/ms703800%28VS.85%29.aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms703800(VS.85).aspx"&gt;IMFOutputSchema&lt;/a&gt; interface. &lt;/p&gt;
&lt;p&gt;The symptoms: running this code outside of a debugger caused the app to crash.&amp;nbsp; Running it under a debugger (to catch the crash) caused the app to run clean. &lt;br&gt;&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;
&lt;p&gt;// outputschema.h&lt;br&gt;HRESULT CreateTrustedAudioDriversOutputSchema(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwConfigData,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GUID guidOriginatorID,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IMFOutputSchema **ppMFOutputSchema&lt;br&gt;);&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;// outputschema.cpp&lt;br&gt;// ... various include files removed ...&lt;br&gt;// CMFAttributesImpl implements the IMFAttributes interface, minus the IUnknown methods&lt;br&gt;class CTrustedAudioDriversOutputSchema : public CMFAttributesImpl&amp;lt;IMFOutputSchema&amp;gt; {&lt;br&gt;&lt;br&gt;friend&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT CreateTrustedAudioDriversOutputSchema(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwConfigData,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GUID guidOriginatorID,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IMFOutputSchema **ppMFOutputSchema&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br&gt;&lt;br&gt;private:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema(DWORD dwConfigData, GUID guidOriginatorID);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CTrustedAudioDriversOutputSchema();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG m_cRefCount;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD m_dwConfigData;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GUID m_guidOriginatorID;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;public:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // IUnknown methods&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT STDMETHODCALLTYPE QueryInterface(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [in] */ REFIID riid,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [out] */ LPVOID *ppvObject&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG STDMETHODCALLTYPE AddRef();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG STDMETHODCALLTYPE Release();&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // IMFOutputSchema methods&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT STDMETHODCALLTYPE GetConfigurationData(__out DWORD *pdwVal);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT STDMETHODCALLTYPE GetOriginatorID(__out GUID *pguidOriginatorID);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HRESULT STDMETHODCALLTYPE GetSchemaType(__out GUID *pguidSchemaType);&lt;br&gt;&lt;br&gt;}; // CTrustedAudioDriversOutputSchema&lt;br&gt;&lt;br&gt;HRESULT CreateTrustedAudioDriversOutputSchema(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwConfigData,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; GUID guidOriginatorID,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IMFOutputSchema **ppMFOutputSchema&lt;br&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == ppMFOutputSchema) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_POINTER;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppMFOutputSchema = NULL;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema *pSchema =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new CTrustedAudioDriversOutputSchema(dwConfigData, guidOriginatorID);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == pSchema) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(eError, _T("new CTrustedAudioDriversOutputSchema returned a NULL pointer"));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_OUTOFMEMORY;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppMFOutputSchema = static_cast&amp;lt;IMFOutputSchema *&amp;gt;(pSchema);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK;&lt;br&gt;} // CreateTrustedAudioDriversOutputSchema&lt;br&gt;&lt;br&gt;// constructor&lt;br&gt;CTrustedAudioDriversOutputSchema::CTrustedAudioDriversOutputSchema(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwConfigData, GUID guidOriginatorID&lt;br&gt;)&lt;br&gt;: m_dwConfigData(dwConfigData)&lt;br&gt;, m_guidOriginatorID(guidOriginatorID)&lt;br&gt;{}&lt;br&gt;&lt;br&gt;// destructor&lt;br&gt;CTrustedAudioDriversOutputSchema::~CTrustedAudioDriversOutputSchema() {}&lt;br&gt;&lt;br&gt;#define RETURN_INTERFACE(T, iid, ppOut) \&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (IsEqualIID(__uuidof(T), (iid))) { \&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this-&amp;gt;AddRef(); \&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(ppOut) = static_cast&amp;lt;T *&amp;gt;(this); \&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK; \&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {} (void)0&lt;br&gt;&lt;br&gt;// IUnknown::QueryInterface&lt;br&gt;HRESULT STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::QueryInterface(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [in] */ REFIID riid,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [out] */ LPVOID *ppvObject&lt;br&gt;) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == ppvObject) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_POINTER;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppvObject = NULL;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN_INTERFACE(IUnknown, riid, ppvObject);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN_INTERFACE(IMFAttributes, riid, ppvObject);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN_INTERFACE(IMFOutputSchema, riid, ppvObject);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return E_NOINTERFACE;&lt;br&gt;}&lt;br&gt;&lt;br&gt;// IUnknown::AddRef&lt;br&gt;ULONG STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::AddRef() {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG uNewRefCount = InterlockedIncrement(&amp;amp;m_cRefCount);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return uNewRefCount;&lt;br&gt;}&lt;br&gt;&lt;br&gt;// IUnknown::Release&lt;br&gt;ULONG STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::Release() {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ULONG uNewRefCount = InterlockedDecrement(&amp;amp;m_cRefCount);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (0 == uNewRefCount) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete this;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return uNewRefCount;&lt;br&gt;}&lt;br&gt;&lt;br&gt;// IMFOutputSchema::GetConfigurationData&lt;br&gt;HRESULT STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::GetConfigurationData(__out DWORD *pdwVal) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(eInfo1, _T("IMFOutputSchema::GetConfigurationData called"));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == pdwVal) { return E_POINTER; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pdwVal = m_dwConfigData;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK;&lt;br&gt;}&lt;br&gt;&lt;br&gt;// IMFOutputSchema::GetOriginatorID&lt;br&gt;HRESULT STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::GetOriginatorID(__out GUID *pguidOriginatorID) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(eInfo1, _T("IMFOutputSchema::GetOriginatorID called"));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == pguidOriginatorID) { return E_POINTER; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pguidOriginatorID = m_guidOriginatorID;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK;&lt;br&gt;}&lt;br&gt;&lt;br&gt;// IMFOutputSchema::GetSchemaType&lt;br&gt;HRESULT STDMETHODCALLTYPE&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CTrustedAudioDriversOutputSchema::GetSchemaType(__out GUID *pguidSchemaType) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOG(eInfo1, _T("IMFOutputSchema::GetSchemaType called"));&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (NULL == pguidSchemaType) { return E_POINTER; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pguidSchemaType = MFPROTECTION_TRUSTEDAUDIODRIVERS;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return S_OK;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8555138" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>Generating a sine wave with phase - answers</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/03/31/generate-a-sine-wave-with-phase-answers.aspx</link><pubDate>Mon, 31 Mar 2008 23:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8346510</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/8346510.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=8346510</wfw:commentRss><description>&lt;p&gt;In &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/18/generating-a-sine-wave-with-phase.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/18/generating-a-sine-wave-with-phase.aspx"&gt;a previous post&lt;/a&gt; I posed several mathematical problems... I'd like to go back and give some answers to them.&lt;/p&gt;

&lt;p&gt;To reiterate, we take a sine wave period and wrap it around a cylinder, giving us this:&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/500x375.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/500x375.aspx" alt="Sine wave wrapped around a cylinder" height="375" width="500"&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;
The problems are to:
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prove that the curve is planar.&lt;/li&gt;

&lt;li&gt;Prove that the curve is an ellipse.&lt;/li&gt;

&lt;li&gt;Make a &lt;a href="http://en.wikipedia.org/wiki/Johannes_Kepler" mce_href="http://en.wikipedia.org/wiki/Johannes_Kepler" target="_blank"&gt;Kepler&lt;/a&gt;ian observation.
Johannes Kepler was a mathematician/astronomer who made several observations relating to planetary orbits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's define the curve.  Since we're going to be making analogies to planetary orbit, let's define the curve
parametrically.  The parametric point is the analog of a planet.
&lt;/p&gt;

&lt;p style="margin: 10px;"&gt;Peter piper picked a peck of pickled peppers. &lt;i&gt;-- Mother Goose&lt;/i&gt;&lt;/p&gt;

&lt;p style="margin: 10px;"&gt;Penny Pingleton, you know you are punished.
From now on you're wearing a giant P on your blouse EVERY DAY to school
so that the whole world knows that Penny Pingleton is permanently, positively, punished.&lt;br&gt;
&lt;i&gt;-- Prudence Pingleton, &lt;a href="http://www.imdb.com/title/tt0095270/" mce_href="http://www.imdb.com/title/tt0095270/" target="_blank"&gt;Hairspray&lt;/a&gt;&lt;/i&gt;
&lt;/p&gt;

&lt;p&gt;OK, now that we have that out of the way...
I want the parametric point to sweep its way around the unit cylinder with constant angular velocity,
as viewed from above.  So if we project the path of the point into the unit cylinder with &lt;i&gt;z&lt;/i&gt; = 0, then
&lt;i&gt;r&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = 1 for all &lt;i&gt;t&lt;/i&gt; and &lt;i&gt;θ&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) is linear in &lt;i&gt;t&lt;/i&gt;.  In fact let's have
&lt;i&gt;θ&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) be &lt;i&gt;t&lt;/i&gt;, so at time &lt;i&gt;t&lt;/i&gt; = 2&lt;i&gt;π&lt;/i&gt;
our parametric point has made a complete cycle.
&lt;/p&gt;

&lt;p&gt;
Now we'll add the &lt;i&gt;z&lt;/i&gt; component in.  The curve is a wrapping of sin(&lt;i&gt;t&lt;/i&gt;), so &lt;i&gt;z&lt;/i&gt; = sin(&lt;i&gt;t&lt;/i&gt;); we aren't affecting
the vertical component of the paper by wrapping it horizontally around a cylinder.
&lt;/p&gt;

&lt;p&gt;We're actually, in a sense, done.  We have the formalized equations:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;r&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = 1&lt;/li&gt;

&lt;li&gt;&lt;i&gt;θ&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = &lt;i&gt;t&lt;/i&gt;&lt;/li&gt;

&lt;li&gt;&lt;i&gt;z&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = sin(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But let's convert to Cartesian
coordinates, since we'll be dealing with planes.  The relevant formulae are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;x&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt; + &lt;i&gt;y&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt; = &lt;i&gt;r&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/li&gt;

&lt;li&gt;tan(&lt;i&gt;θ&lt;/i&gt;) = &lt;i&gt;y&lt;/i&gt;/&lt;i&gt;x&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A little intuition, checked by back-substitution, gives us these for x and y:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;x&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = cos(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;

&lt;li&gt;&lt;i&gt;y&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = sin(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Putting these together with our formula for z, we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;i&gt;x&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = cos(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;

&lt;li&gt;&lt;i&gt;y&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = sin(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;

&lt;li&gt;&lt;i&gt;z&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = sin(&lt;i&gt;t&lt;/i&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that, no matter what &lt;i&gt;t&lt;/i&gt; is, &lt;i&gt;y&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) = &lt;i&gt;z&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;)... that is, the parametric point travels entirely in
the plane given by the equation &lt;i&gt;y&lt;/i&gt; = &lt;i&gt;z&lt;/i&gt;.  This proves that the parametric path is planar.
&lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Q.E.D." mce_href="http://en.wikipedia.org/wiki/Q.E.D." target="_blank"&gt;QED&lt;/a&gt; #1&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;To tackle #2 we have to prove that this planar curve is, in fact, an ellipse.  One way to do that would
be to come up with &lt;i&gt;x'&lt;/i&gt; and &lt;i&gt;y'&lt;/i&gt; coordinates in the plane of the curve, transform the parametric equations into
the new coordinate system, and verify that &lt;i&gt;a&lt;/i&gt;(&lt;i&gt;x'&lt;/i&gt;)&lt;sup&gt;2&lt;/sup&gt; + &lt;i&gt;b&lt;/i&gt;(&lt;i&gt;y'&lt;/i&gt;)&lt;sup&gt;2&lt;/sup&gt; = &lt;i&gt;c&lt;/i&gt;&lt;sup&gt;2&lt;/sup&gt;
for some &lt;i&gt;a&lt;/i&gt;, &lt;i&gt;b&lt;/i&gt;, and &lt;i&gt;c&lt;/i&gt;... but when I came up
with the problem I had a much simpler proof in mind.  There's also a third way of doing this, where you
note that the curve is the result of an affine transformation of the unit circle... and an affine transformation
of a circle is demonstratably an ellipse... but I hadn't thought of that.
&lt;/p&gt;

&lt;p&gt;Another astronomer/mathematician, &lt;a href="http://en.wikipedia.org/wiki/Apollonius_of_Perga" mce_href="http://en.wikipedia.org/wiki/Apollonius_of_Perga" target="_blank"&gt;Appollonius of Perga&lt;/a&gt;, made a study of "conic sections"... that is, the intersection of a plane with
a double-headed cone.  He came up with an exhaustive list of the kinds of curves that resulted.&lt;/p&gt;

&lt;p&gt;Basic conic sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346327/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346327/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346327/thumb.aspx" alt="Ellipse" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346327/thumb.aspx" height="77" width="100"&gt;&lt;/a&gt;
	An ellipse, if the angle that the plane makes is shallower than the edge of the cone;
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346330/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346330/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346330/thumb.aspx" alt="Hyperbola" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346330/thumb.aspx" height="77" width="100"&gt;&lt;/a&gt;
	A hyperbola, if the angle that the plane makes is steeper than the edge of the cone;
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346336/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346336/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346336/thumb.aspx" alt="Parabola" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346336/thumb.aspx" height="80" width="100"&gt;&lt;/a&gt;
	And a parabola, if the plane is parallel to the edge of the cone.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For complicated reasons (to wit, that gravity diminishes as the square of the distance between two objects,)
all heavenly bodies trace either an ellipse or a hyperbola as they go around (or past) another heavenly body.&lt;br&gt;
Parabolae are theoretically possible but would smack heavily of "design"; as yet none have been observed.
&lt;/p&gt;

&lt;p&gt;For completeness, there are other "designed" ways to intersect a double-headed cone with a plane in a coincidental fashion:&lt;/p&gt;

&lt;p&gt;Degenerate conic sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346319/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346319/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346319/thumb.aspx" alt="Circle" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346319/thumb.aspx" height="75" width="100"&gt;&lt;/a&gt;
	A circle - early astronomers were convinced that the heavenly bodies moved only in circles.
        It took a long time for us to believe our measurements (which showed uncircular orbits) and acknowledge that
	the orbits are in fact elliptical.  Instead, great efforts were made to show that the deviation could be made
	up of other, smaller, circular sub-orbits.  Eventually we admitted that the orbits were elliptical
	(ellipses are more complicated than circles, but much simpler than the proposed circles-within-circles)
	and not until Newton did we understand &lt;i&gt;why&lt;/i&gt; planets move in ellipses.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346344/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346344/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346344/thumb.aspx" alt="Straight Line" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346344/thumb.aspx" height="75" width="100"&gt;&lt;/a&gt;
	A straight line - this is a degenerate hyperbola.  This is one solution to the "one body" problem.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346332/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346332/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346332/thumb.aspx" alt="Two Straight Lines" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346332/thumb.aspx" height="83" width="100"&gt;&lt;/a&gt;
	Two intersecting straight lines - a hyperbola, as seen from infinitely far off.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346342/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346342/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346342/thumb.aspx" alt="Single Point" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346342/thumb.aspx" height="77" width="100"&gt;&lt;/a&gt;
	A single point - the other solution to the "one body" problem.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since our curve is the intersection of a plane and a cylinder, we're done!  &lt;del&gt;&lt;b&gt;QED #2&lt;/b&gt;&lt;/del&gt;.  Well, not quite.&lt;/p&gt;

&lt;p&gt;Appolonius' results hold for cones.  We have a cylinder.  Those aren't quite the same thing.  Right?&lt;/p&gt;

&lt;p&gt;They aren't, quite... but a cylinder can be viewed as a degenerate form of cone.  To wit, &lt;i&gt;a cylinder is a cone whose
apex is infinitely far off.&lt;/i&gt;  I'll get back to a "proof" of this in a minute, but if you allow this, then we really are done.
&lt;/p&gt;

&lt;p&gt;Instead of the seven intersections of a double-headed cone and a plane, there are
only four ways a cylinder and a plane can intersect.  Two of these are new.&lt;/p&gt;

&lt;p&gt;Cylindrical conics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346328/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346328/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346328/thumb.aspx" alt="Ellipse in a Cylinder" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346328/thumb.aspx" height="77" width="100"&gt;&lt;/a&gt;
	An ellipse - though it remains to be proven that this really is an ellipse.
	A circle is a special form of this... I won't show it again.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346345/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346345/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346345/thumb.aspx" alt="Straight Line in a Cylinder" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346345/thumb.aspx" height="79" width="100"&gt;&lt;/a&gt;
	A straight line - the single body problem again.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346340/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346340/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346340/thumb.aspx" alt="Parallel Lines in a Cylinder" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346340/thumb.aspx" height="83" width="100"&gt;&lt;/a&gt;
	Two straight lines - parallel this time.  This is something new.
&lt;/li&gt;

&lt;li&gt;&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346334/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346334/original.aspx" target="_blank"&gt;&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346334/thumb.aspx" alt="Empty Intersection with a Cylinder" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346334/thumb.aspx" height="78" width="100"&gt;&lt;/a&gt;
	No intersection at all.  The &lt;a href="http://en.wikipedia.org/wiki/K%C5%8Dan" target="_blank" mce_href="http://en.wikipedia.org/wiki/K%C5%8Dan"&gt;kōan&lt;/a&gt; of conics.
	This is new, but whether it is something is a question I will not attempt to address.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now for the proof that cylindrical intersection #1 really is an ellipse.  Place two double-headed cones
coaxially with the cylinder.  Arrange them so that:
&lt;/p&gt;

&lt;ul&gt;
	
&lt;li&gt;The apexes of both cones are in the "up" direction, from anywhere on the curve in question.&lt;/li&gt;
	
&lt;li&gt;The "top" cone intersects the highest point on the curve in question.&lt;/li&gt;
	
&lt;li&gt;The "bottom" cone intersects the lowest point on the curve in question.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Diagram: &lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346851/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346851/original.aspx" alt="Auxiliary cones" height="443" width="236"&gt;
&lt;/p&gt;

&lt;p&gt;Notice that the entire curve lies in between the two cones.  Consider the intersection of the plane that
determines the curve with each of the cones.  We know both of these are ellipses; we know that the intersection
of the plane with the "upper" cone lies wholly outside our unknown curve; and we know that the intersection of
the plane with the "inner" cone lies wholly inside our unknown curve.
&lt;/p&gt;

&lt;p&gt;
Diagram: &lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346853/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346853/original.aspx" alt="Auxiliary cones - cross section" height="398" width="490"&gt;
&lt;/p&gt;

&lt;p&gt;
The final stage of the proof lies in pushing the apexes of both cones to infinity, which "squeezes" our unknown curve
in between two known ellipses.  Since the horizontal distance between the cones goes to zero as 2&lt;sup&gt;3/2&lt;/sup&gt; / tan(&lt;i&gt;θ&lt;/i&gt;), our
unknown curve cannot help but be elliptical-ish... &lt;i&gt;to any degree of precision&lt;/i&gt;... and it is, thus, an ellipse.  &lt;b&gt;QED #2&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;For the final problem, we must make a "Keplerian observation."  The observation in question is that our parametric point,
like the planets, sweeps out &lt;a href="http://en.wikipedia.org/wiki/Kepler%27s_laws_of_planetary_motion#Second_law" mce_href="http://en.wikipedia.org/wiki/Kepler%27s_laws_of_planetary_motion#Second_law" target="_blank"&gt;equal areas in equal times&lt;/a&gt;.  What makes this interesting is that the parametric point does &lt;i&gt;not&lt;/i&gt; move in the same way
that a planet does... so it's a little odd that such a similar result should hold... but it does.&lt;/p&gt;

&lt;p&gt;Let's talk a little about Kepler's second law.  A planet moves around the sun in an elliptical orbit.  Fine.
The sun lies at one of the foci of the ellipse.  An imaginary line between the planet and the sun will sweep out area at a constant rate.
That is to say, when the planet is far from the sun, that line will be long... and it will move correspondingly slowly.
When the planet is near to the sun, that line will be short... and it will move correspondingly quickly.
&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346930/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346930/original.aspx" alt="Planetary orbit" height="188" width="387"&gt;
&lt;/p&gt;

&lt;p&gt;Conversely, our parametric point sweeps around the origin at &lt;i&gt;constant&lt;/i&gt; angular velocity.  So this is trivially
"equal areas in equal times".  Right?
&lt;/p&gt;

&lt;p&gt;Not quite.  It's true that our parametric point &lt;i&gt;appears&lt;/i&gt; to have constant angular velocity, &lt;i&gt;if you project
its path into the x-y plane&lt;/i&gt;... that is, if you view it from directly above, from a point on the z-axis.&lt;/p&gt;

&lt;p&gt;But that's a silly way to look at things.  To get an idea of the point's &lt;i&gt;actual&lt;/i&gt; motion, it's far more natural
to view it from an axis orthogonal to the plane of motion.  So let's put an observer (Aranea) directly above the point, and
another observer (Nellie) in the more natural location.&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346936/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346936/original.aspx" alt="Aranea and Nellie" height="445" width="435"&gt;
&lt;/p&gt;

&lt;p&gt;From Aranea's point of view, the motion is a simple constant-speed trip around a circle.  But Nellie sees the parametric
point's true velocity.  The parametric point's velocity has two components... a constant "clockwise" component in the
x-y plane, and a variable orthogonal component going "up" or "down".  This is maximized when the curve crosses the x-y plane,
and minimized when the curve is topping or bottoming out.  So Nellie sees this:&lt;br&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346932/original.aspx" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/8346932/original.aspx" alt="Parametric point" height="188" width="387"&gt;
&lt;/p&gt;

&lt;p&gt;It seems hard to believe, given that the parametric point is speeding up and slowing down according to different rules...
and the notion of "center" is different... but the fact is, the parametric point &lt;i&gt;also&lt;/i&gt; sweeps out equal areas in equal times!
&lt;/p&gt;

&lt;p&gt;To see this most easily, look at Aranea's point of view again.  Have Aranea draw a grid on her picture of the system.
She can count the area swept out in any given time by counting the number of squares.&lt;/p&gt;

&lt;p&gt;Now consider what those squares look like to Nellie.  They're rectangles.  &lt;i&gt;But they're all of equal area.&lt;/i&gt;
Aranea and Nellie can label the squares according to some naming scheme, and will agree that the same set of squares/rectangles were
swept out... but this means, since the rectangles are of equal area, that even in Nellie's point of view, equal areas are
swept out in equal times! &lt;b&gt;QED #3.&lt;/b&gt;
&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8346510" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item><item><title>Generating a sine wave with phase</title><link>http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/18/generating-a-sine-wave-with-phase.aspx</link><pubDate>Fri, 18 Jan 2008 22:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7152444</guid><dc:creator>Maurits</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/matthew_van_eerde/comments/7152444.aspx</comments><wfw:commentRss>http://blogs.msdn.com/matthew_van_eerde/commentrss.aspx?PostID=7152444</wfw:commentRss><description>&lt;p&gt;I alluded to a bug in &lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/08/generating-a-sine-wave.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2008/01/08/generating-a-sine-wave.aspx"&gt;my last post&lt;/a&gt; but didn't explicitly say what it was.&amp;nbsp; Hint: it's all about phase.&lt;/p&gt;

&lt;p&gt;So let's talk about phase for a minute.&amp;nbsp; Sine waves are periodic... although they are frequently plotted over very large intervals, their natural domain is a single period.&lt;br&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152130/500x130.aspx" alt="2-D sine wave" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152130/500x130.aspx" height="130" width="500"&gt; &lt;/p&gt;

&lt;p&gt;(&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152130/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152130/original.aspx"&gt;original&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Exercise&lt;/i&gt; - The original version, when printed, makes a nice armband.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Advanced Exercise&lt;/i&gt; - generate a one-and-a-half period sine wave, print it on both sides of a piece of paper, and make a &lt;a href="http://en.wikipedia.org/wiki/M%C3%B6bius_strip" mce_href="http://en.wikipedia.org/wiki/M%C3%B6bius_strip"&gt;Möbius strip&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Well, that's a step, but it's not really getting at the nature of the sine wave.&amp;nbsp; Yes, we notice that the beginning value (0) is the same as the ending value... and the beginning slope (+1) is the same as the ending slope... and there is, perhaps, a certain smoothness beyond even slope (in fact, all derivatives agree at the crossover point...)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.msdn.com/matthew_van_eerde/archive/2007/12/18/if-you-see-a-fact-try-to-see-it-as-intuitively-as-possible.aspx" mce_href="http://blogs.msdn.com/matthew_van_eerde/archive/2007/12/18/if-you-see-a-fact-try-to-see-it-as-intuitively-as-possible.aspx"&gt;If you see a fact, try to see it as intuitively as possible.&lt;/a&gt;&lt;br&gt;&lt;br&gt;Do the first exercise above - print out the original image, cut it out along the lines, and make a cylinder by connecting the short ends together.&amp;nbsp; Rotate the cylinder through various orientations, paying particular attention to the location of the sine wave at all times.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;What you get is hard to render in a two-dimensional blog post, but here's a stab at it (Matlab script below:)&lt;br&gt;&lt;/p&gt;
&lt;img src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/500x375.aspx" alt="3-D sine wave" mce_src="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/500x375.aspx" height="375" width="500"&gt; 
&lt;p&gt;(&lt;a href="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/original.aspx" mce_href="http://blogs.msdn.com/photos/matthew_van_eerde/images/7152146/original.aspx"&gt;original&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Notice that this representation of the sine wave is an ellipse.&lt;/p&gt;

&lt;p&gt;&lt;span style="font-style: italic;"&gt;Exercise&lt;/span&gt; - Prove that the red line in the above graph is planar (Hint: you can type the equation of the plane in three keystrokes.)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-style: italic;"&gt;Advanced Exercise&lt;/span&gt; - Prove that it's an ellipse.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Advanced Exercise&lt;/i&gt; - Make a &lt;a href="http://en.wikipedia.org/wiki/Johannes_Kepler" mce_href="http://en.wikipedia.org/wiki/Johannes_Kepler"&gt;Kepler&lt;/a&gt;ian observation. (Hint: note the angles at which the red line crosses the dotted black lines.)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;So what does this have to do with phase?&lt;/p&gt;

&lt;p&gt;Everything.&lt;/p&gt;

&lt;p&gt;There's another hint in the documentation of &lt;a href="http://msdn2.microsoft.com/en-us/library/wkbss70y%28VS.80%29.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/wkbss70y%28VS.80%29.aspx"&gt;double sin(double)&lt;/a&gt;, which I also linked in my last post:&lt;/p&gt;

&lt;blockquote&gt;&lt;b&gt;sin&lt;/b&gt; returns the sine of &lt;i&gt;&lt;span class="parameter"&gt;x&lt;/span&gt;&lt;/i&gt; [phase]. &lt;i&gt;If &lt;/i&gt;&lt;span class="parameter"&gt;x [phase]&lt;/span&gt;&lt;i&gt; is greater than or equal to 263, or less than or equal to –263, a loss of significance in the result occurs. &lt;/i&gt;(my emphasis)&lt;i&gt;&lt;br&gt;&lt;/i&gt;&lt;/blockquote&gt;

&lt;p&gt;A final hint: again from my last post, "as a side effect, we get a kinda-sorta implementation of &lt;span class="Unicode"&gt;&lt;i&gt;ϕ &lt;/i&gt;[phase]&lt;i&gt;."&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;When you find yourself with a kinda-sorta implementation of something, that is occasionally a hint from above that your life will be easier if you do some self-examination... perhaps a full-blown implementation of that thing will be (a) easier and (b) more what you actually want.&lt;/p&gt;

&lt;p&gt;No more hints.&amp;nbsp; If you want to figure it out for yourself, &lt;i&gt;stop reading now&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;OK, here's the scoop.&amp;nbsp; The thing you feed to sin(...) is a radian measurement.&amp;nbsp; This is naturally between 0 and 2&lt;i&gt;π&lt;/i&gt; (or, perhaps, -&lt;i&gt;π&lt;/i&gt; to &lt;i&gt;π&lt;/i&gt; if you prefer.)&amp;nbsp; You &lt;i&gt;can&lt;/i&gt; feed it things that are out of this range... say, sin(100.0)... but this is a little out of the natural and there are consequences.&lt;/p&gt;

&lt;p&gt;double-type numbers, and floating point numbers in general, can represent very small numbers to a very high degree of precision... and they can represent very large numbers with the same &lt;i&gt;relative&lt;/i&gt; degree of precision.&amp;nbsp; See &lt;a href="http://en.wikipedia.org/wiki/IEEE754-1985" mce_href="http://en.wikipedia.org/wiki/IEEE754-1985"&gt;IEEE754&lt;/a&gt; for gory details.&lt;/p&gt;

&lt;p&gt;An illustration is in order.&amp;nbsp; Richard Feynman, celebrity physicist, tells a story of his youth.&amp;nbsp; He claimed to be able to solve, in one minute, to within 10% accuracy, any problem that can be stated in ten seconds.&lt;br&gt;&lt;br&gt;He did pretty well until someone came up with "tan(10&lt;sup&gt;100&lt;/sup&gt;)".&lt;/p&gt;

&lt;p&gt;If you feed bigger and bigger numbers to sin(...), eventually it starts giving you sloppy answers.&amp;nbsp; It has to.&amp;nbsp; It's not getting enough information to give you a good answer.&lt;/p&gt;

&lt;p&gt;I was able to test the tone generation function and measure the signal-to-noise ratio of the tones it was producing after varying lengths of sample time.&amp;nbsp; It started off very well, but after very long times (days, weeks, years) the SNR would get slowly compromised until, after millions of years, the signal disappeared.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;That is not the bug.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;But it is a serious clue to the bug.&lt;/p&gt;

&lt;p&gt;If the worst-case scenario for an implementation is that the signal will depreciate over a million years, ship it.&lt;/p&gt;

&lt;p&gt;Take your cylinder that you made above.&amp;nbsp; Place it in front of you so that the taped-together part is directly in front of your nose, and the part to the right has the red line going up.&amp;nbsp; This is a sine wave.&lt;/p&gt;

&lt;p&gt;Rotate it clockwise 90 degrees, so the part in front of your nose has the red line brushing the top.&amp;nbsp; Now it is a cosine wave.&lt;/p&gt;

&lt;p&gt;Rotate it counter-clockwise 60 degrees, so the part in front of your nose has the red line crossing the dotted line.&amp;nbsp; Now it is a sine wave with a known phase (30 degrees.)&lt;br&gt;&lt;/p&gt;

&lt;p&gt;In fact, rotate it any angle (say, &lt;i&gt;&lt;span class="Unicode"&gt;ϕ&lt;/span&gt;&lt;/i&gt;&lt;span class="Unicode"&gt;) and it's a sine wave with known phase &lt;/span&gt;&lt;i&gt;&lt;span class="Unicode"&gt;ϕ&lt;/span&gt;&lt;/i&gt;&lt;span class="Unicode"&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;We can't do that with our tone generator.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;span style="font-style: italic;"&gt;That is the bug.&lt;/span&gt;&amp;nbsp; We're implementing a tweaked version of phase which has a forgivable side effect, but which is not a full implementation of phase.&lt;/p&gt;

&lt;p&gt;Why do we care about implementing phase?&lt;/p&gt;

&lt;p&gt;Well, for example, one problem I sometimes have when testing audio fidelity is I connect the stereo cables to the Audio Precision equipment the wrong way (left-to-right and right-to-left.)&amp;nbsp; If I could generate the test tones out of phase by 90 degrees, with the left channel in front of the right channel, I could take a phase measurement and log a "you have the cables backwards" error.&amp;nbsp; I send different frequencies over the cables, so the ifFrameOffset parameter is of little use here.&lt;/p&gt;

&lt;p&gt;So what's the improved implementation?&lt;/p&gt;

&lt;p&gt;Instead of&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;
&lt;p&gt;// given a buffer, fills it with sine wave data&lt;br&gt;HRESULT FillBufferWithSine(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPCWAVEFORMATEX pWfx, // includes sample rate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double lfAmplitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double lfFrequency,&lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT64 ifFrameOffset,&lt;br&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pBuffer,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT32 cbBytes&lt;br&gt;);&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;do&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;

&lt;p&gt;// given a buffer, fills it with sine wave data&lt;br&gt;HRESULT 
FillBufferWithSine(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPCWAVEFORMATEX pWfx, // includes sample rate&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double lfAmplitude,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double lfFrequency,&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // in/out&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; On input, initial phase (0 to 2pi).&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; On output, phase of next sample.&lt;br&gt;
&lt;span style="font-weight: bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; double *plfPhase,&lt;/span&gt;&lt;br style="font-weight: bold;"&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pBuffer, // out - byte count is cbBytes&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT32 cbBytes&lt;br&gt;);&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Now, if you want to generate a lot of contiguous sine tone buffers, you do something like this:&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;












&lt;p&gt;double lfPhase = 0.0; // start at 0... or somewhere else&lt;br&gt;while (...) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FillBufferWithSine takes care of updating lfPhase as necessary &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hr = FillBufferWithSine(pWfx, lfAmp, lfFreq, &amp;amp;lfPhase, pBuffer, cbBytes);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ... &lt;br&gt;}&lt;br&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As a side effect of this new phase feature, the quality degradation non-issue goes away.&amp;nbsp; So the generated tones will sound good &lt;i&gt;forever&lt;/i&gt;... which is kind of neat... but not the motivation for this fix.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Why did this happen?&lt;/p&gt;

&lt;p&gt;Because there are many ways to measure time.&amp;nbsp; You can count samples... you can count milliseconds... you can count hundred-nanosecond intervals... you can count CPU flops... you can do so many different things.&amp;nbsp; Some are more natural than others in different contexts.&lt;/p&gt;

&lt;p&gt;The reason this happened is because a time measure that was very natural in one context (counting frames: playing an audio stream) was somewhat artificially shoved into another context (generating a sine wave) where there was another, more natural context (changing phase.)&amp;nbsp; Alas, context switching is a frequent source of bugs.&lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;hr style="width: 50%;"&gt;
&lt;p&gt;Matlab script to generate the three-dimensional rendering of a sine wave:&lt;/p&gt;
&lt;div style="font-family: monospace;"&gt;t = 0:pi/50:2*pi;&lt;br&gt;h = -1:0.5:1;&lt;br&gt;z = ones(size(t))' * h;&lt;br&gt;&lt;br&gt;sinx = cos(t);&lt;br&gt;siny = sin(t);&lt;br&gt;sinz = sin(t);&lt;br&gt;&lt;br&gt;plot3( ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sinx, siny, z, 'k:', ...&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sinx, siny, sinz, 'r' ...&lt;br&gt;);&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7152444" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Math/default.aspx">Math</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Audio/default.aspx">Audio</category><category domain="http://blogs.msdn.com/matthew_van_eerde/archive/tags/Win32/default.aspx">Win32</category></item></channel></rss>