[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