 <p>When you have signed 16-bit samples, you should use a signed 16-bit data type for your buffer:</p> <pre><code>typedef short int s16; s16 *buffer = malloc(size_in_bytes); </code></pre> <p>(You should use <code>SND_PCM_FORMAT_S16</code> to get the endianness correct.)</p> <p>In the buffer, every four values are one frame.</p> <pre><code>for (i = 0; i &lt; capture; i++) { ch1 = buffer[i * 4 + 0]; ch2 = buffer[i * 4 + 1]; ch3 = buffer[i * 4 + 2]; ch4 = buffer[i * 4 + 3]; // or use a loop over 0..3 ... } </code></pre> <p>Alternatively, if you want to access all the samples of one specific channel, go over the buffer in steps of four:</p> <pre><code>// for the first channel for (i = 0; i &lt; capture; i++) { sample = buffer[i * 4 + 0]; ... } </code></pre>