[SCM] supercollider/master: Imported Upstream version 3.4.4

danstowell-guest at users.alioth.debian.org danstowell-guest at users.alioth.debian.org
Sat Jul 16 15:35:36 UTC 2011


The following commit has been merged in the master branch:
commit 498cde31344e0ded4826265a064eb8e25b1aa3f9
Author: Dan Stowell <danstowell at users.sourceforge.net>
Date:   Sat Jul 16 16:05:55 2011 +0100

    Imported Upstream version 3.4.4

diff --git a/AUTHORS b/AUTHORS
index 7c472c7..52aa4c5 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,12 +3,13 @@ Alex Norman <alex att x37v dot info>
 Anders Vinjar <anders dott vinjar att notam dott uio dott no>
 Andi Pieper <apieper att url dott de>
 Axel Balley <axel dott lists att gmail dott com>
+Batuhan Bozkurt <bbozkurt att users dott sourceforge dott net>
 Benjamin Golinvaux <Benjamin dott Golinvaux att euresys dott com>
 Blackrain <blackrain dott sc att gmail dott com>
 Charles Picasso <thelych att gmail dott com>
 Chris Sattinger (Crucial Felix) <felix att crucial-systems dott com>
 Christian A.  Hresko <christian dott hresko att verizon dott net>
-Christophe Costigan
+Christophe Costigan <ccos att users dott sourceforge dott net>
 Christopher Frauenberger <frauenberger att iem dott at>
 Dan Stowell <danstowell att users dott sourceforge dott net>
 Dave Watson <dave att elephantride dott org>
@@ -19,7 +20,8 @@ James Harkins <jamshark70 att gmail dott com>
 James McCartney <asynth att gmail dott com>
 Jan Trutzschler <sc3 att sampleAndHold dott org>
 John Glover <glover dott john att gmail dott com>
-Josh Davison
+Jonatan Liljedahl <lijon att kymatica dott com>
+Josh Davison <iketa att users dott sourceforge dott net>
 Joshua Parmenter <josh att realizedsound dott net>
 Jost Muxfeldt <jost dott muxfeldt att glyph dott de>
 Julian Rohrhuber <rohrhuber att uni-hamburg dott de>
@@ -27,11 +29,14 @@ Kasper Souren <Kasper dott Souren att ircam dott fr>
 Marije Baalman <nescivi att gmail dott com>
 Mario Lang <mlang att delysid dott org>
 Mark Polishook <polishook att optonline dott net>
+Martin Victory <martinvictory att users dott sourceforge dott net>
 Maurizio Umberto Puxeddu <umbpux att tin dott it>
+Miguel Negrao <zlb-dev att users dott sourceforge dott net>
 Mike Whyte <matrix6k att somahq dott com>
 Newton Armstrong <newton att silvertone dott princeton dott edu>
 Nick Collins <N dott Collins att sussex dott ac dott uk>
 Patrick Beard <pcbeard att mac dott com>
+Patrick Borgeat <patrick att borgeat dott de>
 Rohan Drape <rd att slavepianos dott org>
 Ron Kuivila <rkuivila att wesleyan dott edu>
 Ross Bencina <rossb att audiomulch dott com>
diff --git a/VERSION b/VERSION
index a46bb9d..30985dd 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-3.4.3
-classvar scVersionMajor=3, scVersionMinor=4, scVersionPostfix=".3";
+3.4.4
+classvar scVersionMajor=3, scVersionMinor=4, scVersionPostfix=".4";
diff --git a/common/Headers/lang/GC.h b/common/Headers/lang/GC.h
index 4e2749c..68ca2e3 100644
--- a/common/Headers/lang/GC.h
+++ b/common/Headers/lang/GC.h
@@ -66,6 +66,8 @@ struct SlotRef {
 
 class PyrGC
 {
+	static const int kLazyCollectThreshold = 1024;
+
 public:
 	PyrGC(VMGlobals *g, AllocPool *inPool, PyrClass *mainProcessClass, long poolSize);
 
@@ -138,6 +140,11 @@ public:
 
 	void Collect();
 	void Collect(int32 inNumToScan);
+	void LazyCollect()
+	{
+		if (mUncollectedAllocations > kLazyCollectThreshold)
+			Collect();
+	}
 	void FullCollection();
 	void ScanFinalizers();
 	GCSet* GetGCSet(PyrObjectHdr* inObj);
@@ -204,7 +211,7 @@ private:
 	int32 mNumGrey;
 	int32 mCurSet;
 
-	int32 mFlips, mCollects, mAllocTotal, mScans, mNumAllocs, mStackScans, mNumPartialScans, mSlotsScanned;
+	int32 mFlips, mCollects, mAllocTotal, mScans, mNumAllocs, mStackScans, mNumPartialScans, mSlotsScanned, mUncollectedAllocations;
 
 	unsigned char mBlackColor, mGreyColor, mWhiteColor, mFreeColor;
 	bool mCanSweep;
diff --git a/common/Headers/lang/SC_LibraryConfig.h b/common/Headers/lang/SC_LibraryConfig.h
index 5ebb1b7..64dd80b 100644
--- a/common/Headers/lang/SC_LibraryConfig.h
+++ b/common/Headers/lang/SC_LibraryConfig.h
@@ -71,7 +71,7 @@ private:
 // =====================================================================
 // SC_LibraryConfig
 //    library configuration management
-// Copyright 2003 Maurizio Umberto Puxeddu
+// Copyright 2003 Maurizio Umberto Puxeddu <umbpux at tin.it>
 // =====================================================================
 
 class SC_LibraryConfig
diff --git a/common/Headers/server/SC_CoreAudio.h b/common/Headers/server/SC_CoreAudio.h
index 385504a..186de84 100644
--- a/common/Headers/server/SC_CoreAudio.h
+++ b/common/Headers/server/SC_CoreAudio.h
@@ -226,9 +226,13 @@ protected:
 	virtual bool DriverStop();
 
 public:
+	int builtinoutputflag_; 
+	
     SC_CoreAudioDriver(struct World *inWorld);
 	virtual ~SC_CoreAudioDriver();
 
+	bool StopStart(); 
+	
     void Run(const AudioBufferList* inInputData, AudioBufferList* outOutputData, int64 oscTime);
 
 	bool UseInput() { return mInputDevice != kAudioDeviceUnknown; }
diff --git a/common/Source/lang/LangPrimSource/SC_Wii.cpp b/common/Source/lang/LangPrimSource/SC_Wii.cpp
index 16155e2..a8c489a 100644
--- a/common/Source/lang/LangPrimSource/SC_Wii.cpp
+++ b/common/Source/lang/LangPrimSource/SC_Wii.cpp
@@ -358,11 +358,9 @@ int SC_WIIManager::start( float updtime )
 #ifdef SC_LINUX
 cwiid_wiimote_t * SC_WIIManager::discover()
 {
-	bdaddr_t bdaddr;
+	static bdaddr_t bdaddr = {0, 0, 0, 0, 0, 0}; // BDADDR_ANY
  	cwiid_wiimote_t* wiimotediscovered;
 
-	bdaddr = *BDADDR_ANY;
-
 	if ( (wiimotediscovered = cwiid_open(&bdaddr, CWIID_FLAG_MESG_IFC)) == NULL ) {
 		return NULL;
 		}
diff --git a/common/Source/lang/LangSource/DumpParseNode.cpp b/common/Source/lang/LangSource/DumpParseNode.cpp
index 20ed311..aacbdbe 100644
--- a/common/Source/lang/LangSource/DumpParseNode.cpp
+++ b/common/Source/lang/LangSource/DumpParseNode.cpp
@@ -264,10 +264,11 @@ void slotString(PyrSlot *slot, char *str)
 			break;
 		case tagObj :
 			if (slotRawObject(slot)) {
-				if (isKindOf(slotRawObject(slot), class_class)) {
+				PyrClass * classptr = slotRawObject(slot)->classptr;
+				if (classptr == class_class) {
 					sprintf(str, "class %s (%p)",
 						slotRawSymbol(&((PyrClass*)slotRawObject(slot))->name)->name, slotRawObject(slot));
-				} else if (slotRawObject(slot)->classptr == class_string) {
+				} else if (classptr == class_string) {
 					char str2[48];
 					int len;
 					if (slotRawObject(slot)->size > 47) {
@@ -282,11 +283,11 @@ void slotString(PyrSlot *slot, char *str)
 						str2[len] = 0;
 					}
 					sprintf(str, "\"%s\"", str2);
-				} else if (slotRawObject(slot)->classptr == class_method) {
+				} else if (classptr == class_method) {
 					sprintf(str, "instance of Method %s:%s (%p)",
 						slotRawSymbol(&slotRawClass(&slotRawMethod(slot)->ownerclass)->name)->name,
 						slotRawSymbol(&slotRawMethod(slot)->name)->name, slotRawMethod(slot));
-				} else if (slotRawObject(slot)->classptr == class_fundef) {
+				} else if (classptr == class_fundef) {
 					PyrSlot *context, *nextcontext;
 					// find function's method
 					nextcontext = &slotRawBlock(slot)->contextDef;
@@ -305,7 +306,7 @@ void slotString(PyrSlot *slot, char *str)
 					} else {
 						sprintf(str, "instance of FunctionDef - closed");
 					}
-				} else if (slotRawObject(slot)->classptr == class_frame) {
+				} else if (classptr == class_frame) {
 					if (!slotRawFrame(slot)) {
 						sprintf(str, "Frame (%0X)", slotRawInt(slot));
 					} else if (slotRawBlock(&slotRawFrame(slot)->method)->classptr == class_method) {
@@ -317,7 +318,7 @@ void slotString(PyrSlot *slot, char *str)
 					}
 				} else {
 					sprintf(str, "instance of %s (%p, size=%d, set=%d)",
-						slotRawSymbol(&slotRawObject(slot)->classptr->name)->name,
+						slotRawSymbol(&classptr->name)->name,
 						slotRawObject(slot), slotRawObject(slot)->size,
 						slotRawObject(slot)->obj_sizeclass);
 				}
@@ -372,9 +373,10 @@ void slotOneWord(PyrSlot *slot, char *str)
 			break;
 		case tagObj :
 			if (slotRawObject(slot)) {
-				if (isKindOf(slotRawObject(slot), class_class)) {
+				PyrClass * classptr = slotRawObject(slot)->classptr;
+				if (classptr == class_class) {
 					sprintf(str, "class %s", slotRawSymbol(&((PyrClass*)slotRawObject(slot))->name)->name);
-				} else if (slotRawObject(slot)->classptr == class_string) {
+				} else if (classptr == class_string) {
 					char str2[32];
 					int len;
 					if (slotRawObject(slot)->size > 31) {
@@ -389,11 +391,11 @@ void slotOneWord(PyrSlot *slot, char *str)
 						str2[len] = 0;
 					}
 					sprintf(str, "\"%s\"", str2);
-				} else if (slotRawObject(slot)->classptr == class_method) {
+				} else if (classptr == class_method) {
 					sprintf(str, "%s:%s",
 						slotRawSymbol(&slotRawClass(&slotRawMethod(slot)->ownerclass)->name)->name,
 						slotRawSymbol(&slotRawMethod(slot)->name)->name);
-				} else if (slotRawObject(slot)->classptr == class_fundef) {
+				} else if (classptr == class_fundef) {
 					PyrSlot *context, *nextcontext;
 					// find function's method
 					nextcontext = &slotRawBlock(slot)->contextDef;
@@ -412,7 +414,7 @@ void slotOneWord(PyrSlot *slot, char *str)
 					} else {
 						sprintf(str, "< closed FunctionDef >");
 					}
-				} else if (slotRawObject(slot)->classptr == class_frame) {
+				} else if (classptr == class_frame) {
 					if (!slotRawFrame(slot)) {
 						sprintf(str, "Frame (null)");
 					} else if (!slotRawBlock(&slotRawFrame(slot)->method)) {
@@ -424,10 +426,10 @@ void slotOneWord(PyrSlot *slot, char *str)
 					} else {
 						sprintf(str, "Frame (%0X) of Function", slotRawInt(slot));
 					}
-				} else if (slotRawObject(slot)->classptr == class_array) {
+				} else if (classptr == class_array) {
 					sprintf(str, "[*%d]", slotRawObject(slot)->size);
 				} else {
-					sprintf(str, "<instance of %s>", slotRawSymbol(&slotRawObject(slot)->classptr->name)->name);
+					sprintf(str, "<instance of %s>", slotRawSymbol(&classptr->name)->name);
 				}
 			} else {
 				sprintf(str, "NULL Object Pointer");
@@ -482,9 +484,10 @@ bool postString(PyrSlot *slot, char *str)
 			}*/
 
 			if (slotRawObject(slot)) {
-				if (isKindOf(slotRawObject(slot), class_class)) {
+				PyrClass * classptr = slotRawObject(slot)->classptr;
+				if (classptr == class_class) {
 					sprintf(str, "class %s", slotRawSymbol(&((PyrClass*)slotRawObject(slot))->name)->name);
-/*				} else if (slotRawObject(slot)->classptr == class_string) {
+/*				} else if (classptr == class_string) {
 					char str2[48];
 					int len;
 					if (slotRawObject(slot)->size > 47) {
@@ -500,11 +503,11 @@ bool postString(PyrSlot *slot, char *str)
 					}
 					sprintf(str, "\"%s\"", str2);
 */
-				} else if (slotRawObject(slot)->classptr == class_method) {
+				} else if (classptr == class_method) {
 					sprintf(str, "Method %s:%s",
 						slotRawSymbol(&slotRawClass(&slotRawMethod(slot)->ownerclass)->name)->name,
 						slotRawSymbol(&slotRawMethod(slot)->name)->name);
-				} else if (slotRawObject(slot)->classptr == class_fundef) {
+				} else if (classptr == class_fundef) {
 					PyrSlot *context, *nextcontext;
 					// find function's method
 					nextcontext = &slotRawBlock(slot)->contextDef;
@@ -523,7 +526,7 @@ bool postString(PyrSlot *slot, char *str)
 					} else {
 						sprintf(str, "a FunctionDef - closed");
 					}
-				} else if (slotRawObject(slot)->classptr == class_frame) {
+				} else if (classptr == class_frame) {
 					if (!slotRawFrame(slot)) {
 						sprintf(str, "Frame (null)");
 					} else if (!slotRawBlock(&slotRawFrame(slot)->method)) {
@@ -539,7 +542,7 @@ bool postString(PyrSlot *slot, char *str)
 					str[0] = 0;
 					res = false;
 //					sprintf(str, "instance of %s (%08X, size=%d, gcset=%02X)",
-//						slotRawSymbol(&slotRawObject(slot)->classptr->name)->name,
+//						slotRawSymbol(&classptr->name)->name,
 //						slotRawObject(slot), slotRawObject(slot)->size,
 //						slotRawObject(slot)->obj_sizeclass);
 				}
diff --git a/common/Source/lang/LangSource/GC.cpp b/common/Source/lang/LangSource/GC.cpp
index 54442ad..2a8d5ce 100644
--- a/common/Source/lang/LangSource/GC.cpp
+++ b/common/Source/lang/LangSource/GC.cpp
@@ -241,6 +241,7 @@ PyrGC::PyrGC(VMGlobals *g, AllocPool *inPool, PyrClass *mainProcessClass, long p
 	mCanSweep = false;
 	mPartialScanObj = NULL;
 	mPartialScanSlot = 0;
+	mUncollectedAllocations = 0;
 
 	mGrey.classptr = NULL;
 	mGrey.obj_sizeclass = 0;
@@ -317,6 +318,7 @@ void PyrGC::BecomeImmutable(PyrObject *inObject)
 
 void DumpBackTrace(VMGlobals *g);
 
+
 PyrObject *PyrGC::New(size_t inNumBytes, long inFlags, long inFormat, bool inCollect)
 {
 	PyrObject *obj = NULL;
@@ -344,6 +346,11 @@ PyrObject *PyrGC::New(size_t inNumBytes, long inFlags, long inFormat, bool inCol
 	mNumToScan += credit;
 	if (inCollect && mNumToScan >= kScanThreshold) {
 		Collect();
+	} else {
+		if (inCollect)
+			mUncollectedAllocations = 0;
+		else
+			++mUncollectedAllocations;
 	}
 
 	GCSet *gcs = mSets + sizeclass;
@@ -408,6 +415,11 @@ PyrObject *PyrGC::NewFrame(size_t inNumBytes, long inFlags, long inFormat, bool
 		if (mNumToScan >= kScanThreshold) {
 			Collect();
 		}
+	} else {
+		if (inAccount)
+			mUncollectedAllocations = 0;
+		else
+			++mUncollectedAllocations;
 	}
 
 	GCSet *gcs = mSets + sizeclass;
@@ -464,6 +476,11 @@ PyrObject *PyrGC::NewFinalizer(ObjFuncPtr finalizeFunc, PyrObject *inObject, boo
 
 	if (inCollect && mNumToScan >= kScanThreshold) {
 		Collect();
+	} else {
+		if (inCollect)
+			mUncollectedAllocations = 0;
+		else
+			++mUncollectedAllocations;
 	}
 
 	GCSet *gcs = mSets + kFinalizerSet;
@@ -745,6 +762,9 @@ void PyrGC::Collect()
 		//TraceAnyPathToAllGrey();
 	}
 	//post("mNumToScan %d\n", mNumToScan);
+
+	mUncollectedAllocations = 0;
+
 #if SANITYCHECK
 	SanityCheck();
 #endif
diff --git a/common/Source/lang/LangSource/PyrInterpreter3.cpp b/common/Source/lang/LangSource/PyrInterpreter3.cpp
index fb19192..f3a7b28 100644
--- a/common/Source/lang/LangSource/PyrInterpreter3.cpp
+++ b/common/Source/lang/LangSource/PyrInterpreter3.cpp
@@ -435,6 +435,7 @@ void endInterpreter(VMGlobals *g)
 //	dumpObjectSlot(&g->result);
 	g->gc->Stack()->size = 0;
 	g->sp = g->gc->Stack()->slots - 1;
+	g->gc->LazyCollect();
 }
 
 
diff --git a/common/Source/lang/LangSource/PyrMathOps.cpp b/common/Source/lang/LangSource/PyrMathOps.cpp
index 8fef7a4..7e044b4 100644
--- a/common/Source/lang/LangSource/PyrMathOps.cpp
+++ b/common/Source/lang/LangSource/PyrMathOps.cpp
@@ -377,7 +377,7 @@ int doSpecialBinaryArithMsg(VMGlobals *g, int numArgsPushed, bool isPrimitive)
 						case opThresh :	    SetRaw(a, sc_thresh(slotRawInt(a), slotRawInt(b))); break;
 						case opAMClip :		SetRaw(a, sc_amclip(slotRawInt(a), slotRawInt(b))); break;
 						case opScaleNeg :	SetRaw(a, sc_scaleneg(slotRawInt(a), slotRawInt(b))); break;
-						case opClip2 :		SetRaw(a, sc_clip2(slotRawInt(a), -slotRawInt(b))); break;
+						case opClip2 :		SetRaw(a, sc_clip2(slotRawInt(a), slotRawInt(b))); break;
 						case opFold2 :		SetRaw(a, sc_fold2(slotRawInt(a), slotRawInt(b))); break;
 						case opWrap2 :		SetRaw(a, sc_wrap2(slotRawInt(a), slotRawInt(b))); break;
 						case opExcess :		SetRaw(a, sc_excess(slotRawInt(a), slotRawInt(b))); break;
@@ -475,7 +475,7 @@ int doSpecialBinaryArithMsg(VMGlobals *g, int numArgsPushed, bool isPrimitive)
 						case opThresh :		SetRaw(a, sc_thresh(slotRawInt(a), slotRawFloat(b))); break;
 						case opAMClip :		SetFloat(a, sc_amclip((double)slotRawInt(a), slotRawFloat(b))); break;
 						case opScaleNeg : 	SetFloat(a, sc_scaleneg((double)slotRawInt(a), slotRawFloat(b))); break;
-						case opClip2 :		SetFloat(a, sc_clip2((double)slotRawInt(a), -slotRawFloat(b))); break;
+						case opClip2 :		SetFloat(a, sc_clip2((double)slotRawInt(a), slotRawFloat(b))); break;
 						case opFold2 :		SetFloat(a, sc_fold2((double)slotRawInt(a), slotRawFloat(b))); break;
 						case opWrap2 :		SetFloat(a, sc_wrap2((double)slotRawInt(a), -slotRawFloat(b))); break;
 						case opExcess :		SetFloat(a, sc_excess((double)slotRawInt(a), slotRawFloat(b))); break;
diff --git a/common/Source/lang/LangSource/PyrParseNode.cpp b/common/Source/lang/LangSource/PyrParseNode.cpp
index ff9f6ef..8a28b08 100644
--- a/common/Source/lang/LangSource/PyrParseNode.cpp
+++ b/common/Source/lang/LangSource/PyrParseNode.cpp
@@ -2988,6 +2988,17 @@ void PyrBinopCallNode::compileCall(PyrSlot *result)
 				compileOpcode(opSendSpecialMsg, numArgs);
 				compileByte(index);
 				break;
+			case selUnary :
+					COMPILENODE(arg1, &dummy, false);
+					COMPILENODE(arg2, &dummy, false);
+					if (arg3)
+						COMPILENODE(arg3, &dummy, false);
+					compileTail();
+					if (arg3)
+						compileOpcode(opSpecialOpcode, opcDrop); // drop third argument
+					compileOpcode(opSpecialOpcode, opcDrop);     // drop second argument
+					compileOpcode(opSendSpecialUnaryArithMsg, index);
+				break;
 			case selBinary :
 				if (arg3) {
 					COMPILENODE(arg1, &dummy, false);
diff --git a/common/Source/lang/LangSource/SC_LibraryConfig.cpp b/common/Source/lang/LangSource/SC_LibraryConfig.cpp
index 494ab26..d1439be 100644
--- a/common/Source/lang/LangSource/SC_LibraryConfig.cpp
+++ b/common/Source/lang/LangSource/SC_LibraryConfig.cpp
@@ -17,10 +17,24 @@
 # include <libgen.h>
 #endif
 
+/**************************************************************************
+ * SC_LibraryConfig
+ * Copyright 2003 Maurizio Umberto Puxeddu <umbpux at tin.it>
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 // =====================================================================
-// SC_LibraryConfig
-// Copyright 2003 Maurizio Umberto Puxeddu
-// =====================================================================
+*/
 
 SC_LibraryConfig *gLibraryConfig = 0;
 
diff --git a/common/Source/plugins/DelayUGens.cpp b/common/Source/plugins/DelayUGens.cpp
index 1d69aee..25e7f9d 100644
--- a/common/Source/plugins/DelayUGens.cpp
+++ b/common/Source/plugins/DelayUGens.cpp
@@ -794,6 +794,11 @@ inline double sc_loop(Unit *unit, double in, double hi, int loop)
 	} \
 	if(!unit->mOut){ \
 		unit->mOut = (float**)RTAlloc(unit->mWorld, numOutputs * sizeof(float*)); \
+		if (unit->mOut == NULL) { \
+			unit->mDone = true; \
+			ClearUnitOutputs(unit, inNumSamples); \
+			return; \
+		} \
 	} \
 	float **out = unit->mOut; \
 	for (uint32 i=0; i<numOutputs; ++i){ \
@@ -811,12 +816,17 @@ inline double sc_loop(Unit *unit, double in, double hi, int loop)
 		if(unit->mWorld->mVerbosity > -1 && !unit->mDone){ \
 			Print("buffer-writing UGen channel mismatch: numInputs %i, yet buffer has %i channels\n", numInputs, bufChannels); \
 		} \
-                unit->mDone = true; \
+		unit->mDone = true; \
 		ClearUnitOutputs(unit, inNumSamples); \
 		return; \
 	} \
 	if(!unit->mIn){ \
 		unit->mIn = (float**)RTAlloc(unit->mWorld, numInputs * sizeof(float*)); \
+		if (unit->mIn == NULL) { \
+			unit->mDone = true; \
+			ClearUnitOutputs(unit, inNumSamples); \
+			return; \
+		} \
 	} \
 	float **in = unit->mIn; \
 	for (uint32 i=0; i<numInputs; ++i) { \
@@ -1668,7 +1678,7 @@ void Pitch_Ctor(Pitch *unit)
 	unit->m_execPeriod = (int)(unit->m_srate / execfreq);
 	unit->m_execPeriod = sc_max(unit->m_execPeriod, unit->mWorld->mFullRate.mBufLength);
 
-	unit->m_size = unit->m_maxperiod << 1;
+	unit->m_size = sc_max(unit->m_maxperiod << 1, unit->m_execPeriod);
 
 	unit->m_buffer = (float*)RTAlloc(unit->mWorld, unit->m_size * sizeof(float));
 
diff --git a/common/Source/plugins/FilterUGens.cpp b/common/Source/plugins/FilterUGens.cpp
index 0639fbf..d8a5b1c 100644
--- a/common/Source/plugins/FilterUGens.cpp
+++ b/common/Source/plugins/FilterUGens.cpp
@@ -2271,20 +2271,18 @@ void RHPF_next_1(RHPF* unit, int inNumSamples)
 
 void LPF_Ctor(LPF* unit)
 {
-	////printf("LPF_Reset\n");
-
-	if (unit->mBufLength == 1) {
+	if (unit->mBufLength == 1)
 		SETCALC(LPF_next_1);
-	} else {
+	else
 		SETCALC(LPF_next);
-		unit->m_a0 = 0.f;
-		unit->m_b1 = 0.f;
-		unit->m_b2 = 0.f;
-		unit->m_y1 = 0.f;
-		unit->m_y2 = 0.f;
-		unit->m_freq = 0.f;
-		ZOUT0(0) = 0.f;
-	}
+
+	unit->m_a0 = 0.f;
+	unit->m_b1 = 0.f;
+	unit->m_b2 = 0.f;
+	unit->m_y1 = 0.f;
+	unit->m_y2 = 0.f;
+	unit->m_freq = 0.f;
+	ZOUT0(0) = 0.f;
 }
 
 
@@ -4570,6 +4568,20 @@ federico.fontana at univr.it
 
 Ported to C++ for SuperCollider by Dan Stowell - August 2007
 http://www.mcld.co.uk/
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */
 //////////////////////////////////////////////////////////////////
 
diff --git a/common/Source/plugins/LFUGens.cpp b/common/Source/plugins/LFUGens.cpp
index 92d240e..58b1c36 100644
--- a/common/Source/plugins/LFUGens.cpp
+++ b/common/Source/plugins/LFUGens.cpp
@@ -1707,7 +1707,7 @@ void XLine_next_nova(XLine *unit, int inNumSamples)
 		nova::setvec_simd(OUT(0), (float)level, inNumSamples);
 		return;
 	}
-	if (counter >= inNumSamples)
+	if (counter > inNumSamples)
 	{
 		nova::set_exp_vec_simd(OUT(0), (float)level, (float)grow, inNumSamples);
 		level *= sc_powi(grow, inNumSamples);
@@ -1758,7 +1758,7 @@ void XLine_next_nova_64(XLine *unit, int inNumSamples)
 		nova::setvec_simd<64>(OUT(0), (float)level);
 		return;
 	}
-	if (counter >= 64)
+	if (counter > 64)
 	{
 		nova::set_exp_vec_simd(OUT(0), (float)level, (float)grow, 64);
 		level *= sc_powi(grow, inNumSamples);
diff --git a/common/Source/plugins/ReverbUGens.cpp b/common/Source/plugins/ReverbUGens.cpp
index 982e13d..9a93f4a 100755
--- a/common/Source/plugins/ReverbUGens.cpp
+++ b/common/Source/plugins/ReverbUGens.cpp
@@ -1,7 +1,20 @@
 // FreeVerb UGens
-//  Copyright (c) 2005 blackrain. All rights reserved.
 // faust code generation experiments. blackrain 07/2005
-
+/*  Copyright (c) 2005 blackrain <blackrain.sc at gmail.com>. All rights reserved.
+*  This program is free software; you can redistribute it and/or modify
+*  it under the terms of the GNU General Public License as published by
+*  the Free Software Foundation; either version 2 of the License, or
+*  (at your option) any later version.
+*
+*  This program is distributed in the hope that it will be useful,
+*  but WITHOUT ANY WARRANTY; without even the implied warranty of
+*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*  GNU General Public License for more details.
+*
+*  You should have received a copy of the GNU General Public License
+*  along with this program; if not, write to the Free Software
+*  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+*/
 #include "SC_PlugIn.h"
 
 // gcc3.3 mathlib doesnt know these yet
diff --git a/common/Source/plugins/TestUGens.cpp b/common/Source/plugins/TestUGens.cpp
index 92e99da..8c0dd50 100644
--- a/common/Source/plugins/TestUGens.cpp
+++ b/common/Source/plugins/TestUGens.cpp
@@ -1,7 +1,7 @@
 /*
  *  TestUGens.cpp
  *  Plugins
- *  Copyright (c) 2007 Scott Wilson. All rights reserved.
+ *  Copyright (c) 2007 Scott Wilson <i at scottwilson.ca>. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
diff --git a/common/Source/server/SC_Carbon.cpp b/common/Source/server/SC_Carbon.cpp
index 9e795ef..b21cbd6 100644
--- a/common/Source/server/SC_Carbon.cpp
+++ b/common/Source/server/SC_Carbon.cpp
@@ -63,7 +63,8 @@ bool sc_HasVectorUnit()
 	return response & (1<<gestaltPowerPCHasVectorInstructions);
 }
 
-#if TARGET_CPU_X86
+#ifdef __SSE__
+#include <xmmintrin.h>
 
 void sc_SetDenormalFlags()
 {
diff --git a/common/Source/server/SC_CoreAudio.cpp b/common/Source/server/SC_CoreAudio.cpp
index 0541f24..2187d74 100644
--- a/common/Source/server/SC_CoreAudio.cpp
+++ b/common/Source/server/SC_CoreAudio.cpp
@@ -918,6 +918,41 @@ bool SC_CoreAudioDriver::DriverSetup(int* outNumSamplesPerCallback, double* outS
 	if(mWorld->mVerbosity >= 1){
 		scprintf("<-SC_CoreAudioDriver::Setup world %08X\n", mWorld);
 	}
+	
+	
+	
+	//check if using built-in output, and thus whether there could be headphone plug/un-plug issues 
+	//our assumption otherwise is that we don't respond, and SC will stay with the pre-arranged or default device, and not restart just because headphones switched 
+	
+	err = AudioDeviceGetPropertyInfo(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &count, 0);
+	if (err != kAudioHardwareNoError) {
+		scprintf("info kAudioDevicePropertyDeviceName error %4.4s %08X\n", (char*)&err, mOutputDevice);
+		return false; 
+	}
+	
+	char *outputname = (char*)malloc(count);
+	char *testname = "Built-in Output"; 
+	err = AudioDeviceGetProperty(mOutputDevice, 0, false, kAudioDevicePropertyDeviceName, &count, outputname);
+	if (err != kAudioHardwareNoError) {
+		scprintf("get kAudioDevicePropertyDeviceName error %4.4s %08X\n", (char*)&err, mOutputDevice);
+		return false;
+	}
+	builtinoutputflag_ = 0; 
+	
+	if (strcmp(testname, outputname) == 0) {
+		builtinoutputflag_ = 1;
+	}
+// else {
+//	
+//		//check for an Aggregate Devices with a subdevice which is Built-in Output
+//		//http://lists.apple.com/archives/coreaudio-api/2009/Oct/msg00182.html
+//		
+//		
+//	}
+
+	free(outputname);
+	
+	
 	return true;
 }
 
@@ -1161,6 +1196,114 @@ void SC_CoreAudioDriver::Run(const AudioBufferList* inInputData,
 	mAudioSync.Signal();
 }
 
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////
+// These are not linked in yet, but we'll need to listen for the properties and stop/restart synthesis
+// if sample-rate, format, or device change.
+
+OSStatus	hardwareListenerProc (	AudioHardwarePropertyID	inPropertyID,
+								  void*					inClientData)
+{
+    OSStatus			err = noErr;
+    char				cStr[255];
+    UInt32				outSize;
+    Boolean				outWritable;
+    AudioDeviceID		deviceID;
+	
+    switch(inPropertyID)
+    {
+        case kAudioHardwarePropertyDefaultOutputDevice:
+            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultOutputDevice\r");
+            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultOutputDevice,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &outSize, &deviceID);
+			if (err) break;
+			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
+			if (err) break;
+			
+			// do something
+			
+            break;
+			
+        case kAudioHardwarePropertyDefaultInputDevice:
+            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultInputDevice\r");
+            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultInputDevice,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &outSize, &deviceID);
+			if (err) break;
+			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
+			if (err) break;
+			
+			// do something
+			
+            break;
+			
+        case kAudioHardwarePropertyDefaultSystemOutputDevice:
+            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultSystemOutputDevice\r");
+            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultSystemOutputDevice,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultSystemOutputDevice, &outSize, &deviceID);
+			if (err) break;
+			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
+			if (err) break;
+			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
+			if (err) break;
+			
+			// do something
+			
+            break;
+			
+        case kAudioHardwarePropertyDevices:
+        {
+            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDevices\r");
+        }
+            break;
+		default:
+			scprintf("%s\n", "***** HARDWARE NOTIFICATION - %4.4s\r", &inPropertyID);
+	}
+	
+    fflush(stdout);
+    return (noErr);
+}
+
+
+
+
+OSStatus AddDeviceListeners(AudioDeviceID inDevice, void *inClientData);
+
+OSStatus AddHardwareListeners(void* inClientData);
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+OSStatus AddHardwareListeners(void* inClientData)
+{
+    OSStatus			err = noErr;
+
+	//non deprecated but requires AudiObject, bleargh 
+	//err= AudioObjectAddPropertyListener(AudioObject, kAudioHardwarePropertyDefaultOutputDevice, hardwareListenerProc, inClientData); 
+
+    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultOutputDevice, hardwareListenerProc, inClientData);
+    if (err) return err;
+	
+    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultInputDevice, hardwareListenerProc, inClientData);
+    if (err) return err;
+	
+	//doesn't matter? Only default looked at by SC? 
+	err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultSystemOutputDevice, hardwareListenerProc, inClientData);
+    if (err) return err;
+	
+    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDevices, hardwareListenerProc, inClientData);
+    if (err) return err;
+	
+    return (err);
+}
+
 bool SC_CoreAudioDriver::DriverStart()
 {
 	if(mWorld->mVerbosity >= 1){
@@ -1269,9 +1412,32 @@ bool SC_CoreAudioDriver::DriverStart()
 	if(mWorld->mVerbosity >= 1){
 		scprintf("<-SC_CoreAudioDriver::DriverStart\n");
 	}
+	
+	
+	//http://lists.apple.com/archives/coreaudio-api/2010/Aug/msg00114.html
+	CFRunLoopRef theRunLoop =  NULL;
+	AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+	AudioObjectSetPropertyData(kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop);
+	
+	//for now no spotting of hardware changes, assumption is that ServerOptions inviolate. However, if a device was unplugged, could react to loss of that device
+	//by switching to system default? 
+	//AddHardwareListeners(NULL); 
+	//note that the number of listeners is stripped down to only one for now, to react to headphone swaps in the case of Built-in Output
+	AddDeviceListeners(mOutputDevice, this); 
+	
 	return true;
 }
 
+
+bool SC_CoreAudioDriver::StopStart() {
+	
+	bool test = DriverStop(); 
+	
+	bool test2 = DriverStart();
+	return test && test2; 
+}
+
+
 bool SC_CoreAudioDriver::DriverStop()
 {
 	if(mWorld->mVerbosity >= 1){
@@ -1322,83 +1488,8 @@ bool SC_CoreAudioDriver::DriverStop()
 }
 
 
-//////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////
-// These are not linked in yet, but we'll need to listen for the properties and stop/restart synthesis
-// if sample-rate, format, or device change.
-
-OSStatus	hardwareListenerProc (	AudioHardwarePropertyID	inPropertyID,
-                                    void*					inClientData)
-{
-    OSStatus			err = noErr;
-    char				cStr[255];
-    UInt32				outSize;
-    Boolean				outWritable;
-    AudioDeviceID		deviceID;
-
-    switch(inPropertyID)
-    {
-        case kAudioHardwarePropertyDefaultOutputDevice:
-            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultOutputDevice\r");
-            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultOutputDevice,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &outSize, &deviceID);
-			if (err) break;
-			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
-			if (err) break;
-
-			// do something
-
-            break;
-
-        case kAudioHardwarePropertyDefaultInputDevice:
-            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultInputDevice\r");
-            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultInputDevice,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &outSize, &deviceID);
-			if (err) break;
-			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
-			if (err) break;
-
-			// do something
-
-            break;
-
-        case kAudioHardwarePropertyDefaultSystemOutputDevice:
-            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDefaultSystemOutputDevice\r");
-            err =  AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDefaultSystemOutputDevice,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultSystemOutputDevice, &outSize, &deviceID);
-			if (err) break;
-			err =  AudioDeviceGetPropertyInfo(deviceID, 0, false, kAudioDevicePropertyDeviceName,  &outSize, &outWritable);
-			if (err) break;
-			err = AudioDeviceGetProperty(deviceID, 0, false, kAudioDevicePropertyDeviceName, &outSize, cStr);
-			if (err) break;
-
-			// do something
-
-            break;
-
-        case kAudioHardwarePropertyDevices:
-        {
-            scprintf("%s\n", "***** HARDWARE NOTIFICATION - kAudioHardwarePropertyDevices\r");
-        }
-            break;
-		default:
-             scprintf("%s\n", "***** HARDWARE NOTIFICATION - %4.4s\r", &inPropertyID);
-   }
-
-    fflush(stdout);
-    return (noErr);
-}
-
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Listen for Device Properties and update interface abd globals
+// Listen for Device Properties and update interface and globals
 OSStatus	deviceListenerProc (	AudioDeviceID			inDevice,
 									UInt32					inLine,
 									Boolean					isInput,
@@ -1413,81 +1504,98 @@ OSStatus	deviceListenerProc (	AudioDeviceID			inDevice,
     UInt32				tLong;
 	Float32				vol;
 
+	
+	SC_CoreAudioDriver* coredriver = (SC_CoreAudioDriver*) inClientData; 
+	
     switch(inPropertyID)
     {
-        case kAudioDevicePropertyBufferSize:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferSize\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, 0, 0, kAudioDevicePropertyBufferSize, &outSize, &theUIntData);
-
-            break;
-
-        case kAudioDevicePropertyBufferFrameSize:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferFrameSize\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, 0, 0, kAudioDevicePropertyBufferFrameSize, &outSize, &theUIntData);
-
-            break;
-
-       case kAudioDevicePropertyBufferSizeRange:
-        {
-            AudioValueRange		range;
-
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferSizeRange\r");
-            outSize = sizeof(AudioValueRange);
-            err = AudioDeviceGetProperty(inDevice, 0, isInput, kAudioDevicePropertyBufferSizeRange, &outSize, &range);
-		}
-			break;
-
-        case kAudioDevicePropertyStreamFormat:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyStreamFormat\r");
-            break;
-
-        case kAudioDevicePropertyDeviceIsRunning:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDeviceIsRunning\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyDeviceIsRunning, &outSize, &theUIntData);
-
-             break;
-
-        case kAudioDevicePropertyVolumeScalar:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyVolumeScalar\r");
-            outSize = sizeof(Float32);
-            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyVolumeScalar, &outSize, &vol);
-            break;
-
-        case kAudioDevicePropertyMute:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyMute\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyMute, &outSize, &mute);
-            break;
-
-        case kAudioDevicePropertyPlayThru:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyPlayThru\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyPlayThru, &outSize, &playThru);
-
-            break;
-
-        case kAudioDevicePropertyDeviceIsAlive:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDeviceIsAlive\r");
-            outSize = sizeof(UInt32);
-            err = AudioDeviceGetProperty(inDevice, 0, false, kAudioDevicePropertyDeviceIsAlive, &outSize, &tLong);
-
-            break;
+ //       case kAudioDevicePropertyBufferSize:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferSize\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, 0, 0, kAudioDevicePropertyBufferSize, &outSize, &theUIntData);
+//
+//            break;
+//
+//        case kAudioDevicePropertyBufferFrameSize:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferFrameSize\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, 0, 0, kAudioDevicePropertyBufferFrameSize, &outSize, &theUIntData);
+//
+//            break;
+//
+//       case kAudioDevicePropertyBufferSizeRange:
+//        {
+//            AudioValueRange		range;
+//
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyBufferSizeRange\r");
+//            outSize = sizeof(AudioValueRange);
+//            err = AudioDeviceGetProperty(inDevice, 0, isInput, kAudioDevicePropertyBufferSizeRange, &outSize, &range);
+//		}
+//			break;
+//
+//        case kAudioDevicePropertyStreamFormat:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyStreamFormat\r");
+//            break;
+//
+//        case kAudioDevicePropertyDeviceIsRunning:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDeviceIsRunning\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyDeviceIsRunning, &outSize, &theUIntData);
+//
+//			//when change device get up to four messages:
+//			//isInput ==NO or YES  theUIntData= 0 or 1 from old and possibly new device (ieheadphone swap)
+//		
+//		
+//			
+//             break;
+//
+//        case kAudioDevicePropertyVolumeScalar:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyVolumeScalar\r");
+//            outSize = sizeof(Float32);
+//            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyVolumeScalar, &outSize, &vol);
+//            break;
+//
+//        case kAudioDevicePropertyMute:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyMute\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyMute, &outSize, &mute);
+//            break;
+//
+//        case kAudioDevicePropertyPlayThru:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyPlayThru\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, inLine, isInput, kAudioDevicePropertyPlayThru, &outSize, &playThru);
+//
+//            break;
+//
+//        case kAudioDevicePropertyDeviceIsAlive:
+//            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDeviceIsAlive\r");
+//            outSize = sizeof(UInt32);
+//            err = AudioDeviceGetProperty(inDevice, 0, false, kAudioDevicePropertyDeviceIsAlive, &outSize, &tLong);
+//
+//            break;
 
         case kAudioDevicePropertyDataSource:
-            scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDataSource\r");
+			//Don't print anything
+            //scprintf("%s\n", "***** DEVICE NOTIFICATION - kAudioDevicePropertyDataSource\r");
             // get the source
             // match the source to one of the available sources and return the index of that source
             //SetControlValue(control, (chan->vol) * 100);
+			
+			//will get this message anyway even if don't have built-in output seleected. 
+			//so need to react based on whether current output IS built-in output. Annoyingly, headphone unplugging/plugging also sends default and system output + default input change hardware messages
+			//swapping to new driver
+			if (coredriver->builtinoutputflag_==1)
+				coredriver->StopStart(); 
+			
+			
             break;
 
-		default:
-             scprintf("%s\n", "***** DEVICE NOTIFICATION - %4.4s\r", &inPropertyID);
+		//default:
+           //  scprintf("%s\n", "***** DEVICE NOTIFICATION - %4.4s\r", &inPropertyID);
     }
 
-    fflush(stdout);
+	//fflush(stdout);
     return (err);
 }
 
@@ -1525,112 +1633,98 @@ OSStatus    AddDeviceListeners(AudioDeviceID inDevice, void *inClientData)
 {
     OSStatus		err = noErr;
 
-    // kAudioDevicePropertyBufferSize
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferSize, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferSize, deviceListenerProc, inClientData);
-    if (err) return err;
-
-
-    // kAudioDevicePropertyBufferFrameSize
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferFrameSize, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferFrameSize, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    // kAudioDevicePropertyDeviceIsRunning
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyDeviceIsRunning, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDeviceIsRunning, deviceListenerProc, inClientData);
-    if (err) return err;
-
-/*
-    for (i = 0; i <= deviceInfo->totalOutputChannels; i++)
-    {
-        // kAudioDevicePropertyVolumeScalar output
-        err = AudioDeviceAddPropertyListener(inDevice, i, false, kAudioDevicePropertyVolumeScalar, deviceListenerProc, inClientData);
-        if (err) return err;
-
-        // kAudioDevicePropertyVolumeMute output
-        err = AudioDeviceAddPropertyListener(inDevice, i, false, kAudioDevicePropertyMute, deviceListenerProc, inClientData);
-        if (err) return err;
-    }
-
-    for (i = 0; i <= deviceInfo->totalInputChannels; i++)
-    {
-        // kAudioDevicePropertyVolumeScalar input
-        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyVolumeScalar, deviceListenerProc, inClientData);
-        if (err) return err;
-
-        // kAudioDevicePropertyVolumeMute input
-        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyMute, deviceListenerProc, inClientData);
-        if (err) return err;
-
-        // kAudioDevicePropertyPlayThru input
-        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyPlayThru, deviceListenerProc, inClientData);
-        if (err) return err;
-    }
-*/
-
-    // kAudioDevicePropertyDeviceIsAlive
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyDeviceIsAlive, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDeviceIsAlive, deviceListenerProc, inClientData);
-    if (err) return err;
-
-
-    // kAudioDevicePropertyStreamFormat
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyStreamFormat, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyStreamFormat, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    // kAudioDevicePropertyBufferSizeRange
-    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferSizeRange, deviceListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferSizeRange, deviceListenerProc, inClientData);
-    if (err) return err;
+//ONLY REACTING TO HEADPHONE SWAPS FOR NOW	
+//	
+//
+//	
+//    // kAudioDevicePropertyBufferSize
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferSize, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferSize, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//
+//    // kAudioDevicePropertyBufferFrameSize
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferFrameSize, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferFrameSize, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    // kAudioDevicePropertyDeviceIsRunning
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyDeviceIsRunning, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDeviceIsRunning, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+///*
+//    for (i = 0; i <= deviceInfo->totalOutputChannels; i++)
+//    {
+//        // kAudioDevicePropertyVolumeScalar output
+//        err = AudioDeviceAddPropertyListener(inDevice, i, false, kAudioDevicePropertyVolumeScalar, deviceListenerProc, inClientData);
+//        if (err) return err;
+//
+//        // kAudioDevicePropertyVolumeMute output
+//        err = AudioDeviceAddPropertyListener(inDevice, i, false, kAudioDevicePropertyMute, deviceListenerProc, inClientData);
+//        if (err) return err;
+//    }
+//
+//    for (i = 0; i <= deviceInfo->totalInputChannels; i++)
+//    {
+//        // kAudioDevicePropertyVolumeScalar input
+//        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyVolumeScalar, deviceListenerProc, inClientData);
+//        if (err) return err;
+//
+//        // kAudioDevicePropertyVolumeMute input
+//        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyMute, deviceListenerProc, inClientData);
+//        if (err) return err;
+//
+//        // kAudioDevicePropertyPlayThru input
+//        err = AudioDeviceAddPropertyListener(inDevice, i, true, kAudioDevicePropertyPlayThru, deviceListenerProc, inClientData);
+//        if (err) return err;
+//    }
+//*/
+//
+//    // kAudioDevicePropertyDeviceIsAlive
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyDeviceIsAlive, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDeviceIsAlive, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//
+//    // kAudioDevicePropertyStreamFormat
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyStreamFormat, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyStreamFormat, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    // kAudioDevicePropertyBufferSizeRange
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyBufferSizeRange, deviceListenerProc, inClientData);
+//    if (err) return err;
+//
+//    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyBufferSizeRange, deviceListenerProc, inClientData);
+//    if (err) return err;
 
     //kAudioDevicePropertyDataSource
     err = AudioDeviceAddPropertyListener(inDevice, 0, false, kAudioDevicePropertyDataSource, deviceListenerProc, inClientData);
     if (err) return err;
 
-    err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDataSource, deviceListenerProc, inClientData);
-    if (err) return err;
+  //  err = AudioDeviceAddPropertyListener(inDevice, 0, true, kAudioDevicePropertyDataSource, deviceListenerProc, inClientData);
+   // if (err) return err;
 
 
-    AddStreamListeners (inDevice, kAudioStreamPropertyPhysicalFormat, false, inClientData);
+    //AddStreamListeners (inDevice, kAudioStreamPropertyPhysicalFormat, false, inClientData);
 
-    AddStreamListeners (inDevice, kAudioStreamPropertyPhysicalFormat, true, inClientData);
+    //AddStreamListeners (inDevice, kAudioStreamPropertyPhysicalFormat, true, inClientData);
 
     return (err);
 }
 
-// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-OSStatus AddHardwareListeners (void* inClientData)
-{
-    OSStatus			err = noErr;
 
-    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultOutputDevice, hardwareListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultInputDevice, hardwareListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDefaultSystemOutputDevice, hardwareListenerProc, inClientData);
-    if (err) return err;
-
-    err = AudioHardwareAddPropertyListener(kAudioHardwarePropertyDevices, hardwareListenerProc, inClientData);
-    if (err) return err;
-
-    return (err);
-}
 
 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 OSStatus	AddStreamListeners (AudioDeviceID inDevice, AudioDevicePropertyID	inPropertyID, Boolean isInput, void *inClientData)
diff --git a/common/build/ChangeLog b/common/build/ChangeLog
index d5b7226..870a65b 100644
--- a/common/build/ChangeLog
+++ b/common/build/ChangeLog
@@ -1,5 +1,60 @@
 Changes are listed below, grouped under each point release of SuperCollider.
 
+SuperCollider v3.4.4, released 2011-06
+======================================
+
+Dan Stowell (4):
+      Improve format of copyright/GPL notices (issue raised in debian pkging)
+      Clarify Fontana copyright in MoogFF (and don't use keyword 'copyright'     in files where he doesn't have copyright)
+      Update AUTHORS file
+      Remove unneeded PDF (debian raised query over copyright)
+
+Nick Collins (1):
+      Initial fix for headphones problem where plugging in or out headphones while using Built-in Output leads to loss of audio on OS X. Aggregate Devices not tackled at this point
+
+Tim Blechmann (15):
+      sclang: mathematical operators - clip2 fix
+      plugins: LPF - fix control-rate initialization
+      sclang: wii - don't use address of temporary
+      SCClassLibrary: ScoreStreamPlayer - do not add instances to server list
+      scsynth: apple - set denormal handling flags, if __SSE__ is defined
+      sclang: slotString - crash fix
+      plugins: XLine - correct handling of done actions
+      sclang: gc - introduce LazyCollect to avoid leak of frames and argument lists
+      plugins: Pitch.ar - fix crash for high execution period
+      3.4.4 version bump
+      changelog: fix version number
+      update changelog
+      sclang: parser - support message send syntax for unary operators
+      plugins: delay ugens - rt memory allocation may fail
+      sclang: compile fix
+
+SuperCollider v3.4.3
+======================================
+
+Dan Stowell (2):
+      SC 3.4 set correct SOVERSION 1.0.0 for libs, and install more properly.     (Changes ported from downstream debian packaging.)
+      lib SOVERSIONs back from 1.0.0 to 1, following debian-multimedia advice
+
+James Harkins (8):
+      Fix nowExecutingPath bug in scel (never backported?)
+      fix two bugs in NotificationCenter registerOneShot:
+      fix corner case in ClassBrowser
+      Fix asPseg bug for short curves array (which should wrap, not kill the stream)
+      Clear dataptr when closing a file (so that isClosed answers correctly)
+      Incorrectly used dataptr instead of fileptr in previous commit on this file
+      replace old, unsafe Dictionary test with a safer (but less OOPy) test
+      rats... I missed two others of the same
+
+Joshua Parmenter (1):
+      update version number
+
+Tim Blechmann (3):
+      scsynth: set ftz flag on osx
+      two commits: (1) simplify access to the superclass tree in Class. (2) when looking for a code file (openCodeFile) or cmd-J, it is now enough to select a full line, instead of havin
+      scons build system: libsclang build fix
+
+
 SuperCollider v3.4.2, released 2011-03
 ======================================
 
diff --git a/common/build/Help/UGens/Filters/MoogFF.html b/common/build/Help/UGens/Filters/MoogFF.html
index 025bd45..36dfa5a 100755
--- a/common/build/Help/UGens/Filters/MoogFF.html
+++ b/common/build/Help/UGens/Filters/MoogFF.html
@@ -45,7 +45,7 @@ span.Apple-tab-span {white-space:pre}
 <p class="p3">x.free;</p>
 <p class="p2"><br></p>
 <p class="p2"><br></p>
-<p class="p5"><i>Original Java code Copyright F. Fontana - August 2007 - </i><a href="mailto:federico.fontana at univr.it"><span class="s3"><i>federico.fontana at univr.it</i></span></a></p>
+<p class="p5"><i>Original Java code created by F. Fontana - August 2007 - </i><a href="mailto:federico.fontana at univr.it"><span class="s3"><i>federico.fontana at univr.it</i></span></a></p>
 <p class="p5"><i>Ported to C++ for SuperCollider by Dan Stowell</i></p>
 </body>
 </html>
diff --git a/common/build/SCClassLibrary/Common/Audio/MoogFF.sc b/common/build/SCClassLibrary/Common/Audio/MoogFF.sc
index 6f4f69e..151eba7 100755
--- a/common/build/SCClassLibrary/Common/Audio/MoogFF.sc
+++ b/common/build/SCClassLibrary/Common/Audio/MoogFF.sc
@@ -5,7 +5,7 @@ As described in the paper entitled
 by Federico Fontana
 appeared in the Proc. ICMC07, Copenhagen, 25-31 August 2007
 
-Original Java code Copyright F. Fontana - August 2007
+Original Java code created by F. Fontana - August 2007
 federico.fontana at univr.it
 
 Ported to C++ for SuperCollider by Dan Stowell - August 2007
diff --git a/common/build/SCClassLibrary/Common/Control/asScore/ScoreStreamPlayer.sc b/common/build/SCClassLibrary/Common/Control/asScore/ScoreStreamPlayer.sc
index ec14edb..d391b1c 100644
--- a/common/build/SCClassLibrary/Common/Control/asScore/ScoreStreamPlayer.sc
+++ b/common/build/SCClassLibrary/Common/Control/asScore/ScoreStreamPlayer.sc
@@ -25,7 +25,13 @@ ScoreStreamPlayer : Server {
 	var <>beats, <>tempo;
 	var <>bundleList, <>maxTime;
 
-	*new { ^super.new("record").latency_(0) }
+	*new { ^super.new("record").initScoreStreamPlayer }
+
+	initScoreStreamPlayer {
+		this.latency_(0);
+		Server.set.remove(this); // we do not want to be part of the server list
+		^this
+	}
 
 	beats2secs { | beats | ^beats }
 	secs2beats { | beats | ^beats }
diff --git a/common/build/SCClassLibrary/DefaultLibrary/Main.sc b/common/build/SCClassLibrary/DefaultLibrary/Main.sc
index 48b5cc2..6c56b15 100644
--- a/common/build/SCClassLibrary/DefaultLibrary/Main.sc
+++ b/common/build/SCClassLibrary/DefaultLibrary/Main.sc
@@ -1,7 +1,7 @@
 Main : Process {
 	// do not change the next lines manually:
 	//==== replace with new version from bash script ====
-classvar scVersionMajor=3, scVersionMinor=4, scVersionPostfix=".3";
+classvar scVersionMajor=3, scVersionMinor=4, scVersionPostfix=".4";
 	//==== end replace ====
 
 	var <platform, argv;
diff --git a/common/build/examples/GUI examples/ColorBrowser.scd b/common/build/examples/GUI examples/ColorBrowser.scd
index a5954ff..895fa74 100644
--- a/common/build/examples/GUI examples/ColorBrowser.scd	
+++ b/common/build/examples/GUI examples/ColorBrowser.scd	
@@ -1,5 +1,18 @@
 // Color Browser
-// (c) 2007 Tom Hall. 
+// (c) 2007 Tom Hall <scth at ludions.com>.
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 
 // !! Evaluate the X Windows color data (x = [...]) below first !!
 
diff --git a/common/build/examples/other/keepyuppy.scd b/common/build/examples/other/keepyuppy.scd
index 5b80843..3041cc4 100644
--- a/common/build/examples/other/keepyuppy.scd
+++ b/common/build/examples/other/keepyuppy.scd
@@ -1,7 +1,21 @@
 /*
 * KEEPY-UPPY
 *
-* An AUDIO-ONLY game written in SuperCollider by Dan Stowell (C) 2005
+* An AUDIO-ONLY game by Dan Stowell <danstowell at users.sourceforge.net> (C) 2005
+  *
+  *  This program is free software; you can redistribute it and/or modify
+  *  it under the terms of the GNU General Public License as published by
+  *  the Free Software Foundation; either version 2 of the License, or
+  *  (at your option) any later version.
+  *
+  *  This program is distributed in the hope that it will be useful,
+  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  *  GNU General Public License for more details.
+  *
+  *  You should have received a copy of the GNU General Public License
+  *  along with this program; if not, write to the Free Software
+  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 *
 * This game is inspired by the work of "One Switch"
 * http://www.oneswitch.org.uk/ - developing games and controllers
@@ -137,4 +151,4 @@ Task({
  
 }
 )
-~game.value; // Press Enter to play!
\ No newline at end of file
+~game.value; // Press Enter to play!
diff --git a/common/include/nova-simd/benchmarks/perf_counter.hpp b/common/include/nova-simd/benchmarks/perf_counter.hpp
index ec98fa4..407de25 100644
--- a/common/include/nova-simd/benchmarks/perf_counter.hpp
+++ b/common/include/nova-simd/benchmarks/perf_counter.hpp
@@ -1,4 +1,4 @@
-//  Copyright (C) 2008 Tim Blechmann
+//  Copyright (C) 2008 Tim Blechmann <tim at klingt.org>
 //
 //  This program is free software; you can redistribute it and/or modify
 //  it under the terms of the GNU General Public License as published by
diff --git a/common/include/nova-simd/libsimdmath/libsimdmath.pdf b/common/include/nova-simd/libsimdmath/libsimdmath.pdf
deleted file mode 100644
index cf5b6d6..0000000
Binary files a/common/include/nova-simd/libsimdmath/libsimdmath.pdf and /dev/null differ
diff --git a/editors/scel/el/sclang-minor-mode.el b/editors/scel/el/sclang-minor-mode.el
index 4a8cb9f..047ec38 100644
--- a/editors/scel/el/sclang-minor-mode.el
+++ b/editors/scel/el/sclang-minor-mode.el
@@ -1,7 +1,20 @@
 ;;; sclang-minor-mode for use in help files
 ;;; SuperCollider
-;;; (c) 2007, Marije Baalman - nescivi
-;;; released under GPL
+;;; (c) 2007, Marije Baalman - nescivi <nescivi at gmail.com>
+;;;
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;;  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 
 (easy-mmode-define-minor-mode sclang-minor-mode
   "Toggle sclang-minor-mode.
@@ -58,4 +71,4 @@ sclang code with the normal command C-c C-c and C-c C-d."
 (defun sclang-minor-hooks ()
   (sclang-init-document)
   (sclang-make-document)
-  )
\ No newline at end of file
+  )

-- 
supercollider packaging



More information about the pkg-multimedia-commits mailing list