docs: def read(self, frames, raw=False):
          """Read samples from an input stream.
  
          The function does not return until the required number of
          frames has been read. This may involve waiting for the
          operating system to supply the data.
  
          If raw data is requested, the raw cffi data buffer is
          returned. Otherwise, a numpy array of the appropriate dtype
          with one column per channel is returned.
  
          """
          channels, _ = _split(self.channels)
          dtype, _ = _split(self.dtype)
          data = ffi.new("signed char[]", channels * dtype.itemsize * frames)
          self._handle_error(_pa.Pa_ReadStream(self._stream, data, frames))
          if not raw:
              data = np.frombuffer(ffi.buffer(data), dtype=dtype)
              data.shape = frames, channels
          return data