/* * Copyright (C) 2005-2007 by Daniel Wagner * * This file is part of FFADO * FFADO = Free Firewire (pro-)audio drivers for linux * * FFADO is based upon FreeBoB * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "avc_plug_info.h" #include "libutil/cmd_serialize.h" #include "libieee1394/ieee1394service.h" #include #include using namespace std; namespace AVC { PlugInfoCmd::PlugInfoCmd( Ieee1394Service& ieee1394service, ESubFunction eSubFunction ) : AVCCommand( ieee1394service, AVC1394_CMD_PLUG_INFO ) , m_serialBusIsochronousInputPlugs( 0xff ) , m_serialBusIsochronousOutputPlugs( 0xff ) , m_externalInputPlugs( 0xff ) , m_externalOutputPlugs( 0xff ) , m_serialBusAsynchronousInputPlugs( 0xff ) , m_serialBusAsynchronousOuputPlugs( 0xff ) , m_destinationPlugs( 0xff ) , m_sourcePlugs( 0xff ) , m_subFunction( eSubFunction ) { } PlugInfoCmd::PlugInfoCmd( const PlugInfoCmd& rhs ) : AVCCommand( rhs ) , m_serialBusIsochronousInputPlugs( rhs.m_serialBusIsochronousInputPlugs ) , m_serialBusIsochronousOutputPlugs( rhs.m_serialBusIsochronousOutputPlugs ) , m_externalInputPlugs( rhs.m_externalInputPlugs ) , m_externalOutputPlugs( rhs.m_externalOutputPlugs ) , m_serialBusAsynchronousInputPlugs( rhs.m_serialBusAsynchronousInputPlugs ) , m_serialBusAsynchronousOuputPlugs( rhs.m_serialBusAsynchronousOuputPlugs ) , m_destinationPlugs( rhs.m_destinationPlugs ) , m_sourcePlugs( rhs.m_sourcePlugs ) , m_subFunction( rhs.m_subFunction ) { } PlugInfoCmd::~PlugInfoCmd() { } void PlugInfoCmd::clear() { m_serialBusIsochronousInputPlugs=0xff; m_serialBusIsochronousOutputPlugs=0xff; m_externalInputPlugs=0xff; m_externalOutputPlugs=0xff; m_serialBusAsynchronousInputPlugs=0xff; m_serialBusAsynchronousOuputPlugs=0xff; m_destinationPlugs=0xff; m_sourcePlugs=0xff; } bool PlugInfoCmd::serialize( Util::IOSSerialize& se ) { byte_t reserved = 0xff; AVCCommand::serialize( se ); se.write( m_subFunction, "PlugInfoCmd subFunction" ); switch( getSubunitType() ) { case eST_Unit: switch( m_subFunction ) { case eSF_SerialBusIsochronousAndExternalPlug: se.write( m_serialBusIsochronousInputPlugs, "PlugInfoCmd serialBusIsochronousInputPlugs" ); se.write( m_serialBusIsochronousOutputPlugs, "PlugInfoCmd serialBusIsochronousOutputPlugs" ); se.write( m_externalInputPlugs, "PlugInfoCmd externalInputPlugs" ); se.write( m_externalOutputPlugs, "PlugInfoCmd externalOutputPlugs" ); break; case eSF_SerialBusAsynchonousPlug: se.write( m_serialBusAsynchronousInputPlugs, "PlugInfoCmd serialBusAsynchronousInputPlugs" ); se.write( m_serialBusAsynchronousOuputPlugs, "PlugInfoCmd serialBusAsynchronousOuputPlugs" ); se.write( reserved, "PlugInfoCmd" ); se.write( reserved, "PlugInfoCmd" ); break; default: cerr << "Could not serialize with subfucntion " << m_subFunction << endl; return false; } break; default: se.write( m_destinationPlugs, "PlugInfoCmd destinationPlugs" ); se.write( m_sourcePlugs, "PlugInfoCmd sourcePlugs" ); se.write( reserved, "PlugInfoCmd" ); se.write( reserved, "PlugInfoCmd" ); } return true; } bool PlugInfoCmd::deserialize( Util::IISDeserialize& de ) { byte_t reserved; AVCCommand::deserialize( de ); de.read( &m_subFunction ); switch ( getSubunitType() ) { case eST_Unit: switch ( m_subFunction ) { case eSF_SerialBusIsochronousAndExternalPlug: de.read( &m_serialBusIsochronousInputPlugs ); de.read( &m_serialBusIsochronousOutputPlugs ); de.read( &m_externalInputPlugs ); de.read( &m_externalOutputPlugs ); break; case eSF_SerialBusAsynchonousPlug: de.read( &m_serialBusAsynchronousInputPlugs ); de.read( &m_serialBusAsynchronousOuputPlugs ); de.read( &reserved ); de.read( &reserved ); break; default: cerr << "Could not deserialize with subfunction " << m_subFunction << endl; return false; } break; default: de.read( &m_destinationPlugs ); de.read( &m_sourcePlugs ); de.read( &reserved ); de.read( &reserved ); } return true; } bool PlugInfoCmd::setSubFunction( ESubFunction subFunction ) { m_subFunction = subFunction; return true; } }