code: def test_read_and_write_multi(self, hop_size, samplerate, path):
      orig_samplerate = parse_file_samplerate(soundfile)
      try:
          if (
              orig_samplerate is not None
              and orig_samplerate < samplerate
          ):
              # upsampling should emit a warning
              with assert_warns(UserWarning):
                  f = source(soundfile, samplerate, hop_size)
          else:
              f = source(soundfile, samplerate, hop_size)
      except RuntimeError as e:
          err_msg = "{:s} (hop_s = {:d}, samplerate = {:d})"
          skipTest(err_msg.format(str(e), hop_size, samplerate))
      if samplerate == 0:
          samplerate = f.samplerate
      sink_path = get_tmp_sink_path()
      g = sink(sink_path, samplerate, channels=f.channels)
      total_frames = 0
      while True:
          vec, read = f.do_multi()
          g.do_multi(vec, read)
          total_frames += read
          if read < f.hop_size:
              break
      del_tmp_sink_path(sink_path)
  
file_path: aubio/python/tests/test_sink.py
imports: from numpy.testing import TestCase
  from aubio import fvec, source, sink
  from utils import list_all_sounds, get_tmp_sink_path, del_tmp_sink_path
  from utils import parse_file_samplerate
  from _tools import parametrize, skipTest, assert_raises, assert_warns
label_desc: Use image node_id 8 for calling the Test_aubio_sink obj's underlying member method code with example usage: obj.test_read_and_write_multi(hop_size, samplerate, path) without return types