bastibe/SoundCard

[Report] soundcard with synthplayer module on macos.

noboruatkek opened this issue · 1 comments

I test an example script for synthplayer module, examples/synth_demo.py, on macos, then I got the following message:

File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/soundcard/coreaudio.py", line 464, in init
raise TypeError("blocksize must be between {} and {}"
TypeError: blocksize must be between 14.0 and 512

After studying soundcard/synthplaer, I noticed that maxblcoksize of AudioUnit may be changed internally. So that requested blocksize may exceed the maxblocksize, then we will get the error message above. I modified soundcard/coreaudio.py slightly, shown below:

@@ -458,12 +458,14 @@
# there are two maximum block sizes for some reason:
maxblocksize = min(self.blocksizerange[1],
self.maxblocksize)

  •    if self.blocksizerange[0] <= blocksize <= maxblocksize:
    
  •    if self.blocksizerange[0] <= blocksize <= self.blocksizerange[1]:
    
  •        if maxblocksize < blocksize: self.maxblocksize=blocksize
           self.blocksize = blocksize
       else:
    
  •        raise TypeError("blocksize must be between {} and {}"
    
  •                        .format(self.blocksizerange[0],
    
  •                                maxblocksize))
    
  •        raise TypeError("blocksize({}) must be between {} and {}"
    
  •                        .format(blocksize, self.blocksizerange[0],
    
  •                                self.blocksizerange[1]))
    
       if isinstance(channels, collections.abc.Iterable):
           if iotype == 'output':
    

@@ -585,6 +587,13 @@
_cac.kAudioUnitScope_Global, 0, "UInt32")
assert maxblocksize
return maxblocksize
+

  • @maxblocksize.setter
  • def maxblocksize(self, newblocksize):
  •    data = _ffi.new("UInt32*", newblocksize)
    
  •    self._set_property(
    
  •        _cac.kAudioUnitProperty_MaximumFramesPerSlice,
    
  •        _cac.kAudioUnitScope_Global, 0, data)
    

Now I can run the synthplayer example script, synth_demo.py, with some parameter adjustment( params.norm_frames_per_chunk=1024) .

Thank you very much for make the nice program available to u.s.

Please reformat so it makes sense on Github.