mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 23:14:06 +08:00
10 lines
41 KiB
HTML
10 lines
41 KiB
HTML
<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"><sys/soundcard.h></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位音频,大端字节顺序(由68k,PowerPC,Sparc使用)</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">&</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</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"><<</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> |