bool plaPlayList::generatePLAFile() { try { // 5. generate playlist qint32 fileCount = (qint32)m_lstSrcFiles.count(); if (playlistName.isEmpty()) playlistName = "playlist.pla"; if (!playlistName.endsWith(".pla")) playlistName.append(".pla"); QFile file(playlistDestination + "/" + playlistName); file.open(QIODevice::Truncate | QIODevice::WriteOnly); if (!file.isOpen()) { qDebug() << "file does not open?"; return false; } QDataStream out(&file); out.setByteOrder(QDataStream::BigEndian); // Header info: qint32 (4 bytes) + iriver_text (14 bytes) = 18 bytes -> rest 494 bytes = 0 out << fileCount; out.writeRawData(iriverText.toLatin1(), iriverText.size()); // tolatin1 is serialized as 'length,string' ->use writeRawData int i = 494; while (0 < i) { out << (qint8)0; --i; } // File Info QString outputFile = ""; qint16 nameIndex = 0; foreach (QString song, m_lstSrcFiles) { if (song.length()>=512) { qDebug() << "Song " << song << " file path was too long, skipping it"; continue; } if(!getFileName(song, &outputFile, &nameIndex)) { qDebug() << "Song " << song << " path and index extraction failed, PLA is not usable!"; errorSignaling("ERROR", QString("Song '%1' path and index extraction failed, PLA is not usable!").arg(song)); return false; } qDebug() << " song: " << outputFile; out << nameIndex; out << (qint8)0; // ugly workaround! put '00' byte before '\' mark which is missing from outputFile string (for some reason)? out.writeRawData((const char*) outputFile.utf16(), outputFile.size() * 2); for (int i=(3+outputFile.size()*2); i<512; i++) out << (qint8)0; } qDebug() << "plaPlayList::generatePLAFile - data written, playlist size: " << file.size() << ", should be 512 + " << m_lstSrcFiles.count() << "*512 = " << 512 + m_lstSrcFiles.count() * 512; file.close(); OnReady(); return true; } catch (...) { qDebug() << "plaPlayList::generatePLAFile - Error while creating playlist"; return false; } }
bool plaPlayList::doWork() { try { // // work list // 1. generate destination files list (correct path information) // 2. check existence of destination files and filter out already existing ones // 3. check that we have enough space for missing files // 4. copy missing files to destination // 5. generate playlist and copy it to 'playlist destination' // if (checkDestinationFilesAvailability()) OnReady(); return true; } catch (...) { qDebug() << "plaPlayList::generatePLAFile - Error while creating playlist"; return false; } }
bool CEC_LogicalDevice::ProcessStateMachine(bool* success) { unsigned char buffer[1]; bool wait = false; switch (_primaryState) { case CEC_ALLOCATE_LOGICAL_ADDRESS: switch (_secondaryState) { case CEC_XMIT_POLLING_MESSAGE: // Section 6.1.3 specifies that <Polling Message> while allocating a Logical Address // will have the same initiator and destination address buffer[0] = MAKE_ADDRESS(_validLogicalAddresses[_deviceType][_tertiaryState], _validLogicalAddresses[_deviceType][_tertiaryState]); ClearTransmitBuffer(); Transmit(buffer, 1); _secondaryState = CEC_RCV_POLLING_MESSAGE; wait = true; break; case CEC_RCV_POLLING_MESSAGE: if (success) { if (*success) { // Someone is there, try the next _tertiaryState++; if (_validLogicalAddresses[_deviceType][_tertiaryState] != CLA_UNREGISTERED) _secondaryState = CEC_XMIT_POLLING_MESSAGE; else { _logicalAddress = CLA_UNREGISTERED; DbgPrint("Logical address assigned: %d\r\n", _logicalAddress); DbgPrint("Physical addresss used: %d\r\n", _physicalAddress); _primaryState = CEC_READY; } } else { // We hereby claim this as our logical address! _logicalAddress = _validLogicalAddresses[_deviceType][_tertiaryState]; SetAddress(_logicalAddress); DbgPrint("Logical address assigned: %d\n", _logicalAddress); DbgPrint("Physical addresss used: %d\r\n", _physicalAddress); _primaryState = CEC_READY; set_led(2, true); } } else wait = true; break; } break; case CEC_READY: _primaryState = CEC_IDLE; OnReady(); wait = true; break; case CEC_IDLE: wait = true; break; } return wait; }