 <p>Let's start by getting some terminology out of the way</p> <ul> <li>A <em>channel</em> is a monaural stream of samples. The term does not necessarily imply that the samples are contiguous in the data stream. </li> <li>A <em>frame</em> is a set of co-incident samples. For stereo audio (e.g. L &amp; R channels) a frame contains two samples.</li> <li>A <em>packet</em> is 1 or more frames, and is typically the minimun number of frames that can be processed by a system at once. For PCM Audio, a packet often contains 1 frame, but for compressed audio it will be larger. </li> <li><em>Interleaving</em> is a term typically used for stereo audio, in which the data stream consists of consecutive frames of audio. The stream therefore looks like L1R1L2R2L3R3......LnRn</li> </ul> <p>Both big and little endian audio formats exist, and depend on the use-case. However, it's generally ever an issue when exchanging data between systems - you'll always use native byte-order when processing or interfacing with operating system audio components. </p> <p>You don't say whether you're using a little or big endian system, but I suspect it's probably the former. In which case you need to byte-reverse the samples.</p> <p>Although not set in stone, when using floating point samples are usually in the range <code>-1.0&lt;x&lt;+1.0</code>, so you want to divide the samples by <code>1&lt;&lt;15</code>. When 16-bit linear types are used, they are typically signed.</p> <p>Taking care of byte-swapping and format conversions:</p> <pre><code>int s = (int) interleavedData[2 * i]; short revS = (short) (((s &amp; 0xff) &lt;&lt; 8) | ((s &gt;&gt; 8) &amp; 0xff)) left[i] = ((float) revS) / 32767.0f; </code></pre>