mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-23 20:58:55 -05:00
80 lines
3.9 KiB
HTML
80 lines
3.9 KiB
HTML
|
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||
|
<html>
|
||
|
<head>
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||
|
<meta name="GENERATOR" content="Mozilla/4.77 [en]C-gatewaynet (Win98; U) [Netscape]">
|
||
|
<meta name="Author" content="Phil Burk">
|
||
|
<meta name="Description" content="Tutorial for PortAudio, a cross platform, open-source, audio I/O library.It provides a very simple API for recording and/or playing sound using a simple callback function.">
|
||
|
<meta name="KeyWords" content="audio, tutorial, library, portable, open-source, DirectSound,sound, music, JSyn, synthesis,">
|
||
|
<title>PortAudio Tutorial</title>
|
||
|
</head>
|
||
|
<body>
|
||
|
|
||
|
<center><table COLS=1 WIDTH="100%" BGCOLOR="#FADA7A" >
|
||
|
<tr>
|
||
|
<td>
|
||
|
<center>
|
||
|
<h1>
|
||
|
PortAudio Tutorial</h1></center>
|
||
|
</td>
|
||
|
</tr>
|
||
|
</table></center>
|
||
|
|
||
|
<h2>
|
||
|
Blocking Read/Write Functions</h2>
|
||
|
|
||
|
<blockquote>[Note: These functions are not part of the official PortAudio
|
||
|
API. They are simply built on top of PortAudio as an extra utility. Also
|
||
|
note that they are under evaluation and their definition may change.]
|
||
|
<p>There are two fundamentally different ways to design an audio API. One
|
||
|
is to use callback functions the way we have already shown. The callback
|
||
|
function operates under an interrupt or background thread This leaves the
|
||
|
foreground application free to do other things while the audio just runs
|
||
|
in the background. But this can sometimes be awkward.
|
||
|
<p>So we have provided an alternative technique that lets a program generate
|
||
|
audio in the foreground and then just write it to the audio stream as if
|
||
|
it was a file. If there is not enough room in the audio buffer for more
|
||
|
data, then the write function will just block until more room is available.
|
||
|
This can make it very easy to write an audio example. To use this tool,
|
||
|
you must add the files "pablio/pablio.c" and "pablio/ringbuffer.c" to your
|
||
|
project. You must also:
|
||
|
<blockquote>
|
||
|
<pre>#include "pablio.h"</pre>
|
||
|
</blockquote>
|
||
|
Here is a short excerpt of a program that opens a stream for input and
|
||
|
output. It then reads a block of samples from input, and writes them to
|
||
|
output, in a loop. The complete example can be found in "pablio/test_rw.c".
|
||
|
<blockquote>
|
||
|
<pre> #define SAMPLES_PER_FRAME (2)
|
||
|
#define FRAMES_PER_BLOCK (1024)
|
||
|
SAMPLE samples[SAMPLES_PER_FRAME * FRAMES_PER_BLOCK];
|
||
|
PaError err;
|
||
|
PABLIO_Stream *aStream;
|
||
|
|
||
|
/* Open simplified blocking I/O layer on top of PortAudio. */
|
||
|
err = OpenAudioStream( &rwbl, SAMPLE_RATE, paFloat32,
|
||
|
(PABLIO_READ_WRITE | PABLIO_STEREO) );
|
||
|
if( err != paNoError ) goto error;
|
||
|
|
||
|
/* Process samples in the foreground. */
|
||
|
for( i=0; i<(NUM_SECONDS * SAMPLE_RATE); i++ )
|
||
|
{
|
||
|
/* Read one block of data into sample array from audio input. */
|
||
|
ReadAudioStream( aStream, samples, FRAMES_PER_BLOCK );
|
||
|
/*
|
||
|
** At this point you could process the data in samples array,
|
||
|
** and write the result back to the same samples array.
|
||
|
*/
|
||
|
/* Write that same frame of data to output. */
|
||
|
WriteAudioStream( aStream, samples, FRAMES_PER_BLOCK );
|
||
|
}
|
||
|
|
||
|
CloseAudioStream( aStream );</pre>
|
||
|
</blockquote>
|
||
|
</blockquote>
|
||
|
<font size=+2><a href="http://www.portaudio.com/">home</a> |
|
||
|
<a href="pa_tutorial.html">contents</a>
|
||
|
| <a href="pa_tut_devs.html">previous</a> | <a href="pa_tut_explore.html">next</a></font>
|
||
|
</body>
|
||
|
</html>
|