omxplayer中的复杂getchar()操作

时间:2013-11-23 10:27:47

标签: c++ linux media-player getchar

最近,我一直在尝试将命名管道的输出重定向到运行的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只是让球滚动。

问题:

这是我不明白的地方:

  1. 当我甚至没有按 Enter - &gt;时,如何检测到EOF? send_action()(如果你对此感到困惑,当电影正在播放时我按 p 暂停电影,而不是 p 然后 Enter < / kbd>或 Ctrl + D )。我附上了一个标有while ((ch[chnum] = getchar()) != EOF)的小脚本,说明了它是如何永远循环的。
  2. 当数组getchar.c的长度仅为8时,为什么我们在while循环while ((ch[chnum] = getchar()) != EOF) chnum++中循环可能超过8次迭代?
  3. 这可能是特定于实现的,但是为什么当所有输入都保证为1个字符长时,大小为8的数组(我可以在地图中看到它,并且可以立即处理键)。这是否与箭头键和转义键有关?
  4. 假设可能有多于1个字符,不知何故,该行应该做什么ch
  5. 最后,了解omxplayer如何读取用户生成的输入,有人能告诉我为什么我的简单脚本(标记为if (chnum > 1) ch[0] = ch[chnum - 1] | (ch[chnum - 2] << 8))无法成功控制播放器吗?
  6. 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;
    }
    

1 个答案:

答案 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>字符。