2017-07-12 22 views
0

FMラジオを再生していて、ストリーミング中に自分のRTL-SDRの周波数を変更しようとしています(つまり、 )Raspberry PiでFMラジオを再生する、再起動せずに周波数を変更する

現在、ステーションを再生していますので、ステーション/周波数をゆっくりと増やすことができます。しかし、あまりに速くインクリメントすると、SDRの再生が停止します。

私が使用しています:

  • ラズベリーのパイ3、Pythonの2.7.9に書き込み
  • NooElec R820T SDR & DVB-T USBドングル入力所望の周波数
  • pi-encoderから
  • ロータリエンコーダライブラリ
  • rtl_fmを受信して​​再生するようにしてください。

私のコードは、現在、次のとおりです。

import os 
import time 
import subprocess 

from pi_encoder import * 

def updateStation(station_addr, kill=0): 
    print 'creating pipe1a' 
    pipe1a = subprocess.Popen(['rtl_fm', '-M', 'wbfm', '-f', str(station_addr) + 'M', '-g', '10'], stdout=subprocess.PIPE) 
    print 'creating pipe1b' 
    pipe1b = subprocess.Popen(['play', '-r', '32k', '-t', 'raw', '-e', 's', '-b', '16', '-c', '1', '-V1', '-'], stdin=pipe1a.stdout, stdout=subprocess.PIPE) 
    print 'creating pipe1c' 
    pipe1c = pipe1b.stdout 

    pid_a = pipe1a.pid 
    return pid_a, pipe1a 

# Export LD_LIBRARY_PATH; doesn't seem to retain 
os.system('export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib') 

## Rotary encoder GPIO PIN assignments are set in 'pi_encoder' module 

## SET INITIAL VALUES 
tuner_value = 0 
station_addr = 95.1 
max_tuner_addr = 109.1 
min_tuner_addr = 88.0 

## INITIALIZE ROTARY ENCODER WORKER THREAD 
tuner_encoder = EncoderWorker(SwitchEncoder(TUNER_CLK_PIN, TUNER_DT_PIN, TUNER_SW_PIN)) 
tuner_encoder.start() 

## MAIN LOOP 
try: 
    print 'Starting main loop' 
    pid, process = updateStation(station_addr) 
    while True: 
     delta_tuner = tuner_encoder.get_delta() 

     if delta_tuner!=0: 
      tuner_value = tuner_value + delta_tuner 
      print "tuner value", tuner_value 
      station_addr = station_addr + (delta_tuner/10.0) 
      if station_addr > max_tuner_addr: 
       station_addr = max_tuner_addr 
      elif station_addr < min_tuner_addr: 
       station_addr = min_tuner_addr 
      print 'station_address: ', station_addr 

      print 'terminating process:' 
      process.terminate() 
      try: 
       os.kill(pid, 0) 
       process.kill() 
      except OSError, e: 
       print 'Terminated gracefully' 

      pid, process = updateStation(station_addr) 

     if tuner_encoder.get_upEvent(): 
      print "tuner up!" 

     if tuner_encoder.get_downEvent(): 
      print "tuner down!" 

finally: 
    print 'Cleaning up GPIO...' 
    IO.cleanup() 

はこの使用に耐性Pythonのサブプロセスはありますか?

再生に影響しないステーション/フリークエンシーをよりスムーズかつ素早く変更したり、SDRの再生を停止させる別の方法(コマンド、メソッド、ライブラリ)がありますか?

答えて

0

updateStation呼び出しで新しいプロセスを開始する前に、process.kill()が終了しパイプが閉じる(非同期に発生する)のを待つ必要があるかもしれません。 OSが確実に処理できるよりも速くプロセスコマンドを送信するのを防ぐために、killの後のメインwhile()ループに小さな遅延を入れてみてください。

+0

私は各呼び出しの間にスリープ状態で 'updateStation'機能を10回テストしました。私は安定したままの0.6秒の睡眠になることができました。その下に、それは薄れていた。 – spearna

+0

あなたのお勧めは私が行くつもりだと思います。競争状態がb/wを殺して新しい呼び出しをするのを防ぐためにキャッチを実装します。私はまた、希望の駅に到着するまでrtl_fmコマンドを呼ぶのを避けるために、駅の速い変更に対応するキャッチを追加します。 – spearna

関連する問題