FANDOM


A Csound python server Edit

Here is what we are playing with at the moment, the 'universal server'.

#!/usr/bin/python
import select
import sys
import socket
import csnd
import threading

This is a multiple-client csound server class. the listener is put in a separate thread

class CsoundServerMult:

This is the listener thread function. It just waits for TCP connections

   def listen(self):
       while not self.end:
          print 'waiting for connections..'
          self.socks.listen(32)
          c, a = self.socks.accept()
          if self.end:
              print 'exiting...'
          else:
              print 'Connected to', a
          self.conn.append(c)
          self.addr.append(a)
          self.fd.append(c.fileno())
          self.cnt =+ 1
          

Server start-up:eventually setblocking should be made 0

   def __init__(self, port=40002):
       self.end = False
       self.port = port
       self.socks = socket.socket()
       self.socks.bind((, self.port))
       self.conn = list()
       self.addr = list()
       self.fd = list()
       self.cnt = 0
       self.socks.setblocking(1)
       print "Csound Python server@%s:%d" % (socket.gethostname(), port)
       self.listener = threading.Thread(None,self.listen)
       self.listener.start()

This is the interpreter function. If something is seen on the socket, it executes it as Python code

   def interpret(self):

This runs the universal orchestra (univorc.csd) and starts the performance. Eventually, we will have to cron a csound instance reset and re-compile after a while to clear up memory.

       csound = csnd.Csound()
       perf = csnd.CsoundPerformanceThread(csound)
       csound.Compile('univorc.csd')
       perf.Play()

This is the interpreter loop:

       while not self.end:
          r,w,x = select.select(self.fd,[],[], 0)
          for  i in r:
             try:
              socks = socket.fromfd(i,socket.AF_INET,socket.SOCK_STREAM)
              data = socks.recv(256)
              exec data
             except:
              print "exception in code: " + data

This is the shut-off function. It is a bit of a hack, because the listening thread is blocked at socket.listen(). So we need to unblock it by making a connection, then it can quit the loop and exit

   def off(self):
       self.end = True
       sc = socket.socket()
       sc.connect(('localhost',self.port))
       sc.close()
       for i in self.conn:
         i.close()
       self.end = True
       self.socks.close()

The script can run as the 'main' application or the CsoundServerMult class can be re-used by another program.

if __name__=="__main__":
   if len(sys.argv) == 2:
           s = CsoundServerMult(int(sys.argv[1]))
   else:
           s = CsoundServerMult()
   s.interpret()

See Also Edit

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.