forked from auracaster/pyalsaaudio
174 lines
8.3 KiB
HTML
174 lines
8.3 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html lang="en" data-content_root="./">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<title>PCM Terminology and Concepts — alsaaudio documentation 0.11.0 documentation</title>
|
||
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
|
||
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=cb25574f" />
|
||
<script src="_static/documentation_options.js?v=f3b36f1a"></script>
|
||
<script src="_static/doctools.js?v=9a2dae69"></script>
|
||
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
<link rel="index" title="Index" href="genindex.html" />
|
||
<link rel="search" title="Search" href="search.html" />
|
||
<link rel="next" title="alsaaudio" href="libalsaaudio.html" />
|
||
<link rel="prev" title="Introduction" href="pyalsaaudio.html" />
|
||
|
||
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
||
|
||
</head><body>
|
||
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
|
||
|
||
<div class="body" role="main">
|
||
|
||
<section id="pcm-terminology-and-concepts">
|
||
<h1>PCM Terminology and Concepts<a class="headerlink" href="#pcm-terminology-and-concepts" title="Link to this heading">¶</a></h1>
|
||
<p>In order to use PCM devices it is useful to be familiar with some concepts and
|
||
terminology.</p>
|
||
<dl>
|
||
<dt>Sample</dt><dd><p>PCM audio, whether it is input or output, consists of <em>samples</em>.
|
||
A single sample represents the amplitude of one channel of sound
|
||
at a certain point in time. A lot of individual samples are
|
||
necessary to represent actual sound; for CD audio, 44100 samples
|
||
are taken every second.</p>
|
||
<p>Samples can be of many different sizes, ranging from 8 bit to 64
|
||
bit precision. The specific format of each sample can also vary -
|
||
they can be big endian byte integers, little endian byte integers, or
|
||
floating point numbers.</p>
|
||
<p>Musically, the sample size determines the dynamic range. The
|
||
dynamic range is the difference between the quietest and the
|
||
loudest signal that can be reproduced.</p>
|
||
</dd>
|
||
<dt>Frame</dt><dd><p>A frame consists of exactly one sample per channel. If there is only one
|
||
channel (Mono sound) a frame is simply a single sample. If the sound is
|
||
stereo, each frame consists of two samples, etc.</p>
|
||
</dd>
|
||
<dt>Frame size</dt><dd><p>This is the size in bytes of each frame. This can vary a lot: if each sample
|
||
is 8 bits, and we’re handling mono sound, the frame size is one byte.
|
||
For six channel audio with 64 bit floating point samples, the frame size
|
||
is 48 bytes.</p>
|
||
</dd>
|
||
<dt>Rate</dt><dd><p>PCM sound consists of a flow of sound frames. The sound rate controls how
|
||
often the current frame is replaced. For example, a rate of 8000 Hz
|
||
means that a new frame is played or captured 8000 times per second.</p>
|
||
</dd>
|
||
<dt>Data rate</dt><dd><p>This is the number of bytes which must be consumed or provided per
|
||
second at a certain frame size and rate.</p>
|
||
<p>8000 Hz mono sound with 8 bit (1 byte) samples has a data rate of
|
||
8000 * 1 * 1 = 8 kb/s or 64kbit/s. This is typically used for telephony.</p>
|
||
<p>At the other end of the scale, 96000 Hz, 6 channel sound with 64
|
||
bit (8 bytes) samples has a data rate of 96000 * 6 * 8 = 4608
|
||
kb/s (almost 5 MB sound data per second).</p>
|
||
<p>If the data rate requirement is not met, an overrun (on capture) or
|
||
underrun (on playback) occurs; the term “xrun” is used to refer to
|
||
either event.</p>
|
||
</dd>
|
||
</dl>
|
||
<dl id="term-period">
|
||
<dt>Period</dt><dd><p>The CPU processes sample data in chunks of frames, so-called periods
|
||
(also called fragments by some systems). The operating system kernel’s
|
||
sample buffer must hold at least two periods (at any given time, one
|
||
is processed by the sound hardware, and one by the CPU).</p>
|
||
<p>The completion of a <em>period</em> triggers a CPU interrupt, which causes
|
||
processing and context switching overhead. Therefore, a smaller period
|
||
size causes higher CPU resource usage at a given data rate.</p>
|
||
<p>A bigger size of the <em>buffer</em> improves the system’s resilience to xruns.
|
||
The buffer being split into a bigger number of smaller periods also does
|
||
that, as it allows it to be drained / topped up sooner.</p>
|
||
<p>On the other hand, a bigger size of the <em>buffer</em> also increases the
|
||
playback latency, that is, the time it takes for a frame from being
|
||
sent out by the application to being actually audible.</p>
|
||
<p>Similarly, a bigger <em>period</em> size increases the capture latency.</p>
|
||
<p>The trade-off between latency, xrun resilience, and resource usage
|
||
must be made depending on the application.</p>
|
||
</dd>
|
||
<dt>Period size</dt><dd><p>This is the size of each period in frames. <em>Not bytes, but frames!</em>
|
||
In <a class="reference internal" href="libalsaaudio.html#module-alsaaudio" title="alsaaudio (Linux)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">alsaaudio</span></code></a> the period size is set directly, and it is
|
||
therefore important to understand the significance of this
|
||
number. If the period size is configured to for example 32,
|
||
each write should contain exactly 32 frames of sound data, and each
|
||
read will return either 32 frames of data or nothing at all.</p>
|
||
</dd>
|
||
</dl>
|
||
<dl id="term-sample-size">
|
||
<dt>Sample size</dt><dd><p>Each sample takes <em>physical_bits</em> of space. <em>nominal_bits</em> tells
|
||
how many least significant bits are used. This is the bit depth
|
||
in the format name and sometimes called just <em>sample bits</em> or
|
||
<em>format width</em>. <em>significant_bits</em> tells how many most significant
|
||
bits of the <em>nominal_bits</em> are used by the sample. This can be thought
|
||
of as the <em>sample resolution</em>. This is visualized as follows:</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">MSB</span> <span class="o">|</span><span class="mi">00000000</span> <span class="n">XXXXXXXX</span> <span class="n">XXXXXXXX</span> <span class="mi">00000000</span><span class="o">|</span> <span class="n">LSB</span>
|
||
<span class="o">|--</span><span class="n">significant</span><span class="o">--|</span>
|
||
<span class="o">|---------</span><span class="n">nominal</span><span class="o">---------|</span>
|
||
<span class="o">|-------------</span><span class="n">physical</span><span class="o">--------------|</span>
|
||
</pre></div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
<p>Once you understand these concepts, you will be ready to use the PCM API. Read
|
||
on.</p>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper"><div class="relations">
|
||
<h3>Related Topics</h3>
|
||
<ul>
|
||
<li><a href="index.html">Documentation overview</a><ul>
|
||
<li>Previous: <a href="pyalsaaudio.html" title="previous chapter">Introduction</a></li>
|
||
<li>Next: <a href="libalsaaudio.html" title="next chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">alsaaudio</span></code></a></li>
|
||
</ul></li>
|
||
</ul>
|
||
</div>
|
||
<div role="note" aria-label="source link">
|
||
<h3>This Page</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="_sources/terminology.rst.txt"
|
||
rel="nofollow">Show Source</a></li>
|
||
</ul>
|
||
</div>
|
||
<search id="searchbox" style="display: none" role="search">
|
||
<h3 id="searchlabel">Quick search</h3>
|
||
<div class="searchformwrapper">
|
||
<form class="search" action="search.html" method="get">
|
||
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||
<input type="submit" value="Go" />
|
||
</form>
|
||
</div>
|
||
</search>
|
||
<script>document.getElementById('searchbox').style.display = "block"</script>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="footer">
|
||
©2017, Lars Immisch & Casper Wilstrup.
|
||
|
||
|
|
||
Powered by <a href="http://sphinx-doc.org/">Sphinx 7.3.7</a>
|
||
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
||
|
||
|
|
||
<a href="_sources/terminology.rst.txt"
|
||
rel="nofollow">Page source</a>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</body>
|
||
</html> |