質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Python

    9169questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    894questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

threading時に起こるpyaudioのエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 309

YMD_kts

score 6

こちらの質問にあるように常時音を監視して一定異常の音量が鳴った回数を記録するプログラムとLEDの点灯を切り替えるプログラムをthreadingで並列処理させるプログラムを組んだのですが、並列処理はできているようなのデスがpyaudioでエラーが発生してしまいました。

Start
Expression 'alsa_snd_pcm_mmap_begin( self->pcm, &areas, &self->offset, numFrames )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 3983
Expression 'PaAlsaStreamComponent_RegisterChannels( &self->capture, &self->bufferProcessor, &captureFrames, &xrun )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 4098
Expression 'PaAlsaStream_SetUpBuffers( stream, &framesGot, &xrun )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 4426
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/home/pi/Desktop/py/final/judgeFunction.py", line 32, in judgeFunc
    data = stream.read(CHUNK)
  File "/usr/lib/python2.7/dist-packages/pyaudio.py", line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
IOError: [Errno -9999] Unanticipated host error

End


このstartとendはLEDの切り替えの合図です
コードと関数を記します

import threading
import elcFunc as ef
import judgeFunction as jf

if __name__ == "__main__":
    thread1 = threading.Thread(target = jf.judgeFunc)
    thread2 = threading.Thread(target = ef.noteStart)

    thread2.start()
    thread1.start()

    jf.judgeEnd()
def judgeFunc():
    while True:
        global score
        data = stream.read(CHUNK)
        x = np.frombuffer(data, dtype="int16") / 32768.0
        if x.max() > threshold:
            score += 1
            print(score)
def noteStart():

    global a,i
    initAll()

    while a == True:
        print("Start")
        wiringpi.digitalWrite(GPIO26, LOW)
        wiringpi.digitalWrite(GPIO21, LOW)

        lf.noteLeft(random.randint(0, 15))
        suc = rf.noteRight(random.randint(0, 15))
        time.sleep(2)

        while i < 28:
            lf.noteLeft(suc)
            suc = rf.noteRight(random.randint(0, 15))
            time.sleep(2)
            i = i+1

        wiringpi.digitalWrite(GPIO21, HIGH)
        rf.endRight()

        lf.noteLeft(suc)
        time.sleep(2)

        wiringpi.digitalWrite(GPIO26, HIGH)
        lf.endLeft()

        a = False


エラーコードで検索をかけても情報が少なく解決できませんでした。
分かる方回答の方よろしくお願いいたします。

追記
jf.judgeEnd関数です。

def judgeEnd():
    stream.close()
    p.terminate()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • umyu

    2018/07/12 00:01 編集

    jf.judgeEnd()の処理を質問文のコードに追記してくださいな。

    キャンセル

  • YMD_kts

    2018/07/13 10:26

    追記しました。

    キャンセル

回答 1

checkベストアンサー

+1

jf.judgeEnd()関数の追記ありがとうございました。
環境が無いので、憶測の回答になってしまいますが。

def judgeEnd():
    stream.close() #←原因はこの行です。
    p.terminate()


そう判断した理由を書きます。

[Errno -9999] Unanticipated host errorで検索すると一番最初のページとして
Using any other values in pyaudio for rate / format / chunk give me the error: [Errno Input overflowed] -9981のページがHITします。

"open" and "close"がポイントだと分かります。

    thread1 = threading.Thread(target = jf.judgeFunc)
    thread2 = threading.Thread(target = ef.noteStart)

    thread2.start()
    thread1.start()

    jf.judgeEnd()


Threadstart()を行った後もメインスレッドの処理は続きます。
stream.close()を実行後に、data = stream.read(CHUNK)が呼び出されて、
質問文のエラーが発生したと思われます。

一度余分な機能のない、スレッドプログラム。
スレッドid(threading.get_ident())と時刻を出力するprint文のみを作成してみるのがいいと思います。

対策方法は
案1)judgeFunc内で、ループ終了時にjudgeEndを呼び出す。
案2)jf.judgeEnd()の前の行にthread1.join()を追加して、終了待ちをする。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/13 11:27

    試しにjudgeEnd()をコメントアウトしたら無事並列処理できました!
    勝手にThreadのstart()の部分で処理が止まっているもの太戸勘違いしてました...
    お早い回答有難うございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    9169questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    894questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。