mirror of
https://github.com/F5OEO/rpitx.git
synced 2026-03-23 16:56:54 +01:00
45 lines
1.3 KiB
Python
45 lines
1.3 KiB
Python
"""Python interface to rpitx."""
|
|
|
|
from pydub import AudioSegment
|
|
import StringIO
|
|
import _rpitx
|
|
import array
|
|
import logging
|
|
import os
|
|
import wave
|
|
|
|
|
|
def broadcast_fm(file_, frequency):
|
|
"""Play a music file over FM."""
|
|
|
|
logging.basicConfig()
|
|
logger = logging.getLogger('rpitx')
|
|
|
|
def _reencode(file_name):
|
|
"""Returns an AudioSegment file reencoded to the proper WAV format."""
|
|
original = AudioSegment.from_file(file_name)
|
|
if original.channels > 2:
|
|
raise ValueError('Too many channels in sound file')
|
|
if original.channels == 2:
|
|
# TODO: Support stereo. For now, just overlay into mono.
|
|
logger.info('Reducing stereo channels to mono')
|
|
left, right = original.split_to_mono()
|
|
original = left.overlay(right)
|
|
|
|
return original
|
|
|
|
raw_audio_data = _reencode(file_)
|
|
|
|
wav_data = StringIO.StringIO()
|
|
wav_writer = wave.open(wav_data, 'w')
|
|
wav_writer.setnchannels(1)
|
|
wav_writer.setsampwidth(2)
|
|
wav_writer.setframerate(48000)
|
|
wav_writer.writeframes(raw_audio_data.raw_data)
|
|
wav_writer.close()
|
|
|
|
raw_array = array.array('c')
|
|
raw_array.fromstring(wav_data.getvalue())
|
|
array_address, length = raw_array.buffer_info()
|
|
_rpitx.broadcast_fm(array_address, length, frequency)
|