forked from auracaster/pyalsaaudio
items. Argument parsing errors are reported with the methodname (minor improvement). Smallish documentation improvements. git-svn-id: svn://svn.code.sf.net/p/pyalsaaudio/code/trunk@23 ec2f30ec-7544-0410-870e-f70ca00c83f0
185 lines
7.1 KiB
HTML
185 lines
7.1 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
<html>
|
|
<head>
|
|
<link rel="STYLESHEET" href="pyalsaaudio.css" type='text/css' />
|
|
<link rel="first" href="pyalsaaudio.html" title='PyAlsaAudio' />
|
|
<link rel='contents' href='contents.html' title="Contents" />
|
|
<link rel='last' href='about.html' title='About this document...' />
|
|
<link rel='help' href='about.html' title='About this document...' />
|
|
<link rel="next" href="pcm-objects.html" />
|
|
<link rel="prev" href="module-alsaaudio.html" />
|
|
<link rel="parent" href="module-alsaaudio.html" />
|
|
<link rel="next" href="pcm-objects.html" />
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<meta name='aesop' content='information' />
|
|
<title>4.1 PCM Terminology and Concepts</title>
|
|
</head>
|
|
<body>
|
|
<div class="navigation">
|
|
<div id='top-navigation-panel' xml:id='top-navigation-panel'>
|
|
<table align="center" width="100%" cellpadding="0" cellspacing="2">
|
|
<tr>
|
|
<td class='online-navigation'><a rel="prev" title="4 alsaaudio"
|
|
href="module-alsaaudio.html"><img src='previous.png'
|
|
border='0' height='32' alt='Previous Page' width='32' /></a></td>
|
|
<td class='online-navigation'><a rel="parent" title="4 alsaaudio"
|
|
href="module-alsaaudio.html"><img src='up.png'
|
|
border='0' height='32' alt='Up one Level' width='32' /></a></td>
|
|
<td class='online-navigation'><a rel="next" title="4.2 pcm Objects"
|
|
href="pcm-objects.html"><img src='next.png'
|
|
border='0' height='32' alt='Next Page' width='32' /></a></td>
|
|
<td align="center" width="100%">PyAlsaAudio</td>
|
|
<td class='online-navigation'><a rel="contents" title="Table of Contents"
|
|
href="contents.html"><img src='contents.png'
|
|
border='0' height='32' alt='Contents' width='32' /></a></td>
|
|
<td class='online-navigation'><img src='blank.png'
|
|
border='0' height='32' alt='' width='32' /></td>
|
|
<td class='online-navigation'><img src='blank.png'
|
|
border='0' height='32' alt='' width='32' /></td>
|
|
</tr></table>
|
|
<div class='online-navigation'>
|
|
<b class="navlabel">Previous:</b>
|
|
<a class="sectref" rel="prev" href="module-alsaaudio.html">4 alsaaudio</a>
|
|
<b class="navlabel">Up:</b>
|
|
<a class="sectref" rel="parent" href="module-alsaaudio.html">4 alsaaudio</a>
|
|
<b class="navlabel">Next:</b>
|
|
<a class="sectref" rel="next" href="pcm-objects.html">4.2 PCM Objects</a>
|
|
</div>
|
|
<hr /></div>
|
|
</div>
|
|
<!--End of Navigation Panel-->
|
|
|
|
<h2><a name="SECTION002410000000000000000">
|
|
4.1 PCM Terminology and Concepts</a>
|
|
</h2>
|
|
|
|
<p>
|
|
In order to use PCM devices it is useful to be familiar with some concepts and
|
|
terminology.
|
|
|
|
<p>
|
|
<dl>
|
|
<dt><strong>Sample</strong></dt>
|
|
<dd>PCM audio, whether it is input or output, consists at
|
|
the lowest level of a number of single samples. A sample represents
|
|
the sound in a single channel in a brief interval. If more than one
|
|
channel is in use, more than one sample is required for each
|
|
interval to describe the sound. Samples can be of many different
|
|
sizes, ranging from 8 bit to 64 bit presition. The specific format
|
|
of each sample can also vary - they can be big endian byte order,
|
|
little endian byte order, or even floats.
|
|
|
|
<p>
|
|
</dd>
|
|
<dt><strong>Frame</strong></dt>
|
|
<dd>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><strong>Frame size</strong></dt>
|
|
<dd>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. Similarly in 6 channel audio with 64 bit
|
|
floating point samples, the frame size is 48 bytes
|
|
|
|
<p>
|
|
</dd>
|
|
<dt><strong>Rate</strong></dt>
|
|
<dd>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><strong>Data rate</strong></dt>
|
|
<dd>This is the number of bytes, which must be recorded
|
|
or provided per second at a certain frame size and rate.
|
|
|
|
<p>
|
|
8000 Hz mono sound with 8 bit (1 byte) samples has a data rate of
|
|
8000 * 1 * 1 = 8 kb/s
|
|
|
|
<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>
|
|
</dd>
|
|
<dt><strong>Period</strong></dt>
|
|
<dd>When the hardware processes data this is done in chunks
|
|
of frames. The time interval between each processing (A/D or D/A
|
|
conversion) is known as the period. The size of the period has
|
|
direct implication on the latency of the sound input or output. For
|
|
low-latency the period size should be very small, while low CPU
|
|
resource usage would usually demand larger period sizes. With ALSA,
|
|
the CPU utilization is not impacted much by the period size, since
|
|
the kernel layer buffers multiple periods internally, so each period
|
|
generates an interrupt and a memory copy, but userspace can be
|
|
slower and read or write multiple periods at the same time.
|
|
|
|
<p>
|
|
</dd>
|
|
<dt><strong>Period size</strong></dt>
|
|
<dd>This is the size of each period in Hz. <em>Not
|
|
bytes, but Hz!.</em> In <tt class="module">alsaaudio</tt> 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>
|
|
|
|
<p>
|
|
Once you understand these concepts, you will be ready to use the PCM
|
|
API. Read on.
|
|
|
|
<p>
|
|
|
|
<div class="navigation">
|
|
<div class='online-navigation'>
|
|
<p></p><hr />
|
|
<table align="center" width="100%" cellpadding="0" cellspacing="2">
|
|
<tr>
|
|
<td class='online-navigation'><a rel="prev" title="4 alsaaudio"
|
|
href="module-alsaaudio.html"><img src='previous.png'
|
|
border='0' height='32' alt='Previous Page' width='32' /></a></td>
|
|
<td class='online-navigation'><a rel="parent" title="4 alsaaudio"
|
|
href="module-alsaaudio.html"><img src='up.png'
|
|
border='0' height='32' alt='Up one Level' width='32' /></a></td>
|
|
<td class='online-navigation'><a rel="next" title="4.2 pcm Objects"
|
|
href="pcm-objects.html"><img src='next.png'
|
|
border='0' height='32' alt='Next Page' width='32' /></a></td>
|
|
<td align="center" width="100%">PyAlsaAudio</td>
|
|
<td class='online-navigation'><a rel="contents" title="Table of Contents"
|
|
href="contents.html"><img src='contents.png'
|
|
border='0' height='32' alt='Contents' width='32' /></a></td>
|
|
<td class='online-navigation'><img src='blank.png'
|
|
border='0' height='32' alt='' width='32' /></td>
|
|
<td class='online-navigation'><img src='blank.png'
|
|
border='0' height='32' alt='' width='32' /></td>
|
|
</tr></table>
|
|
<div class='online-navigation'>
|
|
<b class="navlabel">Previous:</b>
|
|
<a class="sectref" rel="prev" href="module-alsaaudio.html">4 alsaaudio</a>
|
|
<b class="navlabel">Up:</b>
|
|
<a class="sectref" rel="parent" href="module-alsaaudio.html">4 alsaaudio</a>
|
|
<b class="navlabel">Next:</b>
|
|
<a class="sectref" rel="next" href="pcm-objects.html">4.2 PCM Objects</a>
|
|
</div>
|
|
</div>
|
|
<hr />
|
|
<span class="release-info">Release 0.4.</span>
|
|
</div>
|
|
<!--End of Navigation Panel-->
|
|
|
|
</body>
|
|
</html>
|