+++ /dev/null
-
-#include "keys.h"
-#include "mwindow.h"
-#include "mwindowgui.h"
-#include "androidcontrol.h"
-#include "preferences.h"
-
-
-int AndroidControl::open(unsigned short port)
-{
- sockfd = socket(PF_INET,SOCK_DGRAM,0);
- if( sockfd < 0 ) { perror("socket:"); return -1; }
-
- struct linger lgr;
- lgr.l_onoff = 0;
- lgr.l_linger = 0;
-
- if( setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &lgr, sizeof(lgr)) < 0 ) {
- perror("setlinger:");
- return -1;
- }
-
- struct sockaddr_in sadr;
- memset(&sadr,0,sizeof(sadr));
- sadr.sin_family = AF_INET;
- sadr.sin_port = htons(port);
- sadr.sin_addr.s_addr = 0;
-
- if( bind(sockfd,(struct sockaddr *)&sadr,sizeof(sadr)) < 0 ) {
- perror("bind:");
- return -1;
- }
-
- return 0;
-}
-
-void AndroidControl::close()
-{
- if( sockfd >= 0 ) {
- ::close(sockfd);
- sockfd = -1;
- }
-}
-
-AndroidControl::AndroidControl(MWindowGUI *mwindow_gui)
- : Thread(1, 0, 0)
-{
- this->mwindow_gui = mwindow_gui;
- Thread::start();
-}
-
-bool AndroidControl::is_msg(const char *cp)
-{
- if( msg_len != (int)strlen(cp) ) return false;
- if( strncmp(cp, msg, msg_len) ) return false;
- return true;
-}
-
-void AndroidControl::press(int key)
-{
-// printf("press 0x%04x\n",key);
- if( mwindow_gui->keyboard_listener(key) ) return;
- mwindow_gui->remote_control->remote_key(key);
-}
-
-void AndroidControl::run()
-{
- unsigned short port = mwindow_gui->mwindow->preferences->android_port;
- done = open(port) >= 0 ? 0 : 1;
-
- while( !done ) {
- struct sockaddr sadr;
- socklen_t sadr_len;
- enable_cancel();
- int ret = recvfrom(sockfd, buf, sizeof(buf), 0, &sadr, &sadr_len);
- if( ret < 0 ) {
- perror("AndroidControl::run: recvfrom");
- sleep(1);
- }
- disable_cancel();
- // validate message
- msg = buf; msg_len = ret;
- // cinelerra android remote magic number
- if( msg[0] != 'C' || msg[1] != 'A' || msg[2] != 'R' ) continue;
- // version number
- if( msg[3] != 1 ) continue;
- msg += 4; msg_len -= 4;
- // pin
- const char *pin = mwindow_gui->mwindow->preferences->android_pin;
- int len = sizeof(mwindow_gui->mwindow->preferences->android_pin);
- while( len > 0 && msg_len > 0 && *pin != 0 && *msg != 0 ) {
- if( *pin != *msg ) break;
- ++pin; --len;
- ++msg; --msg_len;
- }
- if( !len || !msg_len || *pin != *msg ) continue;
- ++msg; --msg_len;
- if( msg_len <= 0 ) continue;
- if( is_msg("stop") ) press(KPSTOP);
- else if( is_msg("play") ) press(KPPLAY);
- else if( is_msg("rplay") ) press(KPREV);
- else if( is_msg("pause") ) press(' ');
- else if( is_msg("fast_lt") ) press(KPBACK);
- else if( is_msg("media_up") ) press(UP);
- else if( is_msg("fast_rt") ) press(KPFWRD);
- else if( is_msg("menu") ) press(KPMENU);
- else if( is_msg("media_lt") ) press(LEFT);
- else if( is_msg("media_rt") ) press(RIGHT);
- else if( is_msg("slow_lt") ) press(KPRECD);
- else if( is_msg("media_dn") ) press(DOWN);
- else if( is_msg("slow_rt") ) press(KPAUSE);
- else if( is_msg("key 0") ) press('0');
- else if( is_msg("key 1") ) press('1');
- else if( is_msg("key 2") ) press('2');
- else if( is_msg("key 3") ) press('3');
- else if( is_msg("key 4") ) press('4');
- else if( is_msg("key 5") ) press('5');
- else if( is_msg("key 6") ) press('6');
- else if( is_msg("key 7") ) press('7');
- else if( is_msg("key 8") ) press('8');
- else if( is_msg("key 9") ) press('9');
- else if( is_msg("key A") ) press('a');
- else if( is_msg("key B") ) press('b');
- else if( is_msg("key C") ) press('c');
- else if( is_msg("key D") ) press('d');
- else if( is_msg("key E") ) press('e');
- else if( is_msg("key F") ) press('f');
- else if( is_msg("suspend") ) {
- system("sync; sleep 1; pm-suspend");
- }
- else if( is_msg("power") ) {
- system("sync; sleep 1; poweroff");
- }
- else {
- printf("AndroidControl::run: unkn msg: %s\n", msg);
- sleep(1);
- }
- }
-}
-
-AndroidControl::~AndroidControl()
-{
- if( Thread::running() ) {
- done = 1;
- Thread::cancel();
- Thread::join();
- }
-}
-