uTools-Manuals/docs/python/ossaudiodev.html
2019-04-21 11:50:48 +08:00

10 lines
41 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-ossaudiodev"><h1><span class="yiyi-st" id="yiyi-10">22.9. <a class="reference internal" href="#module-ossaudiodev" title="ossaudiodev: Access to OSS-compatible audio devices. (Linux, FreeBSD)"><code class="xref py py-mod docutils literal"><span class="pre">ossaudiodev</span></code></a> - 访问与OSS兼容的音频设备</span></h1><p><span class="yiyi-st" id="yiyi-11">此模块允许您访问OSS开放声音系统音频接口。</span><span class="yiyi-st" id="yiyi-12">OSS可用于广泛的开源和商业版本是Linux和最新版本的FreeBSD的标准音频接口。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-13"><span class="versionmodified">在版本3.3中更改:</span>此模块中的操作现已引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>其中<a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal"><span class="pre">IOError</span></code></a>被引发。</span></p></div><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-14">也可以看看</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-15"><a class="reference external" href="http://www.opensound.com/pguide/oss.pdf">打开音响系统程序员指南</a></span></dt><dd><span class="yiyi-st" id="yiyi-16">OSS C API的官方文档</span></dd></dl><p class="last"><span class="yiyi-st" id="yiyi-17">该模块定义了由OSS设备驱动程序提供的大量常量请参阅<code class="docutils literal"><span class="pre">&lt;sys/soundcard.h&gt;</span></code>在Linux或FreeBSD上的列表。</span></p></div><p><span class="yiyi-st" id="yiyi-18"><a class="reference internal" href="#module-ossaudiodev" title="ossaudiodev: Access to OSS-compatible audio devices. (Linux, FreeBSD)"><code class="xref py py-mod docutils literal"><span class="pre">ossaudiodev</span></code></a>定义以下变量和函数:</span></p><dl class="exception"><dt id="ossaudiodev.OSSAudioError"><span class="yiyi-st" id="yiyi-19"> <em class="property">exception </em><code class="descclassname">ossaudiodev.</code><code class="descname">OSSAudioError</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-20">对某些错误引发此异常。</span><span class="yiyi-st" id="yiyi-21">参数是一个描述错误的字符串。</span></p><p><span class="yiyi-st" id="yiyi-22">(If <a class="reference internal" href="#module-ossaudiodev" title="ossaudiodev: Access to OSS-compatible audio devices. (Linux, FreeBSD)"><code class="xref py py-mod docutils literal"><span class="pre">ossaudiodev</span></code></a> receives an error from a system call such as <code class="xref c c-func docutils literal"><span class="pre">open()</span></code>, <code class="xref c c-func docutils literal"><span class="pre">write()</span></code>, or <code class="xref c c-func docutils literal"><span class="pre">ioctl()</span></code>, it raises <a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>. </span><span class="yiyi-st" id="yiyi-23"><a class="reference internal" href="#module-ossaudiodev" title="ossaudiodev: Access to OSS-compatible audio devices. (Linux, FreeBSD)"><code class="xref py py-mod docutils literal"><span class="pre">ossaudiodev</span></code></a>直接检测到的错误会导致<a class="reference internal" href="#ossaudiodev.OSSAudioError" title="ossaudiodev.OSSAudioError"><code class="xref py py-exc docutils literal"><span class="pre">OSSAudioError</span></code></a>。)</span></p><p><span class="yiyi-st" id="yiyi-24">(为了向后兼容,异常类也可用作<code class="docutils literal"><span class="pre">ossaudiodev.error</span></code>。)</span></p></dd></dl><dl class="function"><dt id="ossaudiodev.open"><span class="yiyi-st" id="yiyi-25"> <code class="descclassname">ossaudiodev.</code><code class="descname">open</code><span class="sig-paren">(</span><em>mode</em><span class="sig-paren">)</span></span></dt><dt><span class="yiyi-st" id="yiyi-26"><code class="descclassname">ossaudiodev.</code><code class="descname">open</code><span class="sig-paren">(</span><em>device</em>, <em>mode</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-27">打开音频设备并返回OSS音频设备对象。</span><span class="yiyi-st" id="yiyi-28">此对象支持许多类似文件的方法,例如<code class="xref py py-meth docutils literal"><span class="pre">read()</span></code><code class="xref py py-meth docutils literal"><span class="pre">write()</span></code><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code>在常规的Unix读/写语义和OSS音频设备的语义之间</span><span class="yiyi-st" id="yiyi-29">它还支持许多音频专用方法;请参阅下面的完整方法列表。</span></p><p><span class="yiyi-st" id="yiyi-30"><em>设备</em>是要使用的音频设备文件名。</span><span class="yiyi-st" id="yiyi-31">如果未指定,则此模块首先在环境变量<span class="target" id="index-0"></span> <code class="xref std std-envvar docutils literal"><span class="pre">AUDIODEV</span></code>中查找要使用的设备。</span><span class="yiyi-st" id="yiyi-32">如果未找到,它会返回到<code class="file docutils literal"><span class="pre">/dev/dsp</span></code></span></p><p><span class="yiyi-st" id="yiyi-33"><em>mode</em> is one of <code class="docutils literal"><span class="pre">'r'</span></code> for read-only (record) access, <code class="docutils literal"><span class="pre">'w'</span></code> for write-only (playback) access and <code class="docutils literal"><span class="pre">'rw'</span></code> for both. </span><span class="yiyi-st" id="yiyi-34">由于许多声卡只允许一个进程一次打开录音机或播放器,因此最好只为需要的活动打开设备。</span><span class="yiyi-st" id="yiyi-35">此外,一些声卡是半双工的:它们可以打开以进行读取或写入,但不能同时打开。</span></p><p><span class="yiyi-st" id="yiyi-36">注意不寻常的调用语法:<em>第一</em>参数是可选的,第二个是必需的。</span><span class="yiyi-st" id="yiyi-37">这是一个与旧的<code class="xref py py-mod docutils literal"><span class="pre">linuxaudiodev</span></code>模块兼容的历史工件,<a class="reference internal" href="#module-ossaudiodev" title="ossaudiodev: Access to OSS-compatible audio devices. (Linux, FreeBSD)"><code class="xref py py-mod docutils literal"><span class="pre">ossaudiodev</span></code></a>取代。</span></p></dd></dl><dl class="function"><dt id="ossaudiodev.openmixer"><span class="yiyi-st" id="yiyi-38"> <code class="descclassname">ossaudiodev.</code><code class="descname">openmixer</code><span class="sig-paren">(</span><span class="optional">[</span><em>device</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-39">打开混音器设备并返回OSS混音器设备对象。</span><span class="yiyi-st" id="yiyi-40"><em>设备</em>是要使用的混合设备文件名。</span><span class="yiyi-st" id="yiyi-41">如果未指定,则此模块首先在环境变量<span class="target" id="index-1"></span> <code class="xref std std-envvar docutils literal"><span class="pre">MIXERDEV</span></code>中查找要使用的设备。</span><span class="yiyi-st" id="yiyi-42">如果找不到,它会回到<code class="file docutils literal"><span class="pre">/dev/mixer</span></code></span></p></dd></dl><div class="section" id="audio-device-objects"><h2><span class="yiyi-st" id="yiyi-43">22.9.1. </span><span class="yiyi-st" id="yiyi-44">Audio Device Objects</span></h2><p><span class="yiyi-st" id="yiyi-45">在对音频设备进行写入或读取之前,必须按正确的顺序调用三种方法:</span></p><ol class="arabic simple"><li><span class="yiyi-st" id="yiyi-46"><code class="xref py py-meth docutils literal"><span class="pre">setfmt()</span></code>设置输出格式</span></li><li><span class="yiyi-st" id="yiyi-47"><code class="xref py py-meth docutils literal"><span class="pre">channels()</span></code>设置通道数</span></li><li><span class="yiyi-st" id="yiyi-48"><code class="xref py py-meth docutils literal"><span class="pre">speed()</span></code>设置采样率</span></li></ol><p><span class="yiyi-st" id="yiyi-49">或者,您可以使用<code class="xref py py-meth docutils literal"><span class="pre">setparameters()</span></code>方法同时设置所有三个音频参数。</span><span class="yiyi-st" id="yiyi-50">这更方便,但在所有情况下可能不那么灵活。</span></p><p><span class="yiyi-st" id="yiyi-51"><a class="reference internal" href="#ossaudiodev.open" title="ossaudiodev.open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>返回的音频设备对象定义以下方法和(只读)属性:</span></p><dl class="method"><dt id="ossaudiodev.oss_audio_device.close"><span class="yiyi-st" id="yiyi-52"> <code class="descclassname">oss_audio_device.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">显式关闭音频设备。</span><span class="yiyi-st" id="yiyi-54">当您完成对音频设备的写入或读取时,应该明确地关闭它。</span><span class="yiyi-st" id="yiyi-55">闭合的设备不能再次使用。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.fileno"><span class="yiyi-st" id="yiyi-56"> <code class="descclassname">oss_audio_device.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-57">返回与设备关联的描述器。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.read"><span class="yiyi-st" id="yiyi-58"> <code class="descclassname">oss_audio_device.</code><code class="descname">read</code><span class="sig-paren">(</span><em>size</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-59">从音频输入读取<em>size</em>个字节并将它们作为Python字符串返回。</span><span class="yiyi-st" id="yiyi-60">与大多数Unix设备驱动程序不同处于阻塞模式的OSS音频设备默认会阻塞<a class="reference internal" href="#ossaudiodev.oss_audio_device.read" title="ossaudiodev.oss_audio_device.read"><code class="xref py py-func docutils literal"><span class="pre">read()</span></code></a>,直到所有请求的数据量都可用。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.write"><span class="yiyi-st" id="yiyi-61"> <code class="descclassname">oss_audio_device.</code><code class="descname">write</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-62">向音频设备写入<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a> <em>data</em>并返回写入的字节数。</span><span class="yiyi-st" id="yiyi-63">如果音频设备处于阻塞模式默认则总是写入整个数据同样这与通常的Unix设备语义不同</span><span class="yiyi-st" id="yiyi-64">如果设备处于非阻塞模式,可能无法写入某些数据 - 请参阅<a class="reference internal" href="#ossaudiodev.oss_audio_device.writeall" title="ossaudiodev.oss_audio_device.writeall"><code class="xref py py-meth docutils literal"><span class="pre">writeall()</span></code></a></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-65"><span class="versionmodified">在版本3.5中已更改:</span>可写入<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a>现已接受。</span></p></div></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.writeall"><span class="yiyi-st" id="yiyi-66"> <code class="descclassname">oss_audio_device.</code><code class="descname">writeall</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-67">Write a <a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a> <em>data</em> to the audio device: waits until the audio device is able to accept data, writes as much data as it will accept, and repeats until <em>data</em> has been completely written. </span><span class="yiyi-st" id="yiyi-68">如果器件处于阻塞模式(默认值),这与<a class="reference internal" href="#ossaudiodev.oss_audio_device.write" title="ossaudiodev.oss_audio_device.write"><code class="xref py py-meth docutils literal"><span class="pre">write()</span></code></a>具有相同的效果; <a class="reference internal" href="#ossaudiodev.oss_audio_device.writeall" title="ossaudiodev.oss_audio_device.writeall"><code class="xref py py-meth docutils literal"><span class="pre">writeall()</span></code></a>仅在非阻塞模式下有用。</span><span class="yiyi-st" id="yiyi-69">没有返回值,因为写入的数据量总是等于提供的数据量。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-70"><span class="versionmodified">在版本3.5中已更改:</span>可写入<a class="reference internal" href="../glossary.html#term-bytes-like-object"><span class="xref std std-term">bytes-like object</span></a>现已接受。</span></p></div></dd></dl><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-71"><span class="versionmodified">在版本3.2中更改:</span>音频设备对象也支持上下文管理协议,即</span><span class="yiyi-st" id="yiyi-72">它们可以在<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句中使用。</span></p></div><p><span class="yiyi-st" id="yiyi-73">以下方法均映射到正好一个<code class="xref c c-func docutils literal"><span class="pre">ioctl()</span></code>系统调用。</span><span class="yiyi-st" id="yiyi-74">对应是显而易见的:例如,<code class="xref py py-meth docutils literal"><span class="pre">setfmt()</span></code>对应于<code class="docutils literal"><span class="pre">SNDCTL_DSP_SETFMT</span></code> ioctl和<code class="xref py py-meth docutils literal"><span class="pre">sync()</span></code><code class="docutils literal"><span class="pre">SNDCTL_DSP_SYNC</span></code></span><span class="yiyi-st" id="yiyi-75">如果底层<code class="xref c c-func docutils literal"><span class="pre">ioctl()</span></code>失败,它们都引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a></span></p><dl class="method"><dt id="ossaudiodev.oss_audio_device.nonblock"><span class="yiyi-st" id="yiyi-76"> <code class="descclassname">oss_audio_device.</code><code class="descname">nonblock</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-77">将设备置于非阻塞模式。</span><span class="yiyi-st" id="yiyi-78">一旦处于非阻塞模式,就无法将其返回到阻塞模式。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.getfmts"><span class="yiyi-st" id="yiyi-79"> <code class="descclassname">oss_audio_device.</code><code class="descname">getfmts</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-80">返回声卡支持的音频输出格式的位掩码。</span><span class="yiyi-st" id="yiyi-81">OSS支持的一些格式如下</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-82">格式</span></th><th class="head"><span class="yiyi-st" id="yiyi-83">描述</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-84"><code class="xref py py-const docutils literal"><span class="pre">AFMT_MU_LAW</span></code></span></td><td><span class="yiyi-st" id="yiyi-85">对数编码由Sun <code class="docutils literal"><span class="pre">.au</span></code>文件和<code class="file docutils literal"><span class="pre">/dev/audio</span></code>使用)</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-86"><code class="xref py py-const docutils literal"><span class="pre">AFMT_A_LAW</span></code></span></td><td><span class="yiyi-st" id="yiyi-87">对数编码</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-88"><code class="xref py py-const docutils literal"><span class="pre">AFMT_IMA_ADPCM</span></code></span></td><td><span class="yiyi-st" id="yiyi-89">由交互式多媒体协会定义的4:1压缩格式</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-90"><code class="xref py py-const docutils literal"><span class="pre">AFMT_U8</span></code></span></td><td><span class="yiyi-st" id="yiyi-91">无符号8位音频</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-92"><code class="xref py py-const docutils literal"><span class="pre">AFMT_S16_LE</span></code></span></td><td><span class="yiyi-st" id="yiyi-93">有符号16位音频小端字节顺序由英特尔处理器使用</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-94"><code class="xref py py-const docutils literal"><span class="pre">AFMT_S16_BE</span></code></span></td><td><span class="yiyi-st" id="yiyi-95">带符号16位音频大端字节顺序由68kPowerPCSparc使用</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-96"><code class="xref py py-const docutils literal"><span class="pre">AFMT_S8</span></code></span></td><td><span class="yiyi-st" id="yiyi-97">有签名8位音频</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-98"><code class="xref py py-const docutils literal"><span class="pre">AFMT_U16_LE</span></code></span></td><td><span class="yiyi-st" id="yiyi-99">无符号16位小端音频</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-100"><code class="xref py py-const docutils literal"><span class="pre">AFMT_U16_BE</span></code></span></td><td><span class="yiyi-st" id="yiyi-101">无符号16位大端音频</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-102">有关音频格式的完整列表请参阅OSS文档并注意大多数设备仅支持这些格式的一部分。</span><span class="yiyi-st" id="yiyi-103">某些旧版设备只支持<code class="xref py py-const docutils literal"><span class="pre">AFMT_U8</span></code>;现在最常用的格式是<code class="xref py py-const docutils literal"><span class="pre">AFMT_S16_LE</span></code></span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.setfmt"><span class="yiyi-st" id="yiyi-104"> <code class="descclassname">oss_audio_device.</code><code class="descname">setfmt</code><span class="sig-paren">(</span><em>format</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-105">尝试将当前音频格式设置为<em>格式</em> - see <a class="reference internal" href="#ossaudiodev.oss_audio_device.getfmts" title="ossaudiodev.oss_audio_device.getfmts"><code class="xref py py-meth docutils literal"><span class="pre">getfmts()</span></code></a>以获取列表。</span><span class="yiyi-st" id="yiyi-106">返回设备设置为的音频格式,可能不是请求的格式。</span><span class="yiyi-st" id="yiyi-107">也可以用于返回当前音频格式 - 通过传递<code class="xref py py-const docutils literal"><span class="pre">AFMT_QUERY</span></code>的“音频格式”执行此操作。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.channels"><span class="yiyi-st" id="yiyi-108"> <code class="descclassname">oss_audio_device.</code><code class="descname">channels</code><span class="sig-paren">(</span><em>nchannels</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-109">将输出通道的数量设置为<em>nchannels</em></span><span class="yiyi-st" id="yiyi-110">值1表示单声道声音2表示立体声。</span><span class="yiyi-st" id="yiyi-111">一些设备可能具有多于2个通道并且一些高端设备可能不支持单声道。</span><span class="yiyi-st" id="yiyi-112">返回设备设置的通道数。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.speed"><span class="yiyi-st" id="yiyi-113"> <code class="descclassname">oss_audio_device.</code><code class="descname">speed</code><span class="sig-paren">(</span><em>samplerate</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-114">尝试将音频采样率设置为每秒<em>samplerate</em>个样本。</span><span class="yiyi-st" id="yiyi-115">返回实际设置的速率。</span><span class="yiyi-st" id="yiyi-116">大多数声音设备不支持任意采样率。</span><span class="yiyi-st" id="yiyi-117">常用价格为:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-118"></span></th><th class="head"><span class="yiyi-st" id="yiyi-119">描述</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-120">8000</span></td><td><span class="yiyi-st" id="yiyi-121"><code class="file docutils literal"><span class="pre">/dev/audio</span></code>的默认速率</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-122">11025</span></td><td><span class="yiyi-st" id="yiyi-123">语音记录</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-124">22050</span></td><td></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-125">44100</span></td><td><span class="yiyi-st" id="yiyi-126">CD质量音频16位/样本和2通道</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-127">96000</span></td><td><span class="yiyi-st" id="yiyi-128">DVD质量音频24位/采样)</span></td></tr></tbody></table></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.sync"><span class="yiyi-st" id="yiyi-129"> <code class="descclassname">oss_audio_device.</code><code class="descname">sync</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-130">等待声音设备播放其缓冲区中的每个字节。</span><span class="yiyi-st" id="yiyi-131">(这种情况在设备关闭时隐式发生。)</span><span class="yiyi-st" id="yiyi-132">OSS文档建议关闭并重新打开设备而不要使用<a class="reference internal" href="#ossaudiodev.oss_audio_device.sync" title="ossaudiodev.oss_audio_device.sync"><code class="xref py py-meth docutils literal"><span class="pre">sync()</span></code></a></span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.reset"><span class="yiyi-st" id="yiyi-133"> <code class="descclassname">oss_audio_device.</code><code class="descname">reset</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-134">立即停止播放或录制并将设备恢复到可以接受命令的状态。</span><span class="yiyi-st" id="yiyi-135">OSS文档建议在调用<a class="reference internal" href="#ossaudiodev.oss_audio_device.reset" title="ossaudiodev.oss_audio_device.reset"><code class="xref py py-meth docutils literal"><span class="pre">reset()</span></code></a>后关闭并重新打开设备。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.post"><span class="yiyi-st" id="yiyi-136"> <code class="descclassname">oss_audio_device.</code><code class="descname">post</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-137">告诉驾驶员输出可能有暂停,使得设备可以更智能地处理暂停。</span><span class="yiyi-st" id="yiyi-138">您可以在播放点音效之后等待用户输入之前或在执行磁盘I / O之前使用此功能。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-139">以下方便方法组合几个ioctl或一个ioctl和一些简单的计算。</span></p><dl class="method"><dt id="ossaudiodev.oss_audio_device.setparameters"><span class="yiyi-st" id="yiyi-140"> <code class="descclassname">oss_audio_device.</code><code class="descname">setparameters</code><span class="sig-paren">(</span><em>format</em>, <em>nchannels</em>, <em>samplerate</em><span class="optional">[</span>, <em>strict=False</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-141">在一个方法调用中设置关键音频采样参数 - 采样格式,通道数和采样率。</span><span class="yiyi-st" id="yiyi-142"><em>format</em>, <em>nchannels</em>, and <em>samplerate</em> should be as specified in the <a class="reference internal" href="#ossaudiodev.oss_audio_device.setfmt" title="ossaudiodev.oss_audio_device.setfmt"><code class="xref py py-meth docutils literal"><span class="pre">setfmt()</span></code></a>, <a class="reference internal" href="#ossaudiodev.oss_audio_device.channels" title="ossaudiodev.oss_audio_device.channels"><code class="xref py py-meth docutils literal"><span class="pre">channels()</span></code></a>, and <a class="reference internal" href="#ossaudiodev.oss_audio_device.speed" title="ossaudiodev.oss_audio_device.speed"><code class="xref py py-meth docutils literal"><span class="pre">speed()</span></code></a> methods. </span><span class="yiyi-st" id="yiyi-143">如果<em>严格</em>为真,则<a class="reference internal" href="#ossaudiodev.oss_audio_device.setparameters" title="ossaudiodev.oss_audio_device.setparameters"><code class="xref py py-meth docutils literal"><span class="pre">setparameters()</span></code></a>检查每个参数是否实际设置为请求的值,如果不是,则引发<a class="reference internal" href="#ossaudiodev.OSSAudioError" title="ossaudiodev.OSSAudioError"><code class="xref py py-exc docutils literal"><span class="pre">OSSAudioError</span></code></a></span><span class="yiyi-st" id="yiyi-144">返回表示设备驱动程序实际设置的参数值的元组(<em>格式</em><em>nchannels</em><em>samplerate</em>)(即,返回值<a class="reference internal" href="#ossaudiodev.oss_audio_device.setfmt" title="ossaudiodev.oss_audio_device.setfmt"><code class="xref py py-meth docutils literal"><span class="pre">setfmt()</span></code></a><a class="reference internal" href="#ossaudiodev.oss_audio_device.channels" title="ossaudiodev.oss_audio_device.channels"><code class="xref py py-meth docutils literal"><span class="pre">channels()</span></code></a><a class="reference internal" href="#ossaudiodev.oss_audio_device.speed" title="ossaudiodev.oss_audio_device.speed"><code class="xref py py-meth docutils literal"><span class="pre">speed()</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-145">例如,</span></p><pre><code class="language-python"><span></span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="n">channels</span><span class="p">,</span> <span class="n">rate</span><span class="p">)</span> <span class="o">=</span> <span class="n">dsp</span><span class="o">.</span><span class="n">setparameters</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="n">channels</span><span class="p">,</span> <span class="n">rate</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-146">相当于</span></p><pre><code class="language-python"><span></span><span class="n">fmt</span> <span class="o">=</span> <span class="n">dsp</span><span class="o">.</span><span class="n">setfmt</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span>
<span class="n">channels</span> <span class="o">=</span> <span class="n">dsp</span><span class="o">.</span><span class="n">channels</span><span class="p">(</span><span class="n">channels</span><span class="p">)</span>
<span class="n">rate</span> <span class="o">=</span> <span class="n">dsp</span><span class="o">.</span><span class="n">rate</span><span class="p">(</span><span class="n">rate</span><span class="p">)</span>
</code></pre></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.bufsize"><span class="yiyi-st" id="yiyi-147"> <code class="descclassname">oss_audio_device.</code><code class="descname">bufsize</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-148">返回采样中硬件缓冲区的大小。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.obufcount"><span class="yiyi-st" id="yiyi-149"> <code class="descclassname">oss_audio_device.</code><code class="descname">obufcount</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-150">返回在硬件缓冲区中尚未播放的样本数。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_audio_device.obuffree"><span class="yiyi-st" id="yiyi-151"> <code class="descclassname">oss_audio_device.</code><code class="descname">obuffree</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-152">返回可以排队进入硬件缓冲区以在无阻塞的情况下播放的样本数。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-153">音频设备对象还支持几个只读属性:</span></p><dl class="attribute"><dt id="ossaudiodev.oss_audio_device.closed"><span class="yiyi-st" id="yiyi-154"> <code class="descclassname">oss_audio_device.</code><code class="descname">closed</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-155">布尔值,表示设备是否已关闭。</span></p></dd></dl><dl class="attribute"><dt id="ossaudiodev.oss_audio_device.name"><span class="yiyi-st" id="yiyi-156"> <code class="descclassname">oss_audio_device.</code><code class="descname">name</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-157">包含设备文件名称的字符串。</span></p></dd></dl><dl class="attribute"><dt id="ossaudiodev.oss_audio_device.mode"><span class="yiyi-st" id="yiyi-158"> <code class="descclassname">oss_audio_device.</code><code class="descname">mode</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-159">文件的I / O模式<code class="docutils literal"><span class="pre">"r"</span></code><code class="docutils literal"><span class="pre">"rw"</span></code><code class="docutils literal"><span class="pre">"w"</span></code></span></p></dd></dl></div><div class="section" id="mixer-device-objects"><h2><span class="yiyi-st" id="yiyi-160">22.9.2. </span><span class="yiyi-st" id="yiyi-161">Mixer Device Objects</span></h2><p><span class="yiyi-st" id="yiyi-162">混音器对象提供两个类文件方法:</span></p><dl class="method"><dt id="ossaudiodev.oss_mixer_device.close"><span class="yiyi-st" id="yiyi-163"> <code class="descclassname">oss_mixer_device.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-164">此方法关闭打开的混音器设备文件。</span><span class="yiyi-st" id="yiyi-165">在此文件关闭后任何进一步尝试使用混合器将引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a></span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.fileno"><span class="yiyi-st" id="yiyi-166"> <code class="descclassname">oss_mixer_device.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-167">返回打开的混音器设备文件的文件句柄号。</span></p></dd></dl><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-168"><span class="versionmodified">在版本3.2中更改:</span>混合器对象也支持上下文管理协议。</span></p></div><p><span class="yiyi-st" id="yiyi-169">其余的方法是特定于音频混合:</span></p><dl class="method"><dt id="ossaudiodev.oss_mixer_device.controls"><span class="yiyi-st" id="yiyi-170"> <code class="descclassname">oss_mixer_device.</code><code class="descname">controls</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-171">此方法返回指定可用混频器控制的位掩码“Control”是特定可混频“通道”例如<code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_PCM</span></code><code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_SYNTH</span></code>)。</span><span class="yiyi-st" id="yiyi-172">该位掩码指示所有可用混频器控制的子集 - 在模块级定义的<code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_*</span></code>常量。</span><span class="yiyi-st" id="yiyi-173">要确定例如当前混音器对象是否支持PCM混音器请使用以下Python代码</span></p><pre><code class="language-python"><span></span><span class="n">mixer</span><span class="o">=</span><span class="n">ossaudiodev</span><span class="o">.</span><span class="n">openmixer</span><span class="p">()</span>
<span class="k">if</span> <span class="n">mixer</span><span class="o">.</span><span class="n">controls</span><span class="p">()</span> <span class="o">&amp;</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">ossaudiodev</span><span class="o">.</span><span class="n">SOUND_MIXER_PCM</span><span class="p">):</span>
<span class="c1"># PCM is supported</span>
<span class="o">...</span> <span class="n">code</span> <span class="o">...</span>
</code></pre><p><span class="yiyi-st" id="yiyi-174">对于大多数用途,<code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_VOLUME</span></code>(主音量)和<code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_PCM</span></code>控制应该足够了 - 但是当选择混频器控制时,使用混频器的代码应该是灵活的。</span><span class="yiyi-st" id="yiyi-175">例如在Gravis Ultrasound上<code class="xref py py-const docutils literal"><span class="pre">SOUND_MIXER_VOLUME</span></code>不存在。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.stereocontrols"><span class="yiyi-st" id="yiyi-176"> <code class="descclassname">oss_mixer_device.</code><code class="descname">stereocontrols</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-177">返回指示立体声混音器控制的位掩码。</span><span class="yiyi-st" id="yiyi-178">如果一个位被置位,则相应的控制是立体声;如果未设置,则控制是单声道的或不受混频器支持(与<a class="reference internal" href="#ossaudiodev.oss_mixer_device.controls" title="ossaudiodev.oss_mixer_device.controls"><code class="xref py py-meth docutils literal"><span class="pre">controls()</span></code></a>组合使用以确定哪个)。</span></p><p><span class="yiyi-st" id="yiyi-179">有关从位掩码获取数据的示例,请参阅<a class="reference internal" href="#ossaudiodev.oss_mixer_device.controls" title="ossaudiodev.oss_mixer_device.controls"><code class="xref py py-meth docutils literal"><span class="pre">controls()</span></code></a>函数的代码示例。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.reccontrols"><span class="yiyi-st" id="yiyi-180"> <code class="descclassname">oss_mixer_device.</code><code class="descname">reccontrols</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-181">返回指定可用于记录的混音器控制的位掩码。</span><span class="yiyi-st" id="yiyi-182">有关从位掩码读取的示例,请参阅<a class="reference internal" href="#ossaudiodev.oss_mixer_device.controls" title="ossaudiodev.oss_mixer_device.controls"><code class="xref py py-meth docutils literal"><span class="pre">controls()</span></code></a>的代码示例。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.get"><span class="yiyi-st" id="yiyi-183"> <code class="descclassname">oss_mixer_device.</code><code class="descname">get</code><span class="sig-paren">(</span><em>control</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-184">返回给定混频器控制的音量。</span><span class="yiyi-st" id="yiyi-185">返回的卷是2元组<code class="docutils literal"><span class="pre">(left_volume,right_volume)</span></code></span><span class="yiyi-st" id="yiyi-186">卷指定为从0无声到100全卷的数字。</span><span class="yiyi-st" id="yiyi-187">如果控制是单声道仍然返回2元组但是两个卷是相同的。</span></p><p><span class="yiyi-st" id="yiyi-188">如果指定了无效控件,则引发<a class="reference internal" href="#ossaudiodev.OSSAudioError" title="ossaudiodev.OSSAudioError"><code class="xref py py-exc docutils literal"><span class="pre">OSSAudioError</span></code></a>,如果指定了不支持的控件,则引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a></span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.set"><span class="yiyi-st" id="yiyi-189"> <code class="descclassname">oss_mixer_device.</code><code class="descname">set</code><span class="sig-paren">(</span><em>control</em>, <em>(left</em>, <em>right)</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-190">将给定混频器控制的音量设置为<code class="docutils literal"><span class="pre">(left,right)</span></code></span><span class="yiyi-st" id="yiyi-191"><code class="docutils literal"><span class="pre">left</span></code><code class="docutils literal"><span class="pre">right</span></code>必须为int介于0无声和100全音量之间。</span><span class="yiyi-st" id="yiyi-192">成功后新卷将作为2元组返回。</span><span class="yiyi-st" id="yiyi-193">请注意,这可能与指定的音量不完全相同,因为某些声卡的混音器的分辨率有限。</span></p><p><span class="yiyi-st" id="yiyi-194">如果指定了无效的混合器控件或指定的卷超出范围,则引发<a class="reference internal" href="#ossaudiodev.OSSAudioError" title="ossaudiodev.OSSAudioError"><code class="xref py py-exc docutils literal"><span class="pre">OSSAudioError</span></code></a></span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.get_recsrc"><span class="yiyi-st" id="yiyi-195"> <code class="descclassname">oss_mixer_device.</code><code class="descname">get_recsrc</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-196">此方法返回位掩码,指示当前正在使用哪些控制作为记录源。</span></p></dd></dl><dl class="method"><dt id="ossaudiodev.oss_mixer_device.set_recsrc"><span class="yiyi-st" id="yiyi-197"> <code class="descclassname">oss_mixer_device.</code><code class="descname">set_recsrc</code><span class="sig-paren">(</span><em>bitmask</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-198">调用此函数指定记录源。</span><span class="yiyi-st" id="yiyi-199">如果成功,返回指示新记录源(或多个源)的位掩码;如果指定了无效的源,则引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a></span><span class="yiyi-st" id="yiyi-200">要将当前录音来源设置为麦克风输入:</span></p><pre><code class="language-python"><span></span><span class="n">mixer</span><span class="o">.</span><span class="n">setrecsrc</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">ossaudiodev</span><span class="o">.</span><span class="n">SOUND_MIXER_MIC</span><span class="p">)</span>
</code></pre></dd></dl></div></div></div>