[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[sc-dev] SF.net SVN: supercollider: [6896] trunk
Revision: 6896
http://svn.sourceforge.net/supercollider/?rev=6896&view=rev
Author: joshpar
Date: 2008-01-07 19:33:11 -0800 (Mon, 07 Jan 2008)
Log Message:
-----------
add DiskIn looping and buffer clearing
Modified Paths:
--------------
trunk/Source/plugins/DiskIO_UGens.cpp
trunk/build/Help/UGens/Playback and Recording/DiskIn.html
trunk/build/SCClassLibrary/Common/Audio/DiskIO.sc
Modified: trunk/Source/plugins/DiskIO_UGens.cpp
===================================================================
--- trunk/Source/plugins/DiskIO_UGens.cpp 2008-01-08 02:51:06 UTC (rev 6895)
+++ trunk/Source/plugins/DiskIO_UGens.cpp 2008-01-08 03:33:11 UTC (rev 6896)
@@ -77,6 +77,7 @@
enum {
kDiskCmd_Read,
kDiskCmd_Write,
+ kDiskCmd_ReadLoop,
};
struct DiskIOMsg
@@ -190,7 +191,7 @@
// send a message to read
DiskIOMsg msg;
msg.mWorld = unit->mWorld;
- msg.mCommand = kDiskCmd_Read;
+ msg.mCommand = (int)ZIN0(1) ? kDiskCmd_ReadLoop : kDiskCmd_Read;
msg.mBufNum = (int)fbufnum;
msg.mPos = bufFrames2 - unit->m_framepos;
msg.mFrames = bufFrames2;
@@ -207,12 +208,22 @@
uint32 mPos = bufFrames2 - unit->m_framepos;
if (mPos > (uint32)bufr->frames || mPos + bufFrames2 > (uint32)bufr->frames || (uint32) bufr->channels != bufChannels) return;
sf_count_t count;
- count = bufr->sndfile ? sf_readf_float(bufr->sndfile, bufr->data + mPos * bufr->channels, bufFrames2) : 0;
- if (count < bufFrames2) {
- memset(bufr->data + (mPos + count) * bufr->channels, 0, (bufFrames2 - count) * bufr->channels);
- }
- }
+
+ if ((int)ZIN0(1)) { // loop
+ if (!bufr->sndfile) memset(bufr->data + mPos * bufr->channels, 0, bufFrames2 * bufr->channels * sizeof(float));
+ count = sf_readf_float(bufr->sndfile, bufr->data + mPos * bufr->channels, bufFrames2);
+ while (bufFrames2 -= count) {
+ sf_seek(bufr->sndfile, 0, SEEK_SET);
+ count = sf_readf_float(bufr->sndfile, bufr->data + (mPos + count) * bufr->channels, bufFrames2);
+ }
+ } else { // non-loop
+ count = bufr->sndfile ? sf_readf_float(bufr->sndfile, bufr->data + mPos * bufr->channels, bufFrames2) : 0;
+ if (count < bufFrames2) {
+ memset(bufr->data + (mPos + count) * bufr->channels, 0, (bufFrames2 - count) * bufr->channels * sizeof(float));
+ }
+ }
}
+ }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -301,9 +312,20 @@
case kDiskCmd_Read :
count = buf->sndfile ? sf_readf_float(buf->sndfile, buf->data + mPos * buf->channels, mFrames) : 0;
if (count < mFrames) {
- memset(buf->data + (mPos + count) * buf->channels, 0, (mFrames - count) * buf->channels);
+ memset(buf->data + (mPos + count) * buf->channels, 0, (mFrames - count) * buf->channels * sizeof(float));
}
break;
+ case kDiskCmd_ReadLoop :
+ if (!buf->sndfile) {
+ memset(buf->data + mPos * buf->channels, 0, mFrames * buf->channels * sizeof(float));
+ goto leave;
+ }
+ count = sf_readf_float(buf->sndfile, buf->data + mPos * buf->channels, mFrames);
+ while (mFrames -= count) {
+ sf_seek(buf->sndfile, 0, SEEK_SET);
+ count = sf_readf_float(buf->sndfile, buf->data + (mPos + count) * buf->channels, mFrames);
+ }
+ break;
case kDiskCmd_Write :
//printf("kDiskCmd_Write %d %08X\n", mBufNum, buf->sndfile);
if (!buf->sndfile) goto leave;
Modified: trunk/build/Help/UGens/Playback and Recording/DiskIn.html
===================================================================
--- trunk/build/Help/UGens/Playback and Recording/DiskIn.html 2008-01-08 02:51:06 UTC (rev 6895)
+++ trunk/build/Help/UGens/Playback and Recording/DiskIn.html 2008-01-08 03:33:11 UTC (rev 6896)
@@ -5,26 +5,25 @@
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
-<meta name="CocoaVersion" content="824.44">
+<meta name="CocoaVersion" content="949">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
-p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #091fb1; min-height: 12.0px}
+p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0701a1; min-height: 12.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; min-height: 12.0px}
-p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #bf0000}
-p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000; min-height: 12.0px}
-p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #000000}
-p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
-p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #606060}
-p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000bf}
-span.s1 {color: #0018f7}
-span.s2 {color: #0000ff}
+p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #af0005}
+p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco}
+p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
+p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #4d4d4d}
+p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 9.0px Monaco; color: #0000b1}
+span.s1 {color: #0000f4}
+span.s2 {color: #0000fe}
span.s3 {color: #000000}
-span.s4 {color: #0000bf}
-span.s5 {color: #606060}
-span.s6 {color: #bf0000}
-span.s7 {color: #007300}
+span.s4 {color: #0000b1}
+span.s5 {color: #4d4d4d}
+span.s6 {color: #af0005}
+span.s7 {color: #0d6301}
span.Apple-tab-span {white-space:pre}
</style>
</head>
@@ -32,95 +31,95 @@
<p class="p1"><b>DiskIn<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>stream in audio from a file</b></p>
<p class="p2"><br></p>
<p class="p2"><br></p>
-<p class="p3"><b>DiskIn.ar(numChannels, bufnum)</b></p>
+<p class="p3"><b>DiskIn.ar(numChannels, bufnum, loop )</b></p>
<p class="p2"><br></p>
-<p class="p3">Continuously play a longer soundfile from disk.<span class="Apple-converted-space"> </span>This requires a buffer to be preloaded with one buffer size of sound.</p>
+<p class="p3">Continuously play a longer soundfile from disk.<span class="Apple-converted-space"> </span>This requires a buffer to be preloaded with one buffer size of sound. If loop is set to 1, the soundfile will loop.</p>
<p class="p4"><br></p>
<p class="p3"><b>See also:</b> <a href="PlayBuf.html"><span class="s1">PlayBuf</span></a>, <a href="../Oscillators/BufRd.html"><span class="s2">BufRd</span></a><span class="Apple-converted-space"> </span></p>
<p class="p5"><br></p>
<p class="p6"><span class="s3">s.boot; </span>// start the server</p>
-<p class="p7"><br></p>
-<p class="p8">(</p>
-<p class="p8"><span class="s4">SynthDef</span>(<span class="s5">"help-Diskin"</span>, { <span class="s4">arg</span> bufnum = 0;</p>
-<p class="p8"><span class="Apple-tab-span"> </span><span class="s4">Out</span>.ar(0, <span class="s4">DiskIn</span>.ar(1, bufnum));</p>
-<p class="p8">}).send(s)</p>
-<p class="p8">)</p>
<p class="p5"><br></p>
-<p class="p9"><b>OSC Messaging Style</b></p>
+<p class="p7">(</p>
+<p class="p7"><span class="s4">SynthDef</span>(<span class="s5">"help-Diskin"</span>, { <span class="s4">arg</span> bufnum = 0;</p>
+<p class="p7"><span class="Apple-tab-span"> </span><span class="s4">Out</span>.ar(0, <span class="s4">DiskIn</span>.ar(1, bufnum, 1));</p>
+<p class="p7">}).send(s)</p>
+<p class="p7">)</p>
<p class="p5"><br></p>
+<p class="p8"><b>OSC Messaging Style</b></p>
+<p class="p5"><br></p>
<p class="p6">// allocate a disk i/o buffer</p>
-<p class="p8">s.sendMsg(<span class="s5">"/b_alloc"</span>, 0, 65536, 1);</p>
-<p class="p7"><br></p>
+<p class="p7">s.sendMsg(<span class="s5">"/b_alloc"</span>, 0, 65536, 1);</p>
+<p class="p5"><br></p>
<p class="p6">// open an input file for this buffer, leave it open</p>
-<p class="p10"><span class="s3">s.sendMsg(</span>"/b_read"<span class="s3">, 0, </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0, 65536, 0, 1);</span></p>
-<p class="p7"><br></p>
+<p class="p9"><span class="s3">s.sendMsg(</span>"/b_read"<span class="s3">, 0, </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0, 65536, 0, 1);</span></p>
+<p class="p5"><br></p>
<p class="p6">// create a diskin node</p>
-<p class="p8">s.sendMsg(<span class="s5">"/s_new"</span>, <span class="s5">"help-Diskin"</span>, x = s.nextNodeID, 1, 1);</p>
-<p class="p7"><br></p>
+<p class="p7">s.sendMsg(<span class="s5">"/s_new"</span>, <span class="s5">"help-Diskin"</span>, x = s.nextNodeID, 1, 1);</p>
+<p class="p5"><br></p>
<p class="p6"><span class="s3">s.sendMsg(</span><span class="s5">"/b_close"</span><span class="s3">, 0); </span>// close the file (very important!)</p>
-<p class="p7"><br></p>
-<p class="p7"><br></p>
+<p class="p5"><br></p>
+<p class="p5"><br></p>
<p class="p6">// again<span class="Apple-converted-space"> </span></p>
<p class="p6">// don't need to reallocate and Synth is still reading</p>
-<p class="p10"><span class="s3">s.sendMsg(</span>"/b_read"<span class="s3">, 0, </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0, 0, 0, 1);</span></p>
-<p class="p7"><br></p>
-<p class="p8">s.sendMsg(<span class="s5">"/n_free"</span>, x); <span class="s6">// stop reading</span></p>
-<p class="p7"><br></p>
+<p class="p9"><span class="s3">s.sendMsg(</span>"/b_read"<span class="s3">, 0, </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0, 0, 0, 1);</span></p>
+<p class="p5"><br></p>
+<p class="p7">s.sendMsg(<span class="s5">"/n_free"</span>, x); <span class="s6">// stop reading</span></p>
+<p class="p5"><br></p>
<p class="p6"><span class="s3">s.sendMsg(</span><span class="s5">"/b_close"</span><span class="s3">, 0); </span>// close the file.</p>
-<p class="p7"><br></p>
+<p class="p5"><br></p>
<p class="p6"><span class="s3">s.sendMsg(</span><span class="s5">"/b_free"</span><span class="s3">, 0); </span>// frees the buffer</p>
<p class="p5"><br></p>
<p class="p5"><br></p>
<p class="p5"><br></p>
<p class="p5"><br></p>
-<p class="p9"><b>Using Buffer (Object Style)</b></p>
+<p class="p8"><b>Using Buffer (Object Style)</b></p>
<p class="p5"><br></p>
-<p class="p8">b = <span class="s4">Buffer</span>.cueSoundFile(s, <span class="s5">"sounds/a11wlk01-44_1.aiff"</span>, 0, 1);</p>
-<p class="p7"><br></p>
-<p class="p8">x = { <span class="s4">DiskIn</span>.ar(1, b) }.play;</p>
-<p class="p7"><br></p>
-<p class="p8">b.close;<span class="Apple-tab-span"> </span></p>
-<p class="p7"><br></p>
+<p class="p7">b = <span class="s4">Buffer</span>.cueSoundFile(s, <span class="s5">"sounds/a11wlk01-44_1.aiff"</span>, 0, 1);</p>
+<p class="p5"><br></p>
+<p class="p7">x = { <span class="s4">DiskIn</span>.ar(1, b) }.play;</p>
+<p class="p5"><br></p>
+<p class="p7">b.close;<span class="Apple-tab-span"> </span></p>
+<p class="p5"><br></p>
<p class="p6">// again</p>
<p class="p6">// note the like named instance method, but different arguments</p>
-<p class="p10"><span class="s3">b.cueSoundFile(</span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0);<span class="Apple-tab-span"> </span></span></p>
-<p class="p7"><span class="Apple-tab-span"> </span></p>
-<p class="p8">x.free; b.close; b.free;<span class="Apple-tab-span"> </span></p>
-<p class="p7"><br></p>
-<p class="p7"><br></p>
-<p class="p7"><br></p>
+<p class="p9"><span class="s3">b.cueSoundFile(</span>"sounds/a11wlk01-44_1.aiff"<span class="s3">, 0);<span class="Apple-tab-span"> </span></span></p>
+<p class="p5"><span class="Apple-tab-span"> </span></p>
+<p class="p7">x.free; b.close; b.free;<span class="Apple-tab-span"> </span></p>
+<p class="p5"><br></p>
+<p class="p5"><br></p>
+<p class="p5"><br></p>
<p class="p6">// loop it (for better looping use PlayBuf!)</p>
-<p class="p8">(</p>
-<p class="p10"><span class="s3">p = </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">;</span></p>
-<p class="p8">a = <span class="s4">SoundFile</span>.new;</p>
-<p class="p8">a.openRead(p);</p>
-<p class="p8">d = a.numFrames/s.sampleRate; <span class="s6">// get the duration</span></p>
+<p class="p7">(</p>
+<p class="p9"><span class="s3">p = </span>"sounds/a11wlk01-44_1.aiff"<span class="s3">;</span></p>
+<p class="p7">a = <span class="s4">SoundFile</span>.new;</p>
+<p class="p7">a.openRead(p);</p>
+<p class="p7">d = a.numFrames/s.sampleRate; <span class="s6">// get the duration</span></p>
<p class="p6"><span class="s3">a.close; </span>// don't forget</p>
-<p class="p8">b = <span class="s4">Buffer</span>.cueSoundFile(s, p, 0, 1);</p>
-<p class="p8">f = { <span class="s4">DiskIn</span>.ar(1, b) };</p>
-<p class="p8">x = f.play;</p>
-<p class="p11"><span class="s3">r = </span>Routine<span class="s3">({</span></p>
-<p class="p8"><span class="Apple-tab-span"> </span>loop({ d.wait; x.free; x = f.play; b.close( b.cueSoundFileMsg(p, 0)) });</p>
-<p class="p8">}).play;</p>
-<p class="p8">)</p>
+<p class="p7">b = <span class="s4">Buffer</span>.cueSoundFile(s, p, 0, 1);</p>
+<p class="p7">f = { <span class="s4">DiskIn</span>.ar(1, b) };</p>
+<p class="p7">x = f.play;</p>
+<p class="p10"><span class="s3">r = </span>Routine<span class="s3">({</span></p>
+<p class="p7"><span class="Apple-tab-span"> </span>loop({ d.wait; x.free; x = f.play; b.close( b.cueSoundFileMsg(p, 0)) });</p>
+<p class="p7">}).play;</p>
+<p class="p7">)</p>
<p class="p6"><span class="s3">r.stop; x.free; b.close; b.free; </span>// you need to do all these to properly cleanup</p>
-<p class="p7"><br></p>
-<p class="p7"><br></p>
-<p class="p7"><br></p>
+<p class="p5"><br></p>
+<p class="p5"><br></p>
+<p class="p5"><br></p>
<p class="p6">// cue and play right away</p>
-<p class="p8">(</p>
-<p class="p8"><span class="s4">SynthDef</span>(<span class="s5">"help-Diskin"</span>, { <span class="s4">arg</span> bufnum = 0;</p>
-<p class="p8"><span class="Apple-tab-span"> </span><span class="s4">Out</span>.ar(0, <span class="s4">DiskIn</span>.ar(1, bufnum));</p>
-<p class="p8">}).send(s);</p>
-<p class="p8">)</p>
-<p class="p8">(<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
-<p class="p8">x = <span class="s4">Synth</span>.basicNew(<span class="s5">"help-Diskin"</span>);</p>
-<p class="p8">m = { <span class="s4">arg</span> buf; x.addToHeadMsg(<span class="s4">nil</span>, [<span class="s7">\bufnum</span>, buf])};</p>
-<p class="p7"><br></p>
-<p class="p8">b = <span class="s4">Buffer</span>.cueSoundFile(s,<span class="s5">"sounds/a11wlk01-44_1.aiff"</span>,0,1, completionMessage: m);</p>
-<p class="p8">)<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
-<p class="p7"><br></p>
-<p class="p8">x.free; b.close; b.free;<span class="Apple-tab-span"> </span><span class="s6">//clean up</span></p>
+<p class="p7">(</p>
+<p class="p7"><span class="s4">SynthDef</span>(<span class="s5">"help-Diskin"</span>, { <span class="s4">arg</span> bufnum = 0;</p>
+<p class="p7"><span class="Apple-tab-span"> </span><span class="s4">Out</span>.ar(0, <span class="s4">DiskIn</span>.ar(1, bufnum));</p>
+<p class="p7">}).send(s);</p>
+<p class="p7">)</p>
+<p class="p7">(<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
+<p class="p7">x = <span class="s4">Synth</span>.basicNew(<span class="s5">"help-Diskin"</span>);</p>
+<p class="p7">m = { <span class="s4">arg</span> buf; x.addToHeadMsg(<span class="s4">nil</span>, [<span class="s7">\bufnum</span>, buf])};</p>
<p class="p5"><br></p>
+<p class="p7">b = <span class="s4">Buffer</span>.cueSoundFile(s,<span class="s5">"sounds/a11wlk01-44_1.aiff"</span>,0,1, completionMessage: m);</p>
+<p class="p7">)<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
+<p class="p5"><br></p>
+<p class="p7">x.free; b.close; b.free;<span class="Apple-tab-span"> </span><span class="s6">//clean up</span></p>
+<p class="p5"><br></p>
</body>
</html>
Modified: trunk/build/SCClassLibrary/Common/Audio/DiskIO.sc
===================================================================
--- trunk/build/SCClassLibrary/Common/Audio/DiskIO.sc 2008-01-08 02:51:06 UTC (rev 6895)
+++ trunk/build/SCClassLibrary/Common/Audio/DiskIO.sc 2008-01-08 03:33:11 UTC (rev 6896)
@@ -19,11 +19,11 @@
}
DiskIn : MultiOutUGen {
- *ar { arg numChannels, bufnum;
- ^this.multiNew('audio', numChannels, bufnum)
+ *ar { arg numChannels, bufnum, loop = 0;
+ ^this.multiNew('audio', numChannels, bufnum, loop)
}
- init { arg numChannels, bufnum;
- inputs = [bufnum];
+ init { arg numChannels, bufnum, loop = 0;
+ inputs = [bufnum, loop];
^this.initOutputs(numChannels, rate)
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.