52 lines
27 KiB
HTML
52 lines
27 KiB
HTML
<!DOCTYPE html>
|
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=0.8"/><title>flac-decoder</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="racket.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-racket.css" title="default"/><script type="text/javascript" src="scribble-common.js"></script><script type="text/javascript" src="manual-racket.js"></script></head><body id="scribble-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,"tocview_0");">►</a></td><td></td><td><a href="" class="tocviewselflink" data-pltdoc="x">flac-<wbr></wbr>decoder</a></td></tr></table></div><div class="tocviewsublistonly" style="display: none;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1 </td><td><a href="#%28part._.Procedures%29" class="tocviewlink" data-pltdoc="x">Procedures</a></td></tr><tr><td align="right">2 </td><td><a href="#%28part._.Diagnostic_bindings%29" class="tocviewlink" data-pltdoc="x">Diagnostic bindings</a></td></tr><tr><td align="right">3 </td><td><a href="#%28part._.Notes%29" class="tocviewlink" data-pltdoc="x">Notes</a></td></tr></table></div></div></div><div class="tocsub"><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber"></span><a href="#%28part._flac-decoder%29" class="tocsubseclink" data-pltdoc="x">flac-<wbr></wbr>decoder</a></td></tr><tr><td><span class="tocsublinknumber">1<span class="stt"> </span></span><a href="#%28part._.Procedures%29" class="tocsubseclink" data-pltdoc="x">Procedures</a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._flac-open%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-<wbr></wbr>open</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._flac-stream-state%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-<wbr></wbr>stream-<wbr></wbr>state</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._flac-read%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-<wbr></wbr>read</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._flac-read-meta%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-<wbr></wbr>read-<wbr></wbr>meta</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._flac-stop%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-<wbr></wbr>stop</span></span></span></a></td></tr><tr><td><span class="tocsublinknumber">2<span class="stt"> </span></span><a href="#%28part._.Diagnostic_bindings%29" class="tocsubseclink" data-pltdoc="x">Diagnostic bindings</a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._kinds%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">kinds</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._last-buffer%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">last-<wbr></wbr>buffer</span></span></span></a></td></tr><tr><td><a href="#%28def._%28%2Fhome%2Fhans%2Fsrc%2Fracket%2Fracket-sound%2Fscrbl%2Fflac-decoder..rkt._last-buf-len%29%29" class="tocsubnonseclink" data-pltdoc="x"><span class="RktSym"><span class="badlink"><span class="RktValLink">last-<wbr></wbr>buf-<wbr></wbr>len</span></span></span></a></td></tr><tr><td><span class="tocsublinknumber">3<span class="stt"> </span></span><a href="#%28part._.Notes%29" class="tocsubseclink" data-pltdoc="x">Notes</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="versionNoNav">9.1</span></div><section class="SsectionLevel1" id="section 0"><h1 class="heading"><a name="(part._flac-decoder)"></a><a name="(mod-path._.'flac-decoder..rkt.')"></a>flac-decoder<span class="button-group"><a href="#(part._flac-decoder)" class="heading-anchor" title="Link to here">🔗</a><span style="visibility: hidden"> </span></span></h1><div class="SAuthorListBox"><div class="SAuthorList"><p class="author">Hans Dijkema <<a href="mailto:hans@dijkewijk.nl">hans@dijkewijk.nl</a>></p></div></div><p><table cellspacing="0" cellpadding="0" class="defmodule"><tr><td align="left"><span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/require.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._require%29%29" class="RktStxLink" data-pltdoc="x">require</a></span><span class="stt"> </span><span class="RktVal">"flac-decoder.rkt"</span><span class="RktPn">)</span></td><td align="right"><span class="RpackageSpec"><span class="Smaller"> package:</span> <a href="https://pkgs.racket-lang.org/package/base" title="Install this package using `raco pkg install base`"><span class="stt">base</span></a></span></td></tr></table></p><p>This module provides a small decoder interface on top of the FLAC
|
|
FFI layer. It opens a decoder for a file, reads stream metadata,
|
|
reads audio frames, exposes the current decoder state, and allows
|
|
an active read loop to be stopped. It also re-exports the bindings
|
|
from <span class="RktVal">"flac-definitions.rkt"</span>.</p><p>A decoder handle stores the native decoder handler together with
|
|
optional callbacks for stream metadata and decoded audio.</p><section class="SsectionLevel2" id="section 1"><h2 class="heading">1<span class="stt"> </span><a name="(part._.Procedures)"></a>Procedures<span class="button-group"><a href="#(part._.Procedures)" class="heading-anchor" title="Link to here">🔗</a><span style="visibility: hidden"> </span></span></h2><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._flac-open))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-open</span></span></span></span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">flac-file*</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">cb-stream-info</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td></tr><tr><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktVar">cb-audio</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktSym">flac-handle?</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">flac-file*</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._path~3f%29%29" class="RktValLink" data-pltdoc="x">path?</a></span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/strings.html#%28def._%28%28quote._~23~25kernel%29._string~3f%29%29" class="RktValLink" data-pltdoc="x">string?</a></span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">cb-stream-info</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">cb-audio</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/procedures.html#%28def._%28%28quote._~23~25kernel%29._procedure~3f%29%29" class="RktValLink" data-pltdoc="x">procedure?</a></span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></td></tr></table></blockquote></div><div class="SIntrapara">Opens a FLAC decoder for <span class="RktVar">flac-file*</span>. If a path is given,
|
|
it is converted with <span class="RktSym"><a href="file:///usr/share/doc/racket/reference/Manipulating_Paths.html#%28def._%28%28quote._~23~25kernel%29._path-~3estring%29%29" class="RktValLink" data-pltdoc="x">path->string</a></span>. If the file does not
|
|
exist, the result is <span class="RktVal">#f</span>.</div></p><p>Otherwise a native decoder handler is created with
|
|
<span class="RktSym">flac-ffi-decoder-handler</span>, initialized with the file, and
|
|
wrapped in a <span class="RktSym"><span class="badlink"><span class="RktValLink">flac-handle</span></span></span>. The given callbacks are stored
|
|
in the handle.</p><p>When metadata of type <span class="RktVal">'</span><span class="RktVal">streaminfo</span> is processed and
|
|
<span class="RktVar">cb-stream-info</span> is a procedure, it is called with a
|
|
<span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stream-info</span></span></span> value.</p><p>When decoded audio data is processed and <span class="RktVar">cb-audio</span> is a
|
|
procedure, it is called as
|
|
<span class="RktPn">(</span><span class="RktVar">cb-audio</span><span class="stt"> </span><span class="RktSym">header</span><span class="stt"> </span><span class="RktSym">buffers</span><span class="RktPn">)</span>, where <span class="RktSym">header</span> is a
|
|
mutable hash containing the frame header fields plus
|
|
<span class="RktVal">'</span><span class="RktVal">duration</span>, and <span class="RktSym">buffers</span> is the decoded channel
|
|
data returned by the FFI layer.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._flac-stream-state))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stream-state</span></span></span></span><span class="hspace"> </span><span class="RktVar">handle</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">search-for-metadata</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">read-metadata</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">search-for-frame-sync</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">read-frames</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">end-of-stream</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">ogg-error</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">seek-error</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">aborted</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">memory-allocation-error</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">uninitialized</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">end-of-link</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym">flac-handle?</span></td></tr></table></blockquote></div><div class="SIntrapara">Returns the current decoder state reported by the native decoder
|
|
handler.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><table cellspacing="0" cellpadding="0" class="prototype RForeground"><tr><td valign="top"><span class="RktPn">(</span><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._flac-read))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-read</span></span></span></span><span class="hspace"> </span><span class="RktVar">handle</span><span class="RktPn">)</span></td><td valign="top"><span class="hspace"> </span></td><td valign="top">→</td><td valign="top"><span class="hspace"> </span></td><td valign="top"><table cellspacing="0" cellpadding="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">stopped-reading</span></td></tr><tr><td><span class="hspace"> </span><span class="RktVal">'</span><span class="RktVal">end-of-stream</span><span class="RktPn">)</span></td></tr></table></td></tr></table></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym">flac-handle?</span></td></tr></table></blockquote></div><div class="SIntrapara">Reads the stream by repeatedly calling the native decoder with
|
|
<span class="RktVal">'</span><span class="RktVal">process-single</span>.</div></p><p>Before reading starts, the handle fields <span class="RktSym">stop-reading</span>
|
|
and <span class="RktSym">reading</span> are set to <span class="RktVal">#f</span> and <span class="RktVal">#t</span>. If a
|
|
stop has been requested with <span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stop</span></span></span>, reading ends
|
|
with <span class="RktVal">'</span><span class="RktVal">stopped-reading</span> and <span class="RktSym">reading</span> is reset to
|
|
<span class="RktVal">#f</span>.</p><p>Whenever pending metadata is available, it is processed with
|
|
<span class="RktSym">process-meta</span>. For metadata of type
|
|
<span class="RktVal">'</span><span class="RktVal">streaminfo</span>, a <span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stream-info</span></span></span> value is
|
|
constructed, stored in the handle, and passed to the
|
|
stream-info callback.</p><p>Whenever pending frame data is available, it is processed with
|
|
<span class="RktSym">process-frame</span>. The frame header is converted to a
|
|
mutable hash, extended with a <span class="RktVal">'</span><span class="RktVal">duration</span> entry taken
|
|
from <span class="RktSym"><span class="badlink"><span class="RktValLink">flac-duration</span></span></span>, and passed together with the
|
|
decoded buffers to the audio callback.</p><p>For each processed frame, the module also updates
|
|
<span class="RktSym"><span class="badlink"><span class="RktValLink">last-buffer</span></span></span>, <span class="RktSym"><span class="badlink"><span class="RktValLink">last-buf-len</span></span></span>, and <span class="RktSym"><span class="badlink"><span class="RktValLink">kinds</span></span></span>.</p><p>The procedure prints diagnostic messages for state changes,
|
|
metadata, stream errors, and stop handling.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._flac-read-meta))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-read-meta</span></span></span></span><span class="hspace"> </span><span class="RktVar">handle</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktSym">flac-stream-info?</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="RktPn">)</span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym">flac-handle?</span></td></tr></table></blockquote></div><div class="SIntrapara">Advances the decoder until the state becomes one of
|
|
<span class="RktVal">'</span><span class="RktVal">read-metadata</span>, <span class="RktVal">'</span><span class="RktVal">end-of-stream</span>,
|
|
<span class="RktVal">'</span><span class="RktVal">aborted</span>, <span class="RktVal">'</span><span class="RktVal">memory-allocation-error</span>, or
|
|
<span class="RktVal">'</span><span class="RktVal">uninitialized</span>.</div></p><p>If the resulting state is <span class="RktVal">'</span><span class="RktVal">read-metadata</span>, pending
|
|
metadata is processed and the stored stream info is returned.
|
|
Otherwise the result is <span class="RktVal">#f</span>.</p><p>Only metadata of type <span class="RktVal">'</span><span class="RktVal">streaminfo</span> is converted into a
|
|
<span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stream-info</span></span></span> value by this module.</p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>procedure</p></div></div><p class="RForeground"><span class="RktPn">(</span><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._flac-stop))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">flac-stop</span></span></span></span><span class="hspace"> </span><span class="RktVar">handle</span><span class="RktPn">)</span><span class="hspace"> </span>→<span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/void.html#%28def._%28%28quote._~23~25kernel%29._void~3f%29%29" class="RktValLink" data-pltdoc="x">void?</a></span></p></blockquote></td></tr><tr><td><span class="hspace"> </span><span class="RktVar">handle</span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym">flac-handle?</span></td></tr></table></blockquote></div><div class="SIntrapara">Requests termination of an active <span class="RktSym"><span class="badlink"><span class="RktValLink">flac-read</span></span></span> loop by
|
|
setting the handle field <span class="RktSym">stop-reading</span> to <span class="RktVal">#t</span>.
|
|
The procedure then waits until the handle field
|
|
<span class="RktSym">reading</span> becomes <span class="RktVal">#f</span>, sleeping for 10 ms between
|
|
checks.</div></p><p>The procedure prints timing information before and after the
|
|
wait.</p></section><section class="SsectionLevel2" id="section 2"><h2 class="heading">2<span class="stt"> </span><a name="(part._.Diagnostic_bindings)"></a>Diagnostic bindings<span class="button-group"><a href="#(part._.Diagnostic_bindings)" class="heading-anchor" title="Link to here">🔗</a><span style="visibility: hidden"> </span></span></h2><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._kinds))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">kinds</span></span></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/hashtables.html#%28def._%28%28quote._~23~25kernel%29._hash~3f%29%29" class="RktValLink" data-pltdoc="x">hash?</a></span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">A mutable hash used to record the frame number kinds encountered
|
|
during decoding. The keys are the values found in the
|
|
frame-header field <span class="RktVal">'</span><span class="RktVal">number-type</span>.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._last-buffer))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">last-buffer</span></span></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/pairs.html#%28def._%28%28quote._~23~25kernel%29._list~3f%29%29" class="RktValLink" data-pltdoc="x">list?</a></span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">The most recently decoded buffer set produced by frame
|
|
processing.</div></p><p><div class="SIntrapara"><blockquote class="SVInsetFlow"><table cellspacing="0" cellpadding="0" class="boxed RBoxed"><tr><td><blockquote class="SubFlow"><div class="RBackgroundLabel SIEHidden"><div class="RBackgroundLabelInner"><p>value</p></div></div><p class="RForeground"><a name="(def._(/home/hans/src/racket/racket-sound/scrbl/flac-decoder..rkt._last-buf-len))"></a><span title="Provided from: "flac-decoder.rkt" | Package: base"><span class="RktSym"><span class="badlink"><span class="RktValLink">last-buf-len</span></span></span></span><span class="hspace"> </span>:<span class="hspace"> </span><span class="RktPn">(</span><span class="RktSym">or/c</span><span class="hspace"> </span><span class="RktVal">#f</span><span class="hspace"> </span><span class="RktSym"><a href="file:///usr/share/doc/racket/reference/number-types.html#%28def._%28%28quote._~23~25kernel%29._exact-integer~3f%29%29" class="RktValLink" data-pltdoc="x">exact-integer?</a></span><span class="RktPn">)</span></p></blockquote></td></tr></table></blockquote></div><div class="SIntrapara">The block size of the most recently processed frame.</div></p></section><section class="SsectionLevel2" id="section 3"><h2 class="heading">3<span class="stt"> </span><a name="(part._.Notes)"></a>Notes<span class="button-group"><a href="#(part._.Notes)" class="heading-anchor" title="Link to here">🔗</a><span style="visibility: hidden"> </span></span></h2><p>The frame-header hash passed to the audio callback is produced
|
|
by <span class="RktSym">flac-ffi-frame-header</span>. In this module it is extended
|
|
with a <span class="RktVal">'</span><span class="RktVal">duration</span> field before the callback is called.</p><p>All bindings from <span class="RktVal">"flac-definitions.rkt"</span> are
|
|
re-exported.</p></section></section></div></div><div id="contextindicator"> </div></body></html> |