2016-03-03 67 views
0

我正在嵌入式Linux平臺(Intel Edison)上用C++製作基本音樂播放器。運行需要輸入而不掛起的命令,但仍允許輸入

它通過發送命令到外殼使用mpg123來播放音樂。

播放音樂工作正常,但現在我需要添加媒體控件。我使用的是mpg123命令來播放我的MP3文件,如果你通過它的-C標誌,那麼它偵聽如p的暫停,q表示退出等

命令我使用的代碼從這個其他SO回答執行How to execute a command and get output of command within C++ using POSIX?

現在的事情是,當我運行該命令從C播放選定的歌曲++(例如,mpg123 -C /media/sdcard/Music/<songname>),它掛的C++程序的命令,直到該命令返回,不返回,直到歌曲已完成播放。我可以通過使用pthead在並行線程中運行該命令來消除該問題,但仍然不允許我根據需要輸入命令。

我想也許以某種方式在另一個tty運行命令,然後以某種方式將命令傳遞給mpg123發送到其他tty,但我無法找到一種方法來做到這一點。 (我不知道它的possable)

我一直在努力了幾個小時做這個,所以現在我已經準備好要問這裏的一些幫助:)

做任何你有什麼想法關於如何在不凍結線程的情況下運行命令(以pthread或其他方式),並且仍然能夠發送命令到mpg123

+0

所以,你基本上要'P'表示「暫停」你的MP3播放器,和'ls -l命令Private'列出在'Private'文件目錄,同時,沒有'P'代表'Private'意思是「暫停」?聽起來對我來說是不可能的。但是,是的,您可以使用管道或僞終端將事物從一個流程發送到另一個流程。哪個最有意義取決於你想要達到的目標 - 除了不可能之外,就是這樣。 –

+0

@MatsPetersson不太清楚你在那裏說什麼。在運行具有'-C'標誌的'mpg123'後,它監聽用於命令的輸入字符,例如'p'用於暫停。我需要找到一種方法來防止凍結線程的命令執行,但仍然可以將它發送給我的媒體控件的輸入字符 –

回答

2

聽起來你會想要使用mpg123的FIFO模式。你設置一個要使用的路徑名,指向它的mpg123,然後迴應你的命令。

answer有一個很好的例子

FIFO_MPG='/srv/http/newsctl' 
mpg123 -R --fifo "$FIFO_MPG" 
echo 'load filename.mp3' >> "$FIFO_MPG" 
相關問題