- def decode(self, ss, es, data):
- for self.samplenum, (sck, ws, sd) in data:
-
- # Ignore sample if the bit clock hasn't changed.
- if sck == self.oldsck:
- continue
-
- self.oldsck = sck
- if sck == 0: # Ignore the falling clock edge.
- continue
+ def wav_header(self):
+ # Chunk descriptor
+ h = b'RIFF'
+ h += b'\x24\x80\x00\x00' # Chunk size (2084)
+ h += b'WAVE'
+ # Fmt subchunk
+ h += b'fmt '
+ h += b'\x10\x00\x00\x00' # Subchunk size (16 bytes)
+ h += b'\x01\x00' # Audio format (0x0001 == PCM)
+ h += b'\x02\x00' # Number of channels (2)
+ h += b'\x80\x3e\x00\x00' # Samplerate (16000)
+ h += b'\x00\x7d\x00\x00' # Byterate (32000)
+ h += b'\x04\x00' # Blockalign (4)
+ h += b'\x10\x00' # Bits per sample (16)
+ # Data subchunk
+ h += b'data'
+ h += b'\xff\xff\x00\x00' # Subchunk size (65535 bytes) TODO
+ return h
+
+ def wav_sample(self, sample):
+ # TODO: This currently assumes U32 samples, and converts to S16.
+ s = sample >> 16
+ if s >= 0x8000:
+ s -= 0x10000
+ lo, hi = s & 0xff, (s >> 8) & 0xff
+ return bytes([lo, hi])
+
+ def decode(self):
+ if not self.samplerate:
+ raise SamplerateError('Cannot decode without samplerate.')
+ while True:
+ # Wait for a rising edge on the SCK pin.
+ sck, ws, sd = self.wait({0: 'r'})