diff --git a/encode.py b/encode.py
index f8be026..42ee5d1 100755
--- a/encode.py
+++ b/encode.py
@@ -25,23 +25,39 @@ along with this program. If not, see .
import os
import sys
import logging
-
+import wave
+import struct
NAME = 'manchester-encoder'
VERSION = '0.1'
DESCRIPTION = 'Encodes a file using the manchester encoding and outputs it as audio file'
FRAME_DELIMITER = 129 # (1, 0, 0, 0, 0, 0, 0, 1)
-
+AUDIO_VOLUME = 16384 # 0 to 32767
+AUDIO_BITRATE = 44100
class Main:
def __init__(self):
self._log = logging.getLogger('main')
+ self.audioSink = None
def run(self, inputFile, outputFile, clock):
- # Open output file
+ self.clock = int(clock)
+
+ # Check clock speed is valid
+ if self.clock > (AUDIO_BITRATE / 2):
+ raise ValueError("Clock too high: max supported clock is {}".format(AUDIO_BITRATE/2))
+
+ # Open output audio file
+ self.audioSink = wave.open(outputFile, 'w')
+ self.audioSink.setnchannels(1) # mono
+ self.audioSink.setsampwidth(2)
+ self.audioSink.setframerate(44100.0)
+
+ # Preamble
+ self.outputPreamble()
# Read input file
bytesToEncode = []
@@ -65,6 +81,7 @@ class Main:
# Encode byte
self.encodeByte(byte)
+ self.audioSink.close()
self._log.info('Completed')
def encodeByte(self, byte):
@@ -94,7 +111,7 @@ class Main:
# Outputs the preable: a sequence of 64 "1" and "0" used to facilitate the receiver
# syncronizing on our clock. The sequence starts with 1 and ends with 0
for x in range(64):
- self.encode(x % 2 == 0)
+ self.encodeBit(x % 2 == 0)
def encodeBit(self, bit):
# Encodes a single bit in a pair of bits to be written on the media.
@@ -109,10 +126,16 @@ class Main:
def out(self, encodedBit):
# Write already encoded bit on the media
+ value = 0
if encodedBit:
- print('―', end='')
+ value = AUDIO_VOLUME
else:
- print('_', end='')
+ value = -AUDIO_VOLUME
+
+ # The duration of the signal is calculated based on the user-specified clock speed
+ duration = int(AUDIO_BITRATE / self.clock)
+ for x in range(duration):
+ self.audioSink.writeframesraw(struct.pack('