Author: ppalmers Date: 2007-07-28 02:43:03 -0700 (Sat, 28 Jul 2007) New Revision: 502 Added: branches/echoaudio/src/libavc/audiosubunit/ branches/echoaudio/src/libavc/audiosubunit/avc_function_block.cpp branches/echoaudio/src/libavc/audiosubunit/avc_function_block.h branches/echoaudio/src/libavc/ccm/ branches/echoaudio/src/libavc/ccm/avc_signal_source.cpp branches/echoaudio/src/libavc/ccm/avc_signal_source.h branches/echoaudio/src/libavc/descriptors/ branches/echoaudio/src/libavc/descriptors/avc_descriptor.cpp branches/echoaudio/src/libavc/descriptors/avc_descriptor.h branches/echoaudio/src/libavc/descriptors/avc_descriptor_cmd.cpp branches/echoaudio/src/libavc/descriptors/avc_descriptor_cmd.h branches/echoaudio/src/libavc/general/ branches/echoaudio/src/libavc/general/avc_connect.cpp branches/echoaudio/src/libavc/general/avc_connect.h branches/echoaudio/src/libavc/general/avc_extended_cmd_generic.cpp branches/echoaudio/src/libavc/general/avc_extended_cmd_generic.h branches/echoaudio/src/libavc/general/avc_extended_plug_info.cpp branches/echoaudio/src/libavc/general/avc_extended_plug_info.h branches/echoaudio/src/libavc/general/avc_extended_subunit_info.cpp branches/echoaudio/src/libavc/general/avc_extended_subunit_info.h branches/echoaudio/src/libavc/general/avc_generic.cpp branches/echoaudio/src/libavc/general/avc_generic.h branches/echoaudio/src/libavc/general/avc_plug_info.cpp branches/echoaudio/src/libavc/general/avc_plug_info.h branches/echoaudio/src/libavc/general/avc_subunit_info.cpp branches/echoaudio/src/libavc/general/avc_subunit_info.h branches/echoaudio/src/libavc/general/avc_unit_info.cpp branches/echoaudio/src/libavc/general/avc_unit_info.h branches/echoaudio/src/libavc/musicsubunit/ branches/echoaudio/src/libavc/musicsubunit/avc_descriptor_music.cpp branches/echoaudio/src/libavc/musicsubunit/avc_descriptor_music.h branches/echoaudio/src/libavc/streamformat/ branches/echoaudio/src/libavc/streamformat/avc_extended_stream_format.cpp branches/echoaudio/src/libavc/streamformat/avc_extended_stream_format.h branches/echoaudio/src/libavc/util/ branches/echoaudio/src/libavc/util/avc_serialize.cpp branches/echoaudio/src/libavc/util/avc_serialize.h Removed: branches/echoaudio/src/libavc/avc_connect.cpp branches/echoaudio/src/libavc/avc_connect.h branches/echoaudio/src/libavc/avc_descriptor.cpp branches/echoaudio/src/libavc/avc_descriptor.h branches/echoaudio/src/libavc/avc_descriptor_cmd.cpp branches/echoaudio/src/libavc/avc_descriptor_cmd.h branches/echoaudio/src/libavc/avc_descriptor_music.cpp branches/echoaudio/src/libavc/avc_descriptor_music.h branches/echoaudio/src/libavc/avc_extended_cmd_generic.cpp branches/echoaudio/src/libavc/avc_extended_cmd_generic.h branches/echoaudio/src/libavc/avc_extended_plug_info.cpp branches/echoaudio/src/libavc/avc_extended_plug_info.h branches/echoaudio/src/libavc/avc_extended_stream_format.cpp branches/echoaudio/src/libavc/avc_extended_stream_format.h branches/echoaudio/src/libavc/avc_extended_subunit_info.cpp branches/echoaudio/src/libavc/avc_extended_subunit_info.h branches/echoaudio/src/libavc/avc_function_block.cpp branches/echoaudio/src/libavc/avc_function_block.h branches/echoaudio/src/libavc/avc_generic.cpp branches/echoaudio/src/libavc/avc_generic.h branches/echoaudio/src/libavc/avc_plug_info.cpp branches/echoaudio/src/libavc/avc_plug_info.h branches/echoaudio/src/libavc/avc_serialize.cpp branches/echoaudio/src/libavc/avc_serialize.h branches/echoaudio/src/libavc/avc_signal_source.cpp branches/echoaudio/src/libavc/avc_signal_source.h branches/echoaudio/src/libavc/avc_subunit_info.cpp branches/echoaudio/src/libavc/avc_subunit_info.h branches/echoaudio/src/libavc/avc_unit_info.cpp branches/echoaudio/src/libavc/avc_unit_info.h Modified: branches/echoaudio/src/Makefile.am branches/echoaudio/src/bebob/GenericMixer.cpp branches/echoaudio/src/bebob/bebob_avdevice.cpp branches/echoaudio/src/bebob/bebob_avdevice.h branches/echoaudio/src/bebob/bebob_avdevice_subunit.cpp branches/echoaudio/src/bebob/bebob_avdevice_subunit.h branches/echoaudio/src/bebob/bebob_avplug.cpp branches/echoaudio/src/bebob/bebob_avplug.h branches/echoaudio/src/bebob/bebob_dl_codes.h branches/echoaudio/src/bebob/bebob_dl_mgr.cpp branches/echoaudio/src/ffado.cpp branches/echoaudio/src/maudio/maudio_avdevice.h Log: Restructure the libavc directory in order to improve maintainability when extending the implemented AV/C standards. The new directory structure is a reflection of the specifications: the files in each directory (roughly) correspond to the same specification. The breakdown is: general : AV/C Digital Interface Command Set General Specification audiosubunit : Audio Subunit Specification musicsubunit : Music Subunit Specification ccm : Connection and Compatibility Management Specification descriptors : AV/C Descriptor Mechanism Specification util : Various utility classes (not from specs) Modified: branches/echoaudio/src/Makefile.am =================================================================== --- branches/echoaudio/src/Makefile.am 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/Makefile.am 2007-07-28 09:43:03 UTC (rev 502) @@ -55,13 +55,21 @@ maudio/maudio_avdevice.h motu/motu_avdevice.h rme/rme_avdevice.h \ metrichalo/mh_avdevice.h dice/dice_avdevice.h \ genericavc/avc_avdevice.h \ - libavc/avc_connect.h \ - libavc/avc_definitions.h libavc/avc_extended_cmd_generic.h \ - libavc/avc_extended_plug_info.h libavc/avc_extended_stream_format.h \ - libavc/avc_extended_subunit_info.h libavc/avc_function_block.h libavc/avc_generic.h \ - libavc/avc_plug_info.h libavc/avc_serialize.h libavc/avc_signal_source.h \ - libavc/avc_subunit_info.h libavc/avc_unit_info.h \ - libavc/avc_descriptor.h libavc/avc_descriptor_cmd.h libavc/avc_descriptor_music.h \ + libavc/streamformat/avc_extended_stream_format.h \ + libavc/util/avc_serialize.h \ + libavc/musicsubunit/avc_descriptor_music.h \ + libavc/descriptors/avc_descriptor_cmd.h \ + libavc/descriptors/avc_descriptor.h \ + libavc/general/avc_plug_info.h \ + libavc/general/avc_subunit_info.h \ + libavc/general/avc_extended_cmd_generic.h \ + libavc/general/avc_extended_subunit_info.h \ + libavc/general/avc_unit_info.h \ + libavc/general/avc_generic.h \ + libavc/general/avc_connect.h \ + libavc/general/avc_extended_plug_info.h \ + libavc/avc_definitions.h \ + libavc/ccm/avc_signal_source.h \ libosc/OscArgument.h libosc/OscNode.h libosc/OscResponse.h libosc/OscServer.h libosc/OscMessage.h \ libosc/OscClient.h \ libstreaming/AmdtpPort.h libstreaming/AmdtpPortInfo.h libstreaming/AmdtpStreamProcessor.h \ @@ -79,57 +87,57 @@ # common sources libffado_la_SOURCES = \ - devicemanager.cpp \ - ffado.cpp \ - ffado_streaming.cpp \ - ffadodevice.cpp \ - debugmodule/debugmodule.cpp \ - libavc/avc_connect.cpp \ - libavc/avc_definitions.cpp \ - libavc/avc_descriptor.cpp \ - libavc/avc_descriptor_cmd.cpp \ - libavc/avc_descriptor_music.cpp \ - libavc/avc_extended_cmd_generic.cpp \ - libavc/avc_extended_plug_info.cpp \ - libavc/avc_extended_stream_format.cpp \ - libavc/avc_extended_subunit_info.cpp \ - libavc/avc_function_block.cpp \ - libavc/avc_generic.cpp \ - libavc/avc_plug_info.cpp \ - libavc/avc_serialize.cpp \ - libavc/avc_signal_source.cpp \ - libavc/avc_subunit_info.cpp \ - libavc/avc_unit_info.cpp \ - libieee1394/ARMHandler.cpp \ - libieee1394/configrom.cpp \ - libieee1394/csr1212.c \ - libieee1394/ieee1394service.cpp \ - libieee1394/IEC61883.cpp \ - libosc/OscArgument.cpp \ - libosc/OscClient.cpp \ - libosc/OscMessage.cpp \ - libosc/OscNode.cpp \ - libosc/OscResponse.cpp \ - libosc/OscServer.cpp \ - libstreaming/cip.c \ - libstreaming/IsoHandler.cpp \ - libstreaming/IsoHandlerManager.cpp \ - libstreaming/IsoStream.cpp \ - libstreaming/Port.cpp \ - libstreaming/PortManager.cpp \ - libstreaming/StreamProcessor.cpp \ - libstreaming/StreamProcessorManager.cpp \ - libutil/DelayLockedLoop.cpp \ - libutil/PacketBuffer.cpp \ - libutil/OptionContainer.cpp \ - libutil/PosixThread.cpp \ - libutil/ringbuffer.c \ - libutil/serialize.cpp \ - libutil/StreamStatistics.cpp \ - libutil/SystemTimeSource.cpp \ - libutil/Time.c \ - libutil/TimeSource.cpp \ - libutil/TimestampedBuffer.cpp + devicemanager.cpp \ + ffado.cpp \ + ffado_streaming.cpp \ + ffadodevice.cpp \ + debugmodule/debugmodule.cpp \ + libavc/audiosubunit/avc_function_block.cpp \ + libavc/streamformat/avc_extended_stream_format.cpp \ + libavc/util/avc_serialize.cpp \ + libavc/musicsubunit/avc_descriptor_music.cpp \ + libavc/descriptors/avc_descriptor_cmd.cpp \ + libavc/descriptors/avc_descriptor.cpp \ + libavc/general/avc_extended_subunit_info.cpp \ + libavc/general/avc_unit_info.cpp \ + libavc/general/avc_generic.cpp \ + libavc/general/avc_subunit_info.cpp \ + libavc/general/avc_connect.cpp \ + libavc/general/avc_extended_cmd_generic.cpp \ + libavc/general/avc_extended_plug_info.cpp \ + libavc/general/avc_plug_info.cpp \ + libavc/avc_definitions.cpp \ + libavc/ccm/avc_signal_source.cpp \ + libieee1394/ARMHandler.cpp \ + libieee1394/configrom.cpp \ + libieee1394/csr1212.c \ + libieee1394/ieee1394service.cpp \ + libieee1394/IEC61883.cpp \ + libosc/OscArgument.cpp \ + libosc/OscClient.cpp \ + libosc/OscMessage.cpp \ + libosc/OscNode.cpp \ + libosc/OscResponse.cpp \ + libosc/OscServer.cpp \ + libstreaming/cip.c \ + libstreaming/IsoHandler.cpp \ + libstreaming/IsoHandlerManager.cpp \ + libstreaming/IsoStream.cpp \ + libstreaming/Port.cpp \ + libstreaming/PortManager.cpp \ + libstreaming/StreamProcessor.cpp \ + libstreaming/StreamProcessorManager.cpp \ + libutil/DelayLockedLoop.cpp \ + libutil/PacketBuffer.cpp \ + libutil/OptionContainer.cpp \ + libutil/PosixThread.cpp \ + libutil/ringbuffer.c \ + libutil/serialize.cpp \ + libutil/StreamStatistics.cpp \ + libutil/SystemTimeSource.cpp \ + libutil/Time.c \ + libutil/TimeSource.cpp \ + libutil/TimestampedBuffer.cpp # class specific sources bebob_src = \ Modified: branches/echoaudio/src/bebob/GenericMixer.cpp =================================================================== --- branches/echoaudio/src/bebob/GenericMixer.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/GenericMixer.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -30,8 +30,8 @@ #include "libosc/OscMessage.h" #include "libosc/OscResponse.h" -#include "libavc/avc_function_block.h" -#include "libavc/avc_serialize.h" +#include "libavc/audiosubunit/avc_function_block.h" +#include "libavc/util/avc_serialize.h" #include "libieee1394/ieee1394service.h" Modified: branches/echoaudio/src/bebob/bebob_avdevice.cpp =================================================================== --- branches/echoaudio/src/bebob/bebob_avdevice.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avdevice.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -28,11 +28,11 @@ #include "libieee1394/configrom.h" #include "libieee1394/ieee1394service.h" -#include "libavc/avc_plug_info.h" -#include "libavc/avc_extended_plug_info.h" -#include "libavc/avc_subunit_info.h" -#include "libavc/avc_extended_stream_format.h" -#include "libavc/avc_serialize.h" +#include "libavc/general/avc_plug_info.h" +#include "libavc/general/avc_extended_plug_info.h" +#include "libavc/general/avc_subunit_info.h" +#include "libavc/streamformat/avc_extended_stream_format.h" +#include "libavc/util/avc_serialize.h" #include "libavc/avc_definitions.h" #include "debugmodule/debugmodule.h" Modified: branches/echoaudio/src/bebob/bebob_avdevice.h =================================================================== --- branches/echoaudio/src/bebob/bebob_avdevice.h 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avdevice.h 2007-07-28 09:43:03 UTC (rev 502) @@ -28,7 +28,7 @@ #include "debugmodule/debugmodule.h" #include "libavc/avc_definitions.h" -#include "libavc/avc_extended_cmd_generic.h" +#include "libavc/general/avc_extended_cmd_generic.h" #include "bebob/bebob_avplug.h" #include "bebob/bebob_avdevice_subunit.h" Modified: branches/echoaudio/src/bebob/bebob_avdevice_subunit.cpp =================================================================== --- branches/echoaudio/src/bebob/bebob_avdevice_subunit.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avdevice_subunit.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -27,9 +27,9 @@ #include "bebob/bebob_avplug.h" #include "libieee1394/configrom.h" -#include "libavc/avc_plug_info.h" -#include "libavc/avc_extended_stream_format.h" -#include "libavc/avc_serialize.h" +#include "libavc/general/avc_plug_info.h" +#include "libavc/streamformat/avc_extended_stream_format.h" +#include "libavc/util/avc_serialize.h" #include <sstream> Modified: branches/echoaudio/src/bebob/bebob_avdevice_subunit.h =================================================================== --- branches/echoaudio/src/bebob/bebob_avdevice_subunit.h 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avdevice_subunit.h 2007-07-28 09:43:03 UTC (rev 502) @@ -28,9 +28,9 @@ #include "bebob/bebob_functionblock.h" #include "debugmodule/debugmodule.h" -#include "libavc/avc_extended_subunit_info.h" +#include "libavc/general/avc_extended_subunit_info.h" #include "libavc/avc_definitions.h" -#include "libavc/avc_generic.h" +#include "libavc/general/avc_generic.h" #include <vector> Modified: branches/echoaudio/src/bebob/bebob_avplug.cpp =================================================================== --- branches/echoaudio/src/bebob/bebob_avplug.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avplug.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -26,7 +26,7 @@ #include "libieee1394/configrom.h" #include "libieee1394/ieee1394service.h" -#include "libavc/avc_serialize.h" +#include "libavc/util/avc_serialize.h" #include <sstream> Modified: branches/echoaudio/src/bebob/bebob_avplug.h =================================================================== --- branches/echoaudio/src/bebob/bebob_avplug.h 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_avplug.h 2007-07-28 09:43:03 UTC (rev 502) @@ -24,12 +24,12 @@ #ifndef BEBOB_AVPLUG_H #define BEBOB_AVPLUG_H -#include "libavc/avc_signal_source.h" -#include "libavc/avc_extended_stream_format.h" -#include "libavc/avc_extended_plug_info.h" -#include "libavc/avc_extended_cmd_generic.h" +#include "libavc/ccm/avc_signal_source.h" +#include "libavc/streamformat/avc_extended_stream_format.h" +#include "libavc/general/avc_extended_plug_info.h" +#include "libavc/general/avc_extended_cmd_generic.h" #include "libavc/avc_definitions.h" -#include "libavc/avc_generic.h" +#include "libavc/general/avc_generic.h" #include "libutil/serialize.h" Modified: branches/echoaudio/src/bebob/bebob_dl_codes.h =================================================================== --- branches/echoaudio/src/bebob/bebob_dl_codes.h 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_dl_codes.h 2007-07-28 09:43:03 UTC (rev 502) @@ -28,7 +28,7 @@ #include "fbtypes.h" -#include "libavc/avc_serialize.h" +#include "libavc/util/avc_serialize.h" namespace BeBoB { enum EBootloaderProtocolVersion { Modified: branches/echoaudio/src/bebob/bebob_dl_mgr.cpp =================================================================== --- branches/echoaudio/src/bebob/bebob_dl_mgr.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/bebob/bebob_dl_mgr.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -28,7 +28,7 @@ #include "libieee1394/configrom.h" #include "libieee1394/ieee1394service.h" -#include "libavc/avc_serialize.h" +#include "libavc/util/avc_serialize.h" #include <netinet/in.h> Modified: branches/echoaudio/src/ffado.cpp =================================================================== --- branches/echoaudio/src/ffado.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/ffado.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -31,8 +31,6 @@ #include "devicemanager.h" #include "ffadodevice.h" -#include "libavc/avc_generic.h" - #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -141,6 +139,8 @@ return -1; } +#warning this should be cleaned up +#include "libavc/general/avc_generic.h" void ffado_sleep_after_avc_command( int time ) { AVCCommand::setSleepAfterAVCCommand( time ); Copied: branches/echoaudio/src/libavc/audiosubunit/avc_function_block.cpp (from rev 501, branches/echoaudio/src/libavc/avc_function_block.cpp) =================================================================== --- branches/echoaudio/src/libavc/audiosubunit/avc_function_block.cpp (rev 0) +++ branches/echoaudio/src/libavc/audiosubunit/avc_function_block.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -0,0 +1,703 @@ +/* + * Copyright (C) 2005-2007 by Daniel Wagner + * Copyright (C) 2005-2007 by Pieter Palmers + * + * This file is part of FFADO + * FFADO = Free Firewire (pro-)audio drivers for linux + * + * FFADO is based upon FreeBoB + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation; + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include "avc_function_block.h" +#include "../util/avc_serialize.h" +#include "libieee1394/ieee1394service.h" + +///////////////////////////////// + +FunctionBlockFeatureVolume::FunctionBlockFeatureVolume() + : IBusData() + , m_controlDataLength( 2 ) + , m_volume( 0 ) +{ +} + +FunctionBlockFeatureVolume::FunctionBlockFeatureVolume( const FunctionBlockFeatureVolume& rhs ) + : m_controlDataLength( rhs.m_controlDataLength ) + , m_volume( rhs.m_volume ) +{ +} + +FunctionBlockFeatureVolume::~FunctionBlockFeatureVolume() +{ +} + +bool +FunctionBlockFeatureVolume::serialize( IOSSerialize& se ) +{ + bool bStatus; + byte_t val; + bStatus = se.write( m_controlDataLength, "FunctionBlockFeatureVolume controlDataLength" ); + val = (byte_t)(m_volume >> 8); + bStatus &= se.write( val, "FunctionBlockFeatureVolume volume high" ); + val = m_volume & 0xff; + bStatus &= se.write( val, "FunctionBlockFeatureVolume volume low" ); + + return bStatus; +} + +bool +FunctionBlockFeatureVolume::deserialize( IISDeserialize& de ) +{ + bool bStatus; + byte_t val; + bStatus = de.read( &m_controlDataLength ); + bStatus &= de.read( &val ); + m_volume = val << 8; + bStatus &= de.read( &val ); + m_volume |= val; + + return bStatus; +} + +FunctionBlockFeatureVolume* +FunctionBlockFeatureVolume::clone() const +{ + return new FunctionBlockFeatureVolume( *this ); +} + +///////////////////////////////// + +FunctionBlockProcessingMixer::FunctionBlockProcessingMixer() + : IBusData() + , m_controlSelector( FunctionBlockProcessing::eCSE_Processing_Mixer ) +{ +} + +FunctionBlockProcessingMixer::FunctionBlockProcessingMixer( const FunctionBlockProcessingMixer& rhs ) + : m_controlSelector( rhs.m_controlSelector ) +{ +} + +FunctionBlockProcessingMixer::~FunctionBlockProcessingMixer() +{ +} + +bool +FunctionBlockProcessingMixer::serialize( IOSSerialize& se ) +{ + bool bStatus; + bStatus = se.write( m_controlSelector, "FunctionBlockProcessingMixer controlSelector" ); + + return bStatus; +} + +bool +FunctionBlockProcessingMixer::deserialize( IISDeserialize& de ) +{ + bool bStatus; + bStatus = de.read( &m_controlSelector ); + + return bStatus; +} + +FunctionBlockProcessingMixer* +FunctionBlockProcessingMixer::clone() const +{ + return new FunctionBlockProcessingMixer( *this ); +} + +///////////////////////////////// + +FunctionBlockProcessingEnhancedMixer::FunctionBlockProcessingEnhancedMixer() + : IBusData() + , m_controlSelector( FunctionBlockProcessing::eCSE_Processing_EnhancedMixer ) + , m_statusSelector( eSS_ProgramableState ) +{ +} + +FunctionBlockProcessingEnhancedMixer::FunctionBlockProcessingEnhancedMixer( + const FunctionBlockProcessingEnhancedMixer& rhs ) + : m_controlSelector( rhs.m_controlSelector ) + , m_statusSelector( rhs.m_statusSelector ) +{ +} + +FunctionBlockProcessingEnhancedMixer::~FunctionBlockProcessingEnhancedMixer() +{ +} + +bool +FunctionBlockProcessingEnhancedMixer::serialize( IOSSerialize& se ) +{ + int todo,done; + bool bStatus; + byte_t data_length_hi, data_length_lo; + + bStatus = se.write( m_controlSelector, "FunctionBlockProcessingEnhancedMixer controlSelector" ); + bStatus &= se.write( m_statusSelector, "FunctionBlockProcessingEnhancedMixer statusSelector" ); + + switch (m_statusSelector) { + case eSS_ProgramableState: + m_controlDataLength=m_LevelData.size(); + data_length_hi=(m_controlDataLength >> 8); + data_length_lo=(m_controlDataLength & 0xFF); + bStatus &= se.write( data_length_hi, "FunctionBlockProcessingEnhancedMixer controlDataLengthHi" ); + bStatus &= se.write( data_length_lo, "FunctionBlockProcessingEnhancedMixer controlDataLengthLo" ); + + for (int i=0;i<m_controlDataLength/8;i++) { + byte_t value=0; + + for (int j=0;j<8;j++) { + control_data_ext_length_t bit_value=m_ProgramableStateData.at(i*8+j); + value |= bit_value << (7-j); + } + + bStatus &= se.write( value, "FunctionBlockProcessingEnhancedMixer data" ); + } + + todo=m_controlDataLength%8; + done=m_controlDataLength-todo; + if (todo) { + byte_t value=0; + for (int j=0;j<todo;j++) { + control_data_ext_length_t bit_value=m_ProgramableStateData.at(done*8+j); + value |= bit_value << (7-j); + } + bStatus &= se.write( value, "FunctionBlockProcessingEnhancedMixer data" ); + } + break; + case eSS_Level: + m_controlDataLength=m_LevelData.size()/2; + data_length_hi=(m_controlDataLength >> 8); + data_length_lo=(m_controlDataLength & 0xFF); + bStatus &= se.write( data_length_hi, "FunctionBlockProcessingEnhancedMixer controlDataLengthHi" ); + bStatus &= se.write( data_length_lo, "FunctionBlockProcessingEnhancedMixer controlDataLengthLo" ); + + for (int i=0;i<m_controlDataLength/2;i++) { + mixer_level_t value=m_LevelData.at(i); + byte_t value_hi=value >> 8; + byte_t value_lo=value & 0xFF; + + bStatus &= se.write( value_hi, "FunctionBlockProcessingEnhancedMixer data" ); + bStatus &= se.write( value_lo, "FunctionBlockProcessingEnhancedMixer data" ); + } + break; + } + return bStatus; +} + +bool +FunctionBlockProcessingEnhancedMixer::deserialize( IISDeserialize& de ) +{ + int todo; + bool bStatus=true; + bStatus = de.read( &m_controlSelector ); + + // NOTE: the returned value is currently bogus, so overwrite it + m_controlSelector=FunctionBlockProcessing::eCSE_Processing_EnhancedMixer; + + bStatus &= de.read( &m_statusSelector ); + + byte_t data_length_hi; + byte_t data_length_lo; + bStatus &= de.read( &data_length_hi ); + bStatus &= de.read( &data_length_lo ); + + m_controlDataLength = (data_length_hi << 8) + data_length_lo; + switch (m_statusSelector) { + case eSS_ProgramableState: + m_ProgramableStateData.clear(); + for (int i=0;i<m_controlDataLength/8;i++) { + byte_t value; + bStatus &= de.read( &value); + + for (int j=7;j>=0;j--) { + byte_t bit_value; + bit_value=(((1<<j) & value) ? 1 : 0); + m_ProgramableStateData.push_back(bit_value); + } + } + + todo=m_controlDataLength%8; + if (todo) { + byte_t value; + bStatus &= de.read( &value); + + for (int j=7;j>7-todo;j--) { + byte_t bit_value; + bit_value=(((1<<j) & value) ? 1 : 0); + m_ProgramableStateData.push_back(bit_value); + } + } + break; + case eSS_Level: + m_LevelData.clear(); + for (int i=0;i<m_controlDataLength/2;i++) { + byte_t mixer_value_hi=0, mixer_value_lo=0; + bStatus &= de.read( &mixer_value_hi); + bStatus &= de.read( &mixer_value_lo); + mixer_level_t value = (mixer_value_hi << 8) + mixer_value_lo; + m_LevelData.push_back(value); + } + break; + } + + return bStatus; +} + +FunctionBlockProcessingEnhancedMixer* +FunctionBlockProcessingEnhancedMixer::clone() const +{ + return new FunctionBlockProcessingEnhancedMixer( *this ); +} + + +///////////////////////////////// +///////////////////////////////// + +FunctionBlockSelector::FunctionBlockSelector() + : IBusData() + , m_selectorLength( 0x02 ) + , m_inputFbPlugNumber( 0x00 ) + , m_controlSelector( eCSE_Selector_Selector ) +{ +} + +FunctionBlockSelector::FunctionBlockSelector( const FunctionBlockSelector& rhs ) + : IBusData() + , m_selectorLength( rhs.m_selectorLength ) + , m_inputFbPlugNumber( rhs.m_inputFbPlugNumber ) + , m_controlSelector( rhs.m_controlSelector ) +{ +} + +FunctionBlockSelector::~FunctionBlockSelector() +{ +} + +bool +FunctionBlockSelector::serialize( IOSSerialize& se ) +{ + bool bStatus; + bStatus = se.write( m_selectorLength, "FunctionBlockSelector selectorLength" ); + bStatus &= se.write( m_inputFbPlugNumber, "FunctionBlockSelector inputFbPlugNumber" ); + bStatus &= se.write( m_controlSelector, "FunctionBlockSelector controlSelector" ); + + return bStatus; +} + +bool +FunctionBlockSelector::deserialize( IISDeserialize& de ) +{ + bool bStatus; + bStatus = de.read( &m_selectorLength ); + bStatus &= de.read( &m_inputFbPlugNumber ); + bStatus &= de.read( &m_controlSelector ); + + return bStatus; +} + +FunctionBlockSelector* +FunctionBlockSelector::clone() const +{ + return new FunctionBlockSelector( *this ); +} + +///////////////////////////////// + +FunctionBlockFeature::FunctionBlockFeature() + : IBusData() + , m_selectorLength( 0x02 ) + , m_audioChannelNumber( 0x00 ) + , m_controlSelector( eCSE_Feature_Unknown ) + , m_pVolume( new FunctionBlockFeatureVolume ) +{ +} + +FunctionBlockFeature::FunctionBlockFeature( const FunctionBlockFeature& rhs ) + : IBusData() + , m_selectorLength( rhs.m_selectorLength ) + , m_audioChannelNumber( rhs.m_audioChannelNumber ) + , m_controlSelector( rhs.m_controlSelector ) +{ + if ( rhs.m_pVolume ) { + m_pVolume = new FunctionBlockFeatureVolume( *rhs.m_pVolume ); + } +} + +FunctionBlockFeature::~FunctionBlockFeature() +{ + delete m_pVolume; + m_pVolume = NULL; +} + +bool +FunctionBlockFeature::serialize( IOSSerialize& se ) +{ + bool bStatus; + bStatus = se.write( m_selectorLength, "FunctionBlockFeature selectorLength" ); + bStatus &= se.write( m_audioChannelNumber, "FunctionBlockFeature audioChannelNumber" ); + bStatus &= se.write( m_controlSelector, "FunctionBlockFeature controlSelector" ); + + if ( m_controlSelector == eCSE_Feature_Volume ) { + bStatus &= m_pVolume->serialize( se ); + } else { + bStatus = false; + } + + return bStatus; +} + +bool +FunctionBlockFeature::deserialize( IISDeserialize& de ) +{ + bool bStatus; + bStatus = de.read( &m_selectorLength ); + bStatus &= de.read( &m_audioChannelNumber ); + bStatus &= de.read( &m_controlSelector ); + + switch( m_controlSelector ) { + case eCSE_Feature_Volume: + bStatus &= m_pVolume->deserialize( de ); + break; + case eCSE_Feature_Mute: + case eCSE_Feature_LRBalance: + case eCSE_Feature_FRBalance: + case eCSE_Feature_Bass: + case eCSE_Feature_Mid: + case eCSE_Feature_Treble: + case eCSE_Feature_GEQ: + case eCSE_Feature_AGC: + case eCSE_Feature_Delay: + case eCSE_Feature_BassBoost: + case eCSE_Feature_Loudness: + default: + bStatus = false; + } + + return bStatus; +} + +FunctionBlockFeature* +FunctionBlockFeature::clone() const +{ + return new FunctionBlockFeature( *this ); +} + +///////////////////////////////// + +FunctionBlockProcessing::FunctionBlockProcessing() + : IBusData() + , m_selectorLength( 0x04 ) + , m_fbInputPlugNumber( 0x00 ) + , m_inputAudioChannelNumber( 0x00 ) + , m_outputAudioChannelNumber( 0x00 ) + , m_pMixer( 0 ) + , m_pEnhancedMixer( 0 ) +{ +} + +FunctionBlockProcessing::FunctionBlockProcessing( const FunctionBlockProcessing& rhs ) + : m_selectorLength( rhs.m_selectorLength ) + , m_fbInputPlugNumber( rhs.m_fbInputPlugNumber ) + , m_inputAudioChannelNumber( rhs.m_inputAudioChannelNumber ) + , m_outputAudioChannelNumber( rhs.m_outputAudioChannelNumber ) +{ + if ( rhs.m_pMixer ) { + m_pMixer = new FunctionBlockProcessingMixer( *rhs.m_pMixer ); + } else if ( rhs.m_pEnhancedMixer ) { + m_pEnhancedMixer = new FunctionBlockProcessingEnhancedMixer( *rhs.m_pEnhancedMixer ); + } +} + +FunctionBlockProcessing::~FunctionBlockProcessing() +{ + delete m_pMixer; + m_pMixer = 0; + delete m_pEnhancedMixer; + m_pEnhancedMixer = 0; +} + +bool +FunctionBlockProcessing::serialize( IOSSerialize& se ) +{ + bool bStatus; + bStatus = se.write( m_selectorLength, "FunctionBlockProcessing selectorLength" ); + bStatus &= se.write( m_fbInputPlugNumber, "FunctionBlockProcessing fbInputPlugNumber" ); + bStatus &= se.write( m_inputAudioChannelNumber, "FunctionBlockProcessing inputAudioChannelNumber" ); + bStatus &= se.write( m_outputAudioChannelNumber, "FunctionBlockProcessing outputAudioChannelNumber" ); + + if ( m_pMixer ) { + bStatus &= m_pMixer->serialize( se ); + } else if ( m_pEnhancedMixer ) { + bStatus &= m_pEnhancedMixer->serialize( se ); + } else { + bStatus = false; + } + + return bStatus; +} + +bool +FunctionBlockProcessing::deserialize( IISDeserialize& de ) +{ + // NOTE: apparently the fbCmd of the STATUS type, + // with EnhancedMixer controlSelector returns with this + // controlSelector type changed to Mixer, making it + // impossible to choose the correct response handler + // based upon the response only. + + // HACK: we assume that it is the same as the sent one + // we also look at our data structure to figure out what we sent + byte_t controlSelector=eCSE_Processing_Unknown; + if(m_pMixer) { + controlSelector=eCSE_Processing_Mixer; + } else if(m_pEnhancedMixer) { + controlSelector=eCSE_Processing_EnhancedMixer; + } + + bool bStatus; + bStatus = de.read( &m_selectorLength ); + bStatus &= de.read( &m_fbInputPlugNumber ); + bStatus &= de.read( &m_inputAudioChannelNumber ); + bStatus &= de.read( &m_outputAudioChannelNumber ); + + byte_t controlSelector_response; + bStatus &= de.peek( &controlSelector_response ); +/* debugOutput(DEBUG_LEVEL_VERBOSE,"ctrlsel: orig = %02X, resp = %02X\n", + controlSelector, controlSelector_response);*/ + + switch( controlSelector ) { + case eCSE_Processing_Mixer: + if ( !m_pMixer ) { + m_pMixer = new FunctionBlockProcessingMixer; + } + bStatus &= m_pMixer->deserialize( de ); + break; + case eCSE_Processing_EnhancedMixer: + if ( !m_pEnhancedMixer ) { + m_pEnhancedMixer = new FunctionBlockProcessingEnhancedMixer; + } + bStatus &= m_pEnhancedMixer->deserialize( de ); + break; + case eCSE_Processing_Enable: + case eCSE_Processing_Mode: + default: + bStatus = false; + } + + byte_t tmp; + if (de.peek(&tmp)) { + debugOutput(DEBUG_LEVEL_VERBOSE,"Unprocessed bytes:\n"); + while (de.read(&tmp)) { + debugOutput(DEBUG_LEVEL_VERBOSE," %02X\n",tmp); + } + } + + return bStatus; +} + +FunctionBlockProcessing* +FunctionBlockProcessing::clone() const +{ + return new FunctionBlockProcessing( *this ); +} + +///////////////////////////////// + +FunctionBlockCodec::FunctionBlockCodec() + : IBusData() +{ +} + +FunctionBlockCodec::FunctionBlockCodec( const FunctionBlockCodec& rhs ) + : IBusData() +{ +} + +FunctionBlockCodec::~FunctionBlockCodec() +{ +} + +bool +FunctionBlockCodec::serialize( IOSSerialize& se ) +{ + return false; +} + +bool +FunctionBlockCodec::deserialize( IISDeserialize& de ) +{ + return false; +} + +FunctionBlockCodec* +FunctionBlockCodec::clone() const +{ + return new FunctionBlockCodec( *this ); +} + +///////////////////////////////// +///////////////////////////////// + +FunctionBlockCmd::FunctionBlockCmd( Ieee1394Service& ieee1394service, + EFunctionBlockType eType, + function_block_id_t id, + EControlAttribute eCtrlAttrib ) + : AVCCommand( ieee1394service, AVC1394_FUNCTION_BLOCK_CMD ) + , m_functionBlockType( eType ) + , m_functionBlockId( id ) + , m_controlAttribute( eCtrlAttrib ) + , m_pFBSelector( 0 ) + , m_pFBFeature( 0 ) + , m_pFBProcessing( 0 ) + , m_pFBCodec( 0 ) +{ + setSubunitType( eST_Audio ); + + switch( m_functionBlockType ) { + case eFBT_Selector: + m_pFBSelector = new FunctionBlockSelector; + break; + case eFBT_Feature: + m_pFBFeature = new FunctionBlockFeature; + break; + case eFBT_Processing: + m_pFBProcessing = new FunctionBlockProcessing; + break; + case eFBT_Codec: + m_pFBCodec = new FunctionBlockCodec; + break; + } +} + +FunctionBlockCmd::FunctionBlockCmd( const FunctionBlockCmd& rhs ) + : AVCCommand( rhs ) + , m_functionBlockType( rhs.m_functionBlockType ) + , m_functionBlockId( rhs.m_functionBlockId ) + , m_controlAttribute( rhs.m_controlAttribute ) + , m_pFBSelector( new FunctionBlockSelector( *rhs.m_pFBSelector ) ) + , m_pFBFeature( new FunctionBlockFeature( *rhs.m_pFBFeature ) ) + , m_pFBProcessing( new FunctionBlockProcessing( *rhs.m_pFBProcessing ) ) + , m_pFBCodec( new FunctionBlockCodec( *rhs.m_pFBCodec ) ) +{ +} + +FunctionBlockCmd::~FunctionBlockCmd() +{ + delete m_pFBSelector; + m_pFBSelector = 0; + delete m_pFBFeature; + m_pFBFeature = 0; + delete m_pFBProcessing; + m_pFBProcessing = 0; + delete m_pFBCodec; + m_pFBCodec = 0; +} + +bool +FunctionBlockCmd::serialize( IOSSerialize& se ) +{ + bool bStatus; + bStatus = AVCCommand::serialize( se ); + bStatus &= se.write( m_functionBlockType, "FunctionBlockCmd functionBlockType" ); + bStatus &= se.write( m_functionBlockId, "FunctionBlockCmd functionBlockId" ); + bStatus &= se.write( m_controlAttribute, "FunctionBlockCmd controlAttribute" ); + + switch( m_functionBlockType ) { + case eFBT_Selector: + if ( m_pFBSelector ) { + bStatus &= m_pFBSelector->serialize( se ); + } else { + bStatus = false; + } + break; + case eFBT_Feature: + if ( m_pFBFeature ) { + bStatus &= m_pFBFeature->serialize( se ); + } else { + bStatus = false; + } + break; + case eFBT_Processing: + if ( m_pFBProcessing ) { + bStatus &= m_pFBProcessing->serialize( se ); + } else { + bStatus = false; + } + break; + case eFBT_Codec: + if ( m_pFBCodec ) { + bStatus &= m_pFBCodec->serialize( se ); + } else { + bStatus = false; + } + break; + default: + bStatus = false; + } + + return bStatus; +} + +bool +FunctionBlockCmd::deserialize( IISDeserialize& de ) +{ + bool bStatus; + bStatus = AVCCommand::deserialize( de ); + + bStatus &= de.read( &m_functionBlockType ); + bStatus &= de.read( &m_functionBlockId ); + bStatus &= de.read( &m_controlAttribute ); + + switch( m_functionBlockType ) { + case eFBT_Selector: + if ( !m_pFBSelector ) { + m_pFBSelector = new FunctionBlockSelector; + } + bStatus &= m_pFBSelector->deserialize( de ); + break; + case eFBT_Feature: + if ( !m_pFBFeature ) { + m_pFBFeature = new FunctionBlockFeature; + } + bStatus &= m_pFBFeature->deserialize( de ); + break; + case eFBT_Processing: + if ( !m_pFBProcessing ) { + m_pFBProcessing = new FunctionBlockProcessing; + } + bStatus &= m_pFBProcessing->deserialize( de ); + break; + case eFBT_Codec: + if ( !m_pFBCodec ) { + m_pFBCodec = new FunctionBlockCodec; + } + bStatus &= m_pFBCodec->deserialize( de ); + break; + default: + bStatus = false; + } + + return bStatus; +} + +FunctionBlockCmd* +FunctionBlockCmd::clone() const +{ + return new FunctionBlockCmd( *this ); +} Copied: branches/echoaudio/src/libavc/audiosubunit/avc_function_block.h (from rev 501, branches/echoaudio/src/libavc/avc_function_block.h) =================================================================== --- branches/echoaudio/src/libavc/audiosubunit/avc_function_block.h (rev 0) +++ branches/echoaudio/src/libavc/audiosubunit/avc_function_block.h 2007-07-28 09:43:03 UTC (rev 502) @@ -0,0 +1,275 @@ +/* + * 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 library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation; + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#ifndef AVCFUNCTIONBLOCK_H +#define AVCFUNCTIONBLOCK_H + +#include "../general/avc_extended_cmd_generic.h" +#include "../general/avc_generic.h" + +#include <libavc1394/avc1394.h> +#include <vector> +using namespace std; + +class FunctionBlockFeatureVolume: public IBusData +{ +public: + FunctionBlockFeatureVolume(); + FunctionBlockFeatureVolume( const FunctionBlockFeatureVolume& rhs ); + virtual ~FunctionBlockFeatureVolume(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockFeatureVolume* clone() const; + + control_data_length_t m_controlDataLength; + u_int16_t m_volume; +}; + +/////////////////////////////////////////// + +class FunctionBlockProcessingMixer: public IBusData +{ +public: + FunctionBlockProcessingMixer(); + FunctionBlockProcessingMixer( const FunctionBlockProcessingMixer& rhs ); + virtual ~FunctionBlockProcessingMixer(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockProcessingMixer* clone() const; + + control_selector_t m_controlSelector; +}; + +/////////////////////////////////////////// + +class FunctionBlockProcessingEnhancedMixer: public IBusData +{ +public: + enum EStatusSelector { + eSS_ProgramableState = 0x00, + eSS_Level = 0x01, + }; + + FunctionBlockProcessingEnhancedMixer(); + FunctionBlockProcessingEnhancedMixer( + const FunctionBlockProcessingEnhancedMixer& rhs ); + virtual ~FunctionBlockProcessingEnhancedMixer(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockProcessingEnhancedMixer* clone() const; + + control_selector_t m_controlSelector; + status_selector_t m_statusSelector; + control_data_ext_length_t m_controlDataLength; + vector<mixer_programmable_state_t> m_ProgramableStateData; + vector<mixer_level_t> m_LevelData; +}; + +/////////////////////////////////////////// +/////////////////////////////////////////// + +class FunctionBlockSelector: public IBusData +{ +// untested +public: + // Control selector encoding + enum EControlSelectorEncoding { + eCSE_Selector_Unknown = 0x00, + eCSE_Selector_Selector = 0x01, + }; + + FunctionBlockSelector(); + FunctionBlockSelector( const FunctionBlockSelector& rhs ); + virtual ~FunctionBlockSelector(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockSelector* clone() const; + + selector_length_t m_selectorLength; + input_fb_plug_number_t m_inputFbPlugNumber; + control_selector_t m_controlSelector; +}; + +/////////////////////////////////////////// + +class FunctionBlockFeature: public IBusData +{ +// no complete implementation +public: + // Control selector encoding + enum EControlSelectorEncoding { + eCSE_Feature_Unknown = 0x00, + eCSE_Feature_Mute = 0x01, + eCSE_Feature_Volume = 0x02, + eCSE_Feature_LRBalance = 0x03, + eCSE_Feature_FRBalance = 0x04, + eCSE_Feature_Bass = 0x05, + eCSE_Feature_Mid = 0x06, + eCSE_Feature_Treble = 0x07, + eCSE_Feature_GEQ = 0x08, + eCSE_Feature_AGC = 0x09, + eCSE_Feature_Delay = 0x0a, + eCSE_Feature_BassBoost = 0x0b, + eCSE_Feature_Loudness = 0x0c, + }; + + FunctionBlockFeature(); + FunctionBlockFeature( const FunctionBlockFeature& rhs ); + virtual ~FunctionBlockFeature(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockFeature* clone() const; + + selector_length_t m_selectorLength; + audio_channel_number_t m_audioChannelNumber; + control_selector_t m_controlSelector; + + FunctionBlockFeatureVolume* m_pVolume; +}; + +/////////////////////////////////////////// + +class FunctionBlockProcessing: public IBusData +{ +// no complete implementation +public: + // Function block selector + enum EProcessingTypeEncoding { + ePTE_Mixer = 0x01, + ePTE_Generic = 0x02, + ePTE_UpDown = 0x03, + ePTE_DolbyProLogic = 0x04, + ePTE_3dStereoExtender = 0x05, + ePTE_Reverberation = 0x06, + ePTE_Chorus = 0x07, + ePTE_DynamicRangeCompression = 0x08, + }; + + // Control selector encoding + enum EControlSelectorEncoding { + eCSE_Processing_Unknown = 0x00, + eCSE_Processing_Enable = 0x01, + eCSE_Processing_Mode = 0x02, + eCSE_Processing_Mixer = 0x03, + eCSE_Processing_EnhancedMixer = 0xf1, + + // lots of definitions missing + + }; + + FunctionBlockProcessing(); + FunctionBlockProcessing( const FunctionBlockProcessing& rhs ); + virtual ~FunctionBlockProcessing(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockProcessing* clone() const; + + selector_length_t m_selectorLength; + input_fb_plug_number_t m_fbInputPlugNumber; + input_audio_channel_number_t m_inputAudioChannelNumber; + output_audio_channel_number_t m_outputAudioChannelNumber; + + FunctionBlockProcessingMixer* m_pMixer; + FunctionBlockProcessingEnhancedMixer* m_pEnhancedMixer; +}; + +/////////////////////////////////////////// + +class FunctionBlockCodec: public IBusData +{ +// dummy implementation +public: + // CODEC type endcoding + enum ECodecTypeEncoding { + eCTE_Unknown = 0x00, + eCTE_Ac3Decoder = 0x01, + eCTE_MpegDecoder = 0x02, + eCTE_DtsDecoder = 0x03, + }; + + FunctionBlockCodec(); + FunctionBlockCodec( const FunctionBlockCodec& rhs ); + virtual ~FunctionBlockCodec(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockCodec* clone() const; +}; + +/////////////////////////////////////////// +/////////////////////////////////////////// + +#define AVC1394_FUNCTION_BLOCK_CMD 0xB8 + +class FunctionBlockCmd: public AVCCommand +{ +public: + enum EFunctionBlockType { + eFBT_Selector = 0x80, + eFBT_Feature = 0x81, + eFBT_Processing = 0x82, + eFBT_Codec = 0x83, + }; + + enum EControlAttribute { + eCA_Resolution = 0x01, + eCA_Minimum = 0x02, + eCA_Maximum = 0x03, + eCA_Default = 0x04, + eCA_Duration = 0x08, + eCA_Current = 0x10, + eCA_Move = 0x18, + eCA_Delta = 0x19, + }; + + FunctionBlockCmd( Ieee1394Service& ieee1394service, + EFunctionBlockType eType, + function_block_id_t id, + EControlAttribute eCtrlAttrib ); + FunctionBlockCmd( const FunctionBlockCmd& rhs ); + virtual ~FunctionBlockCmd(); + + virtual bool serialize( IOSSerialize& se ); + virtual bool deserialize( IISDeserialize& de ); + virtual FunctionBlockCmd* clone() const; + + virtual const char* getCmdName() const + { return "FunctionBlockCmd"; } + + function_block_type_t m_functionBlockType; + function_block_id_t m_functionBlockId; + control_attribute_t m_controlAttribute; + + FunctionBlockSelector* m_pFBSelector; + FunctionBlockFeature* m_pFBFeature; + FunctionBlockProcessing* m_pFBProcessing; + FunctionBlockCodec* m_pFBCodec; +}; + +#endif Deleted: branches/echoaudio/src/libavc/avc_connect.cpp =================================================================== --- branches/echoaudio/src/libavc/avc_connect.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/libavc/avc_connect.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -1,54 +0,0 @@ -/* - * 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 library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software Foundation; - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "avc_connect.h" -#include "avc_serialize.h" -#include "libieee1394/ieee1394service.h" - -#include <netinet/in.h> -#include <iostream> - -using namespace std; - -ConnectCmd::ConnectCmd(Ieee1394Service& ieee1394service) - : AVCCommand( ieee1394service, AVC1394_CMD_CONNECT ) -{ -} - -ConnectCmd::~ConnectCmd() -{ -} - -bool -ConnectCmd::serialize( IOSSerialize& se ) -{ - AVCCommand::serialize( se ); - return true; -} - -bool -ConnectCmd::deserialize( IISDeserialize& de ) -{ - AVCCommand::deserialize( de ); - return true; -} Deleted: branches/echoaudio/src/libavc/avc_connect.h =================================================================== --- branches/echoaudio/src/libavc/avc_connect.h 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/libavc/avc_connect.h 2007-07-28 09:43:03 UTC (rev 502) @@ -1,45 +0,0 @@ -/* - * 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 library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software Foundation; - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#ifndef AVCCONNECT_H -#define AVCCONNECT_H - -#include "avc_generic.h" - -#include <libavc1394/avc1394.h> - -class ConnectCmd: public AVCCommand -{ -public: - ConnectCmd(Ieee1394Service& ieee1394service); - virtual ~ConnectCmd(); - - virtual bool serialize( IOSSerialize& se ); - virtual bool deserialize( IISDeserialize& de ); - - virtual const char* getCmdName() const - { return "ConnectCmd"; } -}; - - -#endif // AVCCONNECT_H Deleted: branches/echoaudio/src/libavc/avc_descriptor.cpp =================================================================== --- branches/echoaudio/src/libavc/avc_descriptor.cpp 2007-07-28 08:51:25 UTC (rev 501) +++ branches/echoaudio/src/libavc/avc_descriptor.cpp 2007-07-28 09:43:03 UTC (rev 502) @@ -1,541 +0,0 @@ -/* - * Copyright (C) 2007 by Pieter Palmers - * - * This file is part of FFADO - * FFADO = Free Firewire (pro-)audio drivers for linux - * - * FFADO is based upon FreeBoB - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License version 2.1, as published by the Free Software Foundation; - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301 USA - */ - -#include "avc_descriptor.h" -#include "avc_descriptor_cmd.h" - -#include "avc_serialize.h" -#include "libieee1394/ieee1394service.h" - -AVCDescriptorSpecifier::AVCDescriptorSpecifier( enum EType type ) - : m_type ( type ) - , m_listid_size ( 0 ) - , m_objectid_size ( 0 ) - , m_entrypos_size ( 0 ) - , m_info_block_type ( 0 ) - , m_info_block_instance ( 0 ) - , m_info_block_position ( 0 ) -{ - -} - -bool -AVCDescriptorSpecifier::serialize( IOSSerialize& se ) -{ - se.write( (byte_t)m_type, "AVCDescriptorSpecifier descriptor_specifier_type" ); - switch ( m_type ) { - case eIndentifier: - // nothing to serialize - return true; - case eInfoBlockByType: - se.write( m_info_block_type, "AVCDescriptorSpecifier info_block_type" ); - se.write( m_info_block_instance, "AVCDescriptorSpecifier instance_count" ); - return true; - case eInfoBlockByPosition: - se.write( m_info_block_position, "AVCDescriptorSpecifier info_block_position" ); - return true; - case eSubunit0x80: - // nothing to serialize - return true; - case eInvalid: - default: - debugError("Unsupported Descriptor Specifier type: 0x%02X\n",m_type); - return false; - } -} - -bool -AVCDescriptorSpecifier::deserialize( IISDeserialize& de ) -{ - de.read( (byte_t *)&m_type ); - switch ( m_type ) { - case eIndentifier: - // nothing to deserialize - return true; - case eInfoBlockByType: - de.read( &m_info_block_type); - de.read( &m_info_block_instance ); - case eInfoBlockByPosition: - de.read( &m_info_block_position); - - return true; - case eSubunit0x80: - // nothing to deserialize - return true; - case eInvalid: - default: - debugError("Unsupported Descriptor Specifier type: 0x%02X\n",m_type); - return false; - } - - return true; -} - -AVCDescriptorSpecifier* -AVCDescriptorSpecifier::clone() const -{ - return new AVCDescriptorSpecifier( *this ); -} - -//---------------------- -AVCDescriptor::AVCDescriptor( Ieee1394Service& ieee1394service ) - : IBusData() - , m_p1394Service( &ieee1394service ) - , m_nodeId( 0 ) - , m_subunit_type( eST_Unit ) - , m_subunit_id( 0x07 ) - , m_specifier ( AVCDescriptorSpecifier::eInvalid ) - , m_data ( NULL ) - , m_descriptor_length(0) -{ -} - -AVCDescriptor::AVCDescriptor( Ieee1394Service& ieee1394service, - fb_nodeid_t nodeId, ESubunitType subunitType, subunit_id_t subunitId ) - : IBusData() - , m_p1394Service( &ieee1394service ) - , m_nodeId( nodeId ) - , m_subunit_type( subunitType ) - , m_subunit_id( subunitId ) - , m_specifier ( AVCDescriptorSpecifier::eInvalid ) - , m_data ( NULL ) - , m_descriptor_length(0) -{ -} - -AVCDescriptor::AVCDescriptor( Ieee1394Service& ieee1394service, - fb_nodeid_t nodeId, ESubunitType subunitType, subunit_id_t subunitId, - AVCDescriptorSpecifier s ) - : IBusData() - , m_p1394Service( &ieee1394service ) - , m_nodeId( nodeId ) - , m_subunit_type( subunitType ) - , m_subunit_id( subunitId ) - , m_specifier ( s ) - , m_data ( NULL ) - , m_descriptor_length(0) -{ -} - -AVCDescriptor::~AVCDescriptor() -{ - if (m_data != NULL) free(m_data); -} - -bool -AVCDescriptor::load() -{ - bool result; - OpenDescriptorCmd openDescCmd(*m_p1394Service); - - debugOutput(DEBUG_LEVEL_VERBOSE, " Open descriptor (%s)\n",getDescriptorName()); - openDescCmd.setMode( OpenDescriptorCmd::eRead ); - openDescCmd.m_specifier=&m_specifier; - openDescCmd.setNodeId( m_nodeId ); - openDescCmd.setCommandType( AVCCommand::eCT_Control ); - openDescCmd.setSubunitType( getSubunitType() ); - openDescCmd.setSubunitId( getSubunitId() ); - openDescCmd.setVerbose( getVerboseLevel() ); - - result=openDescCmd.fire(); - - if (!result || (openDescCmd.getResponse() != AVCCommand::eR_Accepted)) { - debugOutput(DEBUG_LEVEL_VERBOSE, " Could not open descriptor\n"); - return false; - } - - debugOutput(DEBUG_LEVEL_VERBOSE, " Read status descriptor\n"); - ReadDescriptorCmd readDescCmd(*m_p1394Service); - readDescCmd.m_specifier=&m_specifier; - readDescCmd.setNodeId( m_nodeId ); - readDescCmd.setCommandType( AVCCommand::eCT_Control ); - readDescCmd.setSubunitType( getSubunitType() ); - readDescCmd.setSubunitId( getSubunitId() ); - readDescCmd.setVerbose( getVerboseLevel() ); - readDescCmd.m_data_length=2; - readDescCmd.m_address=0; - - result=readDescCmd.fire(); - - if (!result || (readDescCmd.getResponse() != AVCCommand::eR_Accepted)) { - debugOutput(DEBUG_LEVEL_VERBOSE, " Could not read descriptor\n"); - return false; - } - - size_t bytes_read=readDescCmd.m_data_length; - if (bytes_read < 2) { - debugOutput(DEBUG_LEVEL_VERBOSE, " Descriptor length field not present\n"); - return false; - } - - // obtain descriptor length - m_descriptor_length=(readDescCmd.m_data[0]<<8) + (readDescCmd.m_data[1]); - debugOutput(DEBUG_LEVEL_VERBOSE, " Descriptor length: %u\n", m_descriptor_length); - - if (m_data != NULL) free(m_data); - - m_data=(byte_t *)calloc(m_descriptor_length, 1); - if (m_data == NULL) { - debugError("Could not allocate memory for descriptor\n"); - return false; - } - - // we reread everything from here - bytes_read=0; - while(bytes_read<m_descriptor_length) { - - // read the full descriptor - readDescCmd.clear(); - readDescCmd.m_specifier=&m_specifier; - readDescCmd.setNodeId( m_nodeId ); - readDescCmd.setCommandType( AVCCommand::eCT_Control ); - readDescCmd.setSubunitType( getSubunitType() ); - readDescCmd.setSubunitId( getSubunitId() ); - readDescCmd.setVerbose( getVerboseLevel() ); - readDescCmd.m_data_length=m_descriptor_length-bytes_read; - // account for the length field - readDescCmd.m_address=bytes_read+2; - - result=readDescCmd.fire(); - - if (!result || (readDescCmd.getResponse() != AVCCommand::eR_Accepted)) { - debugOutput(DEBUG_LEVEL_VERBOSE, " Could not read descriptor data\n"); - return false; - } - - // copy the payload - - if (bytes_read+readDescCmd.m_data_length>m_descriptor_length) { - debugWarning("Device returned too much data, truncating\n"); - readDescCmd.m_data_length=m_descriptor_length-bytes_read; - } - - debugOutput(DEBUG_LEVEL_VERBOSE, " copying %u bytes to internal buffer offset %u\n",readDescCmd.m_data_length, bytes_read); - - memcpy(m_data+bytes_read,readDescCmd.m_data, readDescCmd.m_data_length); - bytes_read += readDescCmd.m_data_length; - - if((readDescCmd.getStatus() != ReadDescriptorCmd::eMoreToRead) - && ( bytes_read<m_descriptor_length )) { - debugError(" Still bytes to read but device claims not.\n"); - return false; - } - - } - //------------- - - debugOutput(DEBUG_LEVEL_VERBOSE, " Close descriptor\n"); - openDescCmd.clear(); - openDescCmd.setMode( OpenDescriptorCmd::eClose ); - openDescCmd.m_specifier=&m_specifier; - openDescCmd.setNodeId( m_nodeId ); - openDescCmd.setCommandType( AVCCommand::eCT_Control ); - openDescCmd.setSubunitType( getSubunitType() ); - openDescCmd.setSubunitId( getSubunitId() ); - openDescCmd.setVerbose( getVerboseLevel() ); - - result=openDescCmd.fire(); - - if (!result || (openDescCmd.getResponse() != AVCCommand::eR_Accepted)) { - debugOutput(DEBUG_LEVEL_VERBOSE, " Could not close descriptor\n"); - return false; - } - - debugOutput(DEBUG_LEVEL_VERBOSE, " Parse descriptor\n"); - // parse the descriptor - BufferDeserialize de( m_data, m_descriptor_length ); - result = deserialize( de ); - if (!result) { - debugOutp... [truncated message content] |