00001 #include "linuxavcinfo.h"
00002
00003
00004 #include "mythcontext.h"
00005
00006 #define LOC QString("LAVCInfo(): ")
00007 #define LOC_WARN QString("LAVCInfo(), Warning: ")
00008 #define LOC_ERR QString("LAVCInfo(), Error: ")
00009
00010 bool LinuxAVCInfo::Update(uint64_t _guid, raw1394handle_t handle,
00011 uint _port, uint _node)
00012 {
00013 port = _port;
00014 node = _node;
00015
00016 if (guid == _guid)
00017 return true;
00018
00020
00021
00022 rom1394_directory dir;
00023 if (rom1394_get_directory(handle, _node, &dir) < 0)
00024 return false;
00025
00026 guid = _guid;
00027 vendorid = dir.vendor_id;
00028 modelid = dir.model_id;
00029 specid = dir.unit_spec_id;
00030 firmware_revision = dir.unit_sw_version;
00031 product_name = QString("%1").arg(dir.label);
00032
00033 if (avc1394_subunit_info(handle, node, (uint32_t*)unit_table) < 0)
00034 memset(unit_table, 0xff, sizeof(unit_table));
00035
00036 return true;
00037 }
00038
00039 bool LinuxAVCInfo::OpenPort(void)
00040 {
00041 VERBOSE(VB_RECORD, LOC + "Getting raw1394 handle for port "<<port);
00042 fw_handle = raw1394_new_handle_on_port(port);
00043
00044 if (!fw_handle)
00045 {
00046 VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to get handle for " +
00047 QString("port: %1").arg(port) + ENO);
00048
00049 return false;
00050 }
00051
00052 return true;
00053 }
00054
00055 bool LinuxAVCInfo::ClosePort(void)
00056 {
00057 if (fw_handle)
00058 {
00059 VERBOSE(VB_RECORD, LOC + "Releasing raw1394 handle");
00060 raw1394_destroy_handle(fw_handle);
00061 fw_handle = NULL;
00062 }
00063
00064 return true;
00065 }
00066
00067 bool LinuxAVCInfo::SendAVCCommand(
00068 const vector<uint8_t> &_cmd,
00069 vector<uint8_t> &result,
00070 int retry_cnt)
00071 {
00072 retry_cnt = (retry_cnt < 0) ? 2 : retry_cnt;
00073
00074 result.clear();
00075
00076 if (!fw_handle || (node < 0))
00077 return false;
00078
00079 vector<uint8_t> cmd = _cmd;
00080 while (cmd.size() & 0x3)
00081 cmd.push_back(0x00);
00082
00083 if (cmd.size() > 4096)
00084 return false;
00085
00086 uint32_t cmdbuf[1024];
00087 for (uint i = 0; i < cmd.size(); i+=4)
00088 cmdbuf[i>>2] = cmd[i]<<24 | cmd[i+1]<<16 | cmd[i+2]<<8 | cmd[i+3];
00089
00090 uint result_length = 0;
00091
00092 #ifdef USING_LIBAVC_5_3
00093 uint32_t *ret = avc1394_transaction_block2(
00094 fw_handle, node, cmdbuf, cmd.size() >> 2,
00095 &result_length, retry_cnt);
00096 #else // if !USING_LIBAVC_5_3
00097 uint32_t *ret = avc1394_transaction_block(
00098 fw_handle, node, cmdbuf, cmd.size() >> 2, retry_cnt);
00099 result_length = cmd.size() >> 2;
00100 #endif // !USING_LIBAVC_5_3
00101
00102 if (!ret)
00103 return false;
00104
00105 for (uint i = 0; i < result_length; i++)
00106 {
00107 result.push_back((ret[i]>>24) & 0xff);
00108 result.push_back((ret[i]>>16) & 0xff);
00109 result.push_back((ret[i]>>8) & 0xff);
00110 result.push_back((ret[i]) & 0xff);
00111 }
00112
00113 #ifdef USING_LIBAVC_5_3
00114 avc1394_transaction_block_close(fw_handle);
00115 #endif // USING_LIBAVC_5_3
00116
00117 return true;
00118 }