Skip to content

Commit e006fdc

Browse files
Add chop ability to ReadWriteStream
Also adds tests for read write stream
1 parent 695c0eb commit e006fdc

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

runner/precise_runner/runner.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
import atexit
16+
17+
import time
1618
from subprocess import PIPE, Popen
1719
from threading import Thread, Event
1820

@@ -72,17 +74,25 @@ def __init__(self, listener, chunk_size=2048):
7274

7375

7476
class ReadWriteStream(object):
75-
"""Class used to support writing binary audio data at any pace"""
76-
def __init__(self, s=b''):
77+
"""
78+
Class used to support writing binary audio data at any pace,
79+
optionally chopping when the buffer gets too large
80+
"""
81+
def __init__(self, s=b'', chop_samples=-1):
7782
self.buffer = s
7883
self.write_event = Event()
84+
self.chop_samples = chop_samples
7985

8086
def read(self, n=-1, timeout=None):
8187
if n == -1:
8288
n = len(self.buffer)
89+
if 0 < self.chop_samples < len(self.buffer):
90+
self.buffer = self.buffer[self.chop_samples:]
91+
return_time = time.time() + (float('inf') if timeout is None else timeout)
8392
while len(self.buffer) < n:
8493
self.write_event.clear()
85-
self.write_event.wait(timeout)
94+
if not self.write_event.wait(return_time - time.time()):
95+
return b''
8696
chunk = self.buffer[:n]
8797
self.buffer = self.buffer[n:]
8898
return chunk

runner/test/test_runner.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from precise_runner import ReadWriteStream
2+
3+
4+
class TestReadWriteStream:
5+
def test_read_write(self):
6+
s = ReadWriteStream(b'1234567890')
7+
assert s.read(2) == b'12'
8+
assert s.read(2) == b'34'
9+
s.write(b'hi')
10+
assert s.read() == b'567890hi'
11+
s.write(b'hello')
12+
assert s.read() == b'hello'
13+
assert s.read(1, timeout=0.1) == b''
14+
15+
def test_chop(self):
16+
s = ReadWriteStream(chop_samples=10)
17+
s.write(b'1234567890hello')
18+
assert s.read(5) == b'hello'

0 commit comments

Comments
 (0)