最近,我一直在尝试将命名管道的输出重定向到运行的omxplayer实例(请参阅here以获取尽管它应该控制omxplayer的最小工作示例)。我怀疑它与读取和写入管道有关 - 也许新的行被附加 - 所以我得到了一些帮助并写了一个C程序写入管道并从中读取(参见here但事实证明它也不是读/写错误。所以我去跟踪omxplayer的代码,认为无论它有多复杂,最终都必须有一个标准C ++代码读取用户输入的地方,感谢上帝我发现它。根据我的理解,这是一种方法,负责获取用户输入并为Dbus做好准备以实现其天堂般的善良:
void Keyboard::Process()
{
while(!m_bStop && conn && dbus_connection_read_write_dispatch(conn, 0))
{
int ch[8];
int chnum = 0;
while ((ch[chnum] = getchar()) != EOF) chnum++;
if (chnum > 1) ch[0] = ch[chnum - 1] | (ch[chnum - 2] << 8);
if (m_keymap[ch[0]] != 0)
send_action(m_keymap[ch[0]]);
else
Sleep(20);
}
}
据我所知,while(!m_bStop...
只是为了确保事情仍然有效,m_keymap
是一个匹配整数的密码,例如'p'
或{{1枚举'q'
和ACTION_PAUSE
之类的值,我假设ACTION_QUIT
只是让球滚动。
问题:
这是我不明白的地方:
send_action()
(如果你对此感到困惑,当电影正在播放时我按 p 暂停电影,而不是 p 然后 Enter < / kbd>或 Ctrl + D )。我附上了一个标有while ((ch[chnum] = getchar()) != EOF)
的小脚本,说明了它是如何永远循环的。getchar.c
的长度仅为8时,为什么我们在while循环while ((ch[chnum] = getchar()) != EOF) chnum++
中循环可能超过8次迭代? ch
?if (chnum > 1) ch[0] = ch[chnum - 1] | (ch[chnum - 2] << 8)
)无法成功控制播放器吗?getchar.c:
omxplayer_test.c
omxplayer_test.c:
#include <stdio.h>
int main( int argc, char *argv[] ) {
int ch [ 8 ];
int chnum = 0;
while ( ( ch [ chnum ] = getchar() ) != EOF ) chnum++;
printf ( "You will never make it here!\n" );
return 0;
}
答案 0 :(得分:1)
@puk我偶然发现了你的“旧”问题,但万一你自己没有回答。
查看https://github.com/popcornmix/omxplayer/issues/131上类似的内容。由于omxplayer
版本0.3.x来自此“popcornmix
”存储库,我将在那里回答这些问题,因为 是您omxplayer
个问题的更好地方。 )
但我会回答为什么omxplayer_test.c
无效 的问题,因为您的代码让omxplayer
失败: )严格不正确,因为它是omxplayer
中的当前问题:(
I_MESSAGE的发送让我感到惊讶,因为我不知道'。'上的任何键盘输入处理。字符。另一方面,'i'命令omxplayer转到上一章。所以,如果你没有对'。'进行键映射。输入密钥或意味着真正的“我”行为,只需将其留下;它不是(也不应该)启动omxplayer
。
暂停omxplayer
,您使用I_MESSAGE
而不是P_MESSAGE
对其进行了拼写错误。
但是使用消息的write()和 sizeof()向omxplayer发送命令会产生与上述问题中提到的相同的效果。 sizeof()
的{{1}}得到2作为结果,而不是1(一)! x_MESSAGE
计算(c编码)字符串的sizeof()
;例如'\0'-character
存储为"p"
,因此至少包含2个字符。因此,请使用 'p''\0'
(需要strlen()
),因为它只会发送#include <string.h>
字符。