from matplotlib.pyplot import *
import numpy
from numpy import *

import struct
import wave

# Bins at 1024
#CHANNEL_BINS = [372, 377, 383, 389, 395, 406, 412, 418]

# Bins at 1323
#CHANNEL_BINS = [480, 488, 495, 503, 510, 518, 525, 533, 472, 600]

# Bins at 1323/2
CHANNEL_BINS = [240, 244, 247, 251, 255, 259, 262, 266, 236, 300]

def read_hidden_data(fylname):
  wav = wave.open(fylname, 'r')
  framerate_hz = wav.getframerate()

  window_size = 1323 / 2

  x = numpy.arange(8)
  num_fft = wav.getnframes() / (2 * window_size) - 2


  temp = numpy.zeros((num_fft, window_size), numpy.float_)
  
  for i in xrange(num_fft):
    trash = wav.readframes(window_size/2 + 1)
    tempb = wav.readframes(window_size)
    trash = wav.readframes(window_size/2 + 1)
    try:
      temp[i,:] = array(struct.unpack('%dh' % window_size, tempb),
                        numpy.float_)
    except struct.error:
      print len(tempb)
      pass
  wav.close()

  temp *= hamming(window_size)

  freq_pwr = abs(fft.rfft(temp, window_size))

  print [fft.fftfreq(window_size, 1.0/44100)[freq] for freq in CHANNEL_BINS]
  channels = numpy.array([[row[freq] for freq in CHANNEL_BINS] for row in freq_pwr],
                         numpy.float_)
  plot([x[8]-x[9] for x in channels[:100]])
  return to_bytes(channels)

def to_bytes(floats):
  ret = []
  for row in floats:
    level =  row[8] + (row[9] - row[8]) / 2
    num = sum(((1 << x) if row[x] >= level else 0) for x in xrange(len(CHANNEL_BINS) - 2))
    ret.append(num)
  return ret

def extract(inp, outp):
  channels = read_hidden_data(inp)
  outfyl = open(outp, 'w')
  outfyl.write(''.join(chr(x) for x in channels[4:]))

