512
515
PyoPaBackendData *be_data = (PyoPaBackendData *) self->audio_be_data;
514
517
if (Pa_IsStreamActive(be_data->stream) || ! Pa_IsStreamStopped(be_data->stream)) {
515
err = Pa_StopStream(be_data->stream);
516
portaudio_assert(err, "Pa_StopStream");
518
self->server_started = 0;
519
//err = Pa_StopStream(be_data->stream);
520
//portaudio_assert(err, "Pa_StopStream");
519
err = Pa_CloseStream(be_data->stream);
520
portaudio_assert(err, "Pa_CloseStream");
523
// err = Pa_CloseStream(be_data->stream);
524
// portaudio_assert(err, "Pa_CloseStream");
522
526
err = Pa_Terminate();
523
527
portaudio_assert(err, "Pa_Terminate");
567
571
while(ports[i]!=NULL && be_data->jack_in_ports[i] != NULL){
568
572
if (jack_connect (be_data->jack_client, ports[i], jack_port_name(be_data->jack_in_ports[i]))) {
569
Server_warning(self, "Jack: cannot connect input ports\n");
573
Server_error(self, "Jack: cannot connect input ports\n");
583
587
while(ports[i]!=NULL && be_data->jack_out_ports[i] != NULL){
584
588
if (jack_connect (be_data->jack_client, jack_port_name (be_data->jack_out_ports[i]), ports[i])) {
585
Server_warning(self, "Jack: cannot connect output ports\n");
589
Server_error(self, "Jack: cannot connect output ports\n");
618
622
if (status & JackServerStarted) {
619
Server_message(self, "JACK server started.\n");
623
Server_warning(self, "JACK server started.\n");
621
625
if (strcmp(self->serverName, jack_get_client_name(be_data->jack_client)) ) {
622
626
strcpy(self->serverName, jack_get_client_name(be_data->jack_client));
759
Server_message(self, " %d : \"%s\"\n", i, name);
763
Server_debug(self, " %d : \"%s\"\n", i, name);
786
790
if (err != kAudioHardwareNoError) {
787
791
Server_error(self, "Get kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mInputDevice);
789
Server_message(self, "Coreaudio : Uses input device : \"%s\"\n", name);
793
Server_debug(self, "Coreaudio : Uses input device : \"%s\"\n", name);
790
794
self->input = mInputDevice;
813
817
if (err != kAudioHardwareNoError) {
814
818
Server_error(self, "Get kAudioDevicePropertyDeviceName error %s A %08X\n", (char*)&err, mOutputDevice);
816
Server_message(self, "Coreaudio : Uses output device : \"%s\"\n", name);
820
Server_debug(self, "Coreaudio : Uses output device : \"%s\"\n", name);
817
821
self->output = mOutputDevice;
880
884
if (err != kAudioHardwareNoError)
881
885
Server_error(self, "set kAudioDevicePropertyBufferFrameSize error %4.4s\n", (char*)&err);
883
Server_message(self, "pyo buffer size set to output device buffer size : %i\n", self->bufferSize);
887
Server_debug(self, "pyo buffer size set to output device buffer size : %i\n", self->bufferSize);
886
Server_message(self, "Coreaudio : Changed output device buffer size successfully: %i\n", self->bufferSize);
890
Server_debug(self, "Coreaudio : Changed output device buffer size successfully: %i\n", self->bufferSize);
888
892
if (self->duplex == 1) {
889
893
err = AudioDeviceSetProperty(mInputDevice, &now, 0, false, kAudioDevicePropertyBufferFrameSize, count, &self->bufferSize);
903
907
if (err != kAudioHardwareNoError)
904
908
Server_error(self, "set kAudioDevicePropertyNominalSampleRate error %s\n", (char*)&err);
906
Server_message(self, "pyo sampling rate set to output device sampling rate : %i\n", self->samplingRate);
910
Server_debug(self, "pyo sampling rate set to output device sampling rate : %i\n", self->samplingRate);
909
Server_message(self, "Coreaudio : Changed output device sampling rate successfully: %.2f\n", self->samplingRate);
913
Server_debug(self, "Coreaudio : Changed output device sampling rate successfully: %.2f\n", self->samplingRate);
911
915
if (self->duplex ==1) {
912
916
pyoSamplingRate = self->samplingRate;
1064
Server_offline_init (Server *self)
1070
Server_offline_deinit (Server *self)
1076
Server_offline_start (Server *self)
1068
Server_offline_init(Server *self)
1074
Server_offline_deinit(Server *self)
1080
*Server_offline_thread(void *arg)
1084
self = (Server *)arg;
1086
if (self->recdur < 0) {
1087
Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
1090
Server_message(self,"Offline Server rendering file %s dur=%f\n", self->recpath, self->recdur);
1091
numBlocks = ceil(self->recdur * self->samplingRate/self->bufferSize);
1092
Server_debug(self,"Number of blocks: %i\n", numBlocks);
1093
Server_start_rec_internal(self, self->recpath);
1094
while (numBlocks-- > 0 && self->server_stopped == 0) {
1095
offline_process_block((Server *) self);
1097
self->server_started = 0;
1099
sf_close(self->recfile);
1100
Server_message(self,"Offline Server rendering finished.\n");
1105
Server_offline_nb_start(Server *self)
1107
pthread_t offthread;
1108
pthread_create(&offthread, NULL, Server_offline_thread, self);
1113
Server_offline_start(Server *self)
1078
1117
if (self->recdur < 0) {
1079
1118
Server_error(self,"Duration must be specified for Offline Server (see Server.recordOptions).");
1082
1121
Server_message(self,"Offline Server rendering file %s dur=%f\n", self->recpath, self->recdur);
1083
int numBlocks = ceil(self->recdur * self->samplingRate/self->bufferSize);
1122
numBlocks = ceil(self->recdur * self->samplingRate/self->bufferSize);
1084
1123
Server_debug(self,"Number of blocks: %i\n", numBlocks);
1085
1124
Server_start_rec_internal(self, self->recpath);
1086
1125
while (numBlocks-- > 0 && self->server_stopped == 0) {
1087
offline_process_block((Server *) self);
1126
offline_process_block((Server *) self);
1089
1128
self->server_started = 0;
1090
1129
self->record = 0;
1118
1156
memset(&buffer, 0, sizeof(buffer));
1119
1157
PyGILState_STATE s = PyGILState_Ensure();
1120
for (i=0; i<count; i++) {
1158
for (i=0; i<server->stream_count; i++) {
1121
1159
stream_tmp = (Stream *)PyList_GET_ITEM(server->streams, i);
1122
1160
if (Stream_getStreamActive(stream_tmp) == 1) {
1123
1161
Stream_callFunction(stream_tmp);
1320
1361
Server_dealloc(Server* self)
1322
Server_shut_down(self);
1363
if (self->server_booted == 1)
1364
Server_shut_down(self);
1323
1365
Server_clear(self);
1324
1366
free(self->input_buffer);
1367
free(self->output_buffer);
1325
1368
free(self->serverName);
1326
1370
self->ob_type->tp_free((PyObject*)self);
1387
1430
else if (strcmp(audioType, "offline") == 0) {
1388
1431
self->audio_be_type = PyoOffline;
1433
else if (strcmp(audioType, "offline_nb") == 0) {
1434
self->audio_be_type = PyoOfflineNB;
1391
1437
Server_warning(self, "Unknown audio type. Using Portaudio\n");
1392
1438
self->audio_be_type = PyoPortaudio;
1398
1444
self->recpath = getenv("HOME");
1399
1445
if (self->recpath != NULL)
1400
1446
strncat(self->recpath, "/pyo_rec.wav", strlen("/pyo_rec.wav"));
1405
1451
static PyObject *
1406
1452
Server_setInputDevice(Server *self, PyObject *arg)
1778
1824
Server_offline_deinit(self);
1828
audioerr = Server_offline_init(self);
1830
Server_offline_deinit(self);
1782
1834
// Must allocate buffer after initializing the audio backend in case parameters change there
1783
1835
if (self->input_buffer) {
1857
1911
case PyoOffline:
1858
1912
err = Server_offline_start(self);
1915
err = Server_offline_nb_start(self);
1862
Server_error(self, "Error starting server.");
1919
Server_error(self, "Error starting server.\n");
1865
1922
Py_INCREF(Py_None);
2011
2071
return PyInt_FromLong(-1);
2013
2073
if (tmp == NULL) {
2014
Server_error(self, "Need a pyo object as argument\n");
2074
Server_error(self, "Server_addStream needs a pyo object as argument.\n");
2015
2075
return PyInt_FromLong(-1);
2019
2078
PyList_Append(self->streams, tmp);
2021
2080
self->stream_count++;
2157
2218
{"setDuplex", (PyCFunction)Server_setDuplex, METH_O, "Sets the server's duplex mode (0 = only out, 1 = in/out)."},
2158
2219
{"setGlobalSeed", (PyCFunction)Server_setGlobalSeed, METH_O, "Sets the server's global seed for random objects."},
2159
2220
{"setAmp", (PyCFunction)Server_setAmp, METH_O, "Sets the overall amplitude."},
2160
{"setAmpCallable", (PyCFunction)Server_setAmpCallable, METH_O, "Sets the Server's GUI object."},
2161
{"setTimeCallable", (PyCFunction)Server_setTimeCallable, METH_O, "Sets the Server's TIME object."},
2221
{"setAmpCallable", (PyCFunction)Server_setAmpCallable, METH_O, "Sets the Server's GUI callable object."},
2222
{"setTimeCallable", (PyCFunction)Server_setTimeCallable, METH_O, "Sets the Server's TIME callable object."},
2162
2223
{"setVerbosity", (PyCFunction)Server_setVerbosity, METH_O, "Sets the verbosity."},
2163
2224
{"setStartOffset", (PyCFunction)Server_setStartOffset, METH_O, "Sets starting time offset."},
2164
2225
{"boot", (PyCFunction)Server_boot, METH_NOARGS, "Setup and boot the server."},