[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.