<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Example: Blocking Mode Audio I/O — PyAudio 0.2.7 documentation</title> <link rel="stylesheet" href="_static/nature.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: '', VERSION: '0.2.7', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <link rel="top" title="PyAudio 0.2.7 documentation" href="index.html" /> </head> <body> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" accesskey="I">index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li><a href="index.html">PyAudio 0.2.7 documentation</a> »</li> </ul> </div> <div class="document"> <div class="documentwrapper"> <div class="body"> <div class="section" id="example-blocking-mode-audio-i-o"> <h1>Example: Blocking Mode Audio I/O<a class="headerlink" href="#example-blocking-mode-audio-i-o" title="Permalink to this headline">¶</a></h1> <div class="highlight-python"><div class="highlight"><pre><span class="sd">"""PyAudio Example: Play a wave file."""</span> <span class="kn">import</span> <span class="nn">pyaudio</span> <span class="kn">import</span> <span class="nn">wave</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="n">CHUNK</span> <span class="o">=</span> <span class="mi">1024</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">"Plays a wave file.</span><span class="se">\n\n</span><span class="s">Usage: </span><span class="si">%s</span><span class="s"> filename.wav"</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">wf</span> <span class="o">=</span> <span class="n">wave</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">'rb'</span><span class="p">)</span> <span class="c"># instantiate PyAudio (1)</span> <span class="n">p</span> <span class="o">=</span> <span class="n">pyaudio</span><span class="o">.</span><span class="n">PyAudio</span><span class="p">()</span> <span class="c"># open stream (2)</span> <span class="n">stream</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">format</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">get_format_from_width</span><span class="p">(</span><span class="n">wf</span><span class="o">.</span><span class="n">getsampwidth</span><span class="p">()),</span> <span class="n">channels</span><span class="o">=</span><span class="n">wf</span><span class="o">.</span><span class="n">getnchannels</span><span class="p">(),</span> <span class="n">rate</span><span class="o">=</span><span class="n">wf</span><span class="o">.</span><span class="n">getframerate</span><span class="p">(),</span> <span class="n">output</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> <span class="c"># read data</span> <span class="n">data</span> <span class="o">=</span> <span class="n">wf</span><span class="o">.</span><span class="n">readframes</span><span class="p">(</span><span class="n">CHUNK</span><span class="p">)</span> <span class="c"># play stream (3)</span> <span class="k">while</span> <span class="n">data</span> <span class="o">!=</span> <span class="s">''</span><span class="p">:</span> <span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="n">data</span> <span class="o">=</span> <span class="n">wf</span><span class="o">.</span><span class="n">readframes</span><span class="p">(</span><span class="n">CHUNK</span><span class="p">)</span> <span class="c"># stop stream (4)</span> <span class="n">stream</span><span class="o">.</span><span class="n">stop_stream</span><span class="p">()</span> <span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c"># close PyAudio (5)</span> <span class="n">p</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span> </pre></div> </div> <p>To use PyAudio, first instantiate PyAudio using <a class="reference internal" href="index.html#pyaudio.PyAudio" title="pyaudio.PyAudio"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.PyAudio()</span></tt></a> (1), which sets up the portaudio system.</p> <p>To record or play audio, open a stream on the desired device with the desired audio parameters using <a class="reference internal" href="index.html#pyaudio.PyAudio.open" title="pyaudio.PyAudio.open"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.PyAudio.open()</span></tt></a> (2). This sets up a <a class="reference internal" href="index.html#pyaudio.Stream" title="pyaudio.Stream"><tt class="xref py py-class docutils literal"><span class="pre">pyaudio.Stream</span></tt></a> to play or record audio.</p> <p>Play audio by writing audio data to the stream using <a class="reference internal" href="index.html#pyaudio.Stream.write" title="pyaudio.Stream.write"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.write()</span></tt></a>, or read audio data from the stream using <a class="reference internal" href="index.html#pyaudio.Stream.read" title="pyaudio.Stream.read"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.read()</span></tt></a>. (3)</p> <p>Note that in “blocking mode”, each <a class="reference internal" href="index.html#pyaudio.Stream.write" title="pyaudio.Stream.write"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.write()</span></tt></a> or <a class="reference internal" href="index.html#pyaudio.Stream.read" title="pyaudio.Stream.read"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.read()</span></tt></a> blocks until all the given/requested frames have been played/recorded. Alternatively, to generate audio data on the fly or immediately process recorded audio data, use the “callback mode” outlined below.</p> <p>Use <a class="reference internal" href="index.html#pyaudio.Stream.stop_stream" title="pyaudio.Stream.stop_stream"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.stop_stream()</span></tt></a> to pause playing/recording, and <a class="reference internal" href="index.html#pyaudio.Stream.close" title="pyaudio.Stream.close"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.close()</span></tt></a> to terminate the stream. (4)</p> <p>Finally, terminate the portaudio session using <a class="reference internal" href="index.html#pyaudio.PyAudio.terminate" title="pyaudio.PyAudio.terminate"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.PyAudio.terminate()</span></tt></a> (5)</p> </div> <div class="section" id="example-callback-mode-audio-i-o"> <h1>Example: Callback Mode Audio I/O<a class="headerlink" href="#example-callback-mode-audio-i-o" title="Permalink to this headline">¶</a></h1> <div class="highlight-python"><div class="highlight"><pre><span class="sd">"""PyAudio Example: Play a wave file (callback version)."""</span> <span class="kn">import</span> <span class="nn">pyaudio</span> <span class="kn">import</span> <span class="nn">wave</span> <span class="kn">import</span> <span class="nn">time</span> <span class="kn">import</span> <span class="nn">sys</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">"Plays a wave file.</span><span class="se">\n\n</span><span class="s">Usage: </span><span class="si">%s</span><span class="s"> filename.wav"</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">wf</span> <span class="o">=</span> <span class="n">wave</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">'rb'</span><span class="p">)</span> <span class="c"># instantiate PyAudio (1)</span> <span class="n">p</span> <span class="o">=</span> <span class="n">pyaudio</span><span class="o">.</span><span class="n">PyAudio</span><span class="p">()</span> <span class="c"># define callback (2)</span> <span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">in_data</span><span class="p">,</span> <span class="n">frame_count</span><span class="p">,</span> <span class="n">time_info</span><span class="p">,</span> <span class="n">status</span><span class="p">):</span> <span class="n">data</span> <span class="o">=</span> <span class="n">wf</span><span class="o">.</span><span class="n">readframes</span><span class="p">(</span><span class="n">frame_count</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">pyaudio</span><span class="o">.</span><span class="n">paContinue</span><span class="p">)</span> <span class="c"># open stream using callback (3)</span> <span class="n">stream</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">format</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">get_format_from_width</span><span class="p">(</span><span class="n">wf</span><span class="o">.</span><span class="n">getsampwidth</span><span class="p">()),</span> <span class="n">channels</span><span class="o">=</span><span class="n">wf</span><span class="o">.</span><span class="n">getnchannels</span><span class="p">(),</span> <span class="n">rate</span><span class="o">=</span><span class="n">wf</span><span class="o">.</span><span class="n">getframerate</span><span class="p">(),</span> <span class="n">output</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">stream_callback</span><span class="o">=</span><span class="n">callback</span><span class="p">)</span> <span class="c"># start the stream (4)</span> <span class="n">stream</span><span class="o">.</span><span class="n">start_stream</span><span class="p">()</span> <span class="c"># wait for stream to finish (5)</span> <span class="k">while</span> <span class="n">stream</span><span class="o">.</span><span class="n">is_active</span><span class="p">():</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span> <span class="c"># stop stream (6)</span> <span class="n">stream</span><span class="o">.</span><span class="n">stop_stream</span><span class="p">()</span> <span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="n">wf</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c"># close PyAudio (7)</span> <span class="n">p</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span> </pre></div> </div> <p>In callback mode, PyAudio will call a specified callback function (2) whenever it needs new audio data (to play) and/or when there is new (recorded) audio data available. Note that PyAudio calls the callback function in a separate thread. The function has the following signature <tt class="docutils literal"><span class="pre">callback(<input_data>,</span> <span class="pre"><frame_count>,</span> <span class="pre"><time_info>,</span> <span class="pre"><status_flag>)</span></tt> and must return a tuple containing <tt class="docutils literal"><span class="pre">frame_count</span></tt> frames of audio data and a flag signifying whether there are more frames to play/record.</p> <p>Start processing the audio stream using <a class="reference internal" href="index.html#pyaudio.Stream.start_stream" title="pyaudio.Stream.start_stream"><tt class="xref py py-func docutils literal"><span class="pre">pyaudio.Stream.start_stream()</span></tt></a> (4), which will call the callback function repeatedly until that function returns <a class="reference internal" href="index.html#pyaudio.paComplete" title="pyaudio.paComplete"><tt class="xref py py-data docutils literal"><span class="pre">pyaudio.paComplete</span></tt></a>.</p> <p>To keep the stream active, the main thread must not terminate, e.g., by sleeping (5).</p> </div> </div> </div> <div class="clearer"></div> </div> <div class="related"> <h3>Navigation</h3> <ul> <li class="right" style="margin-right: 10px"> <a href="genindex.html" title="General Index" >index</a></li> <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li><a href="index.html">PyAudio 0.2.7 documentation</a> »</li> </ul> </div> <div class="footer"> © Copyright 2012, Hubert Pham. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3. </div> </body> </html>