From 75d00d24514e53e58a59f0511d0872ace08cba66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 9 Mar 2007 15:43:41 +0000 Subject: [PATCH] It should now list and instanciate devices correctly... but doesn't work yet :-( git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20361 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../media-add-ons/legacy/LegacyMediaAddOn.cpp | 127 +++++++++++++++++- .../media-add-ons/legacy/LegacyMediaAddOn.h | 16 ++- 2 files changed, 136 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.cpp b/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.cpp index f0f4af4878..fc8ee0733e 100644 --- a/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.cpp +++ b/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.cpp @@ -7,11 +7,13 @@ #include +#include #include #include #include #include + #include "LegacyMediaAddOn.h" #include "LegacyAudioConsumer.h" @@ -21,20 +23,38 @@ LegacyMediaAddOn::LegacyMediaAddOn( image_id imid ) : BMediaAddOn( imid ) + , fInternalIds( 0 ) + , fListsLock( "LegacyMediaAddOn:ListLock" ) { fInitStatus = B_NO_INIT; - consumer = new LegacyAudioConsumer( this, "ymf744/1", 0 ); + fMediaFormat.type = B_MEDIA_RAW_AUDIO; + fMediaFormat.u.raw_audio = media_raw_audio_format::wildcard; + + fInitStatus = RecursiveScanForDevices(); + //consumer = new LegacyAudioConsumer( this, "ymf744/1", 0 ); //producer = new LegacyAudioProducer( "maestro2/1" ); - fInitStatus = B_OK; } LegacyMediaAddOn::~LegacyMediaAddOn() { - delete consumer; + //delete consumer; //delete producer; + LegacyDevice *dev; + while ((dev = (LegacyDevice *)fConsumers.RemoveItem((int32)0))) { + delete dev->consumer; + //delete dev->producer; + delete dev; + } + while ((dev = (LegacyDevice *)fProducers.RemoveItem((int32)0))) { + //delete dev->consumer; + //delete dev->producer; + delete dev; + } + + } @@ -48,13 +68,35 @@ LegacyMediaAddOn::InitCheck( const char **out_failure_text ) int32 LegacyMediaAddOn::CountFlavors() { - return 0; + int32 count; + BAutolock al(fListsLock); + + count = fConsumers.CountItems() + fProducers.CountItems(); + return count; } status_t LegacyMediaAddOn::GetFlavorAt( int32 n, const flavor_info **out_info ) { + BAutolock al(fListsLock); + LegacyDevice *dev; + if (n < 0) + return EINVAL; + for (n = fConsumers.CountItems() - 1; n >= 0; n--) { + dev = (LegacyDevice *)fConsumers.ItemAt(n); + if (dev->flavor.internal_id != n) + continue; + *out_info = &dev->flavor; + return B_OK; + } + for (n = fProducers.CountItems() - 1; n >= 0; n--) { + dev = (LegacyDevice *)fProducers.ItemAt(n); + if (dev->flavor.internal_id != n) + continue; + *out_info = &dev->flavor; + return B_OK; + } return B_ERROR; } @@ -62,6 +104,37 @@ LegacyMediaAddOn::GetFlavorAt( int32 n, const flavor_info **out_info ) BMediaNode * LegacyMediaAddOn::InstantiateNodeFor( const flavor_info *info, BMessage *config, status_t *out_error ) { + BAutolock al(fListsLock); + LegacyDevice *dev; + int32 n; + int32 consumerCount = fConsumers.CountItems(); + for (n = consumerCount - 1; n >= 0; n--) { + dev = (LegacyDevice *)fConsumers.ItemAt(n); + //if (info != &dev->flavor) // XXX memcmp? + if (info->internal_id != dev->flavor.internal_id) + continue; + if (dev->inuse) // EBUSY! + return NULL; + dev->consumer = new LegacyAudioConsumer( this, dev->name.String(), n ); + if (!dev->consumer) + return NULL; + dev->inuse = true; + return dev->consumer; + } +/* + for (n = fProducers.CountItems() - 1; n >= 0; n--) { + dev = (LegacyDevice *)fProducers.ItemAt(n); + if (info != &dev->flavor) // XXX memcmp? + continue; + if (dev->inuse) // EBUSY! + return NULL; + dev->producer = new LegacyAudioProducer( this, dev->name.String(), consumerCount + n ); + if (!dev->producer) + return NULL; + dev->inuse = true; + return dev->producer; + } +*/ return NULL; } @@ -94,14 +167,56 @@ LegacyMediaAddOn::RecursiveScanForDevices(const char *path) s.RemoveFirst(LEGACY_DEVICE_PATH_BASE"/"); // XXX: should check first for consumer or producer... - // XXX: use a struct/class - fConsumers.AddItem((void *)s.String()); + LegacyDevice *dev = new LegacyDevice; + dev->name = s.String(); + dev->flavor.name = (char *)/*WTF*/dev->name.String(); + dev->flavor.info = (char *)dev->name.String(); + dev->flavor.kinds = B_BUFFER_CONSUMER | /*B_CONTROLLABLE |*/ B_PHYSICAL_OUTPUT; + dev->flavor.flavor_flags = 0; //B_FLAVOR_IS_GLOBAL; + dev->flavor.internal_id = fInternalIds++; + dev->flavor.possible_count = 1; + dev->flavor.in_format_count = 1; + dev->flavor.in_format_flags = 0; + dev->flavor.in_formats = &fMediaFormat; + dev->flavor.out_format_count = 0; + dev->flavor.out_format_flags = 0; + dev->flavor.out_formats = NULL; + dev->inuse = false; + dev->consumer = NULL; + //dev->producer = NULL; + fConsumers.AddItem((void *)dev); //XXX: only cons for now //fProducers.AddItem(s.String()); } return B_OK; } +#if 0 + +struct flavor_info { + char * name; + char * info; + uint64 kinds; /* node_kind */ + uint32 flavor_flags; + int32 internal_id; /* For BMediaAddOn internal use */ + int32 possible_count; /* 0 for "any number" */ + + int32 in_format_count; /* for BufferConsumer kinds */ + uint32 in_format_flags; /* set to 0 */ + const media_format * in_formats; + + int32 out_format_count; /* for BufferProducer kinds */ + uint32 out_format_flags; /* set to 0 */ + const media_format * out_formats; + + uint32 _reserved_[16]; + +private: + flavor_info & operator=(const flavor_info & other); +}; +#endif + + BMediaAddOn * make_media_addon( image_id imid ) { diff --git a/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.h b/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.h index 6b655cede2..b3323e5a20 100644 --- a/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.h +++ b/src/add-ons/media/media-add-ons/legacy/LegacyMediaAddOn.h @@ -3,11 +3,23 @@ #include #include +#include +#include #include "LegacyAudioConsumer.h" //#include "LegacyAudioProducer.h" +class LegacyDevice { +public: + BString name; + flavor_info flavor; + bool inuse; + LegacyAudioConsumer *consumer; + //LegacyAudioProducer *producer; + +}; + class LegacyMediaAddOn : public BMediaAddOn { public: @@ -34,14 +46,16 @@ class LegacyMediaAddOn : public BMediaAddOn private: status_t fInitStatus; + int32 fInternalIds; flavor_info fFlavorInfo; media_format fMediaFormat; + BLocker fListsLock; BList fConsumers; BList fProducers; - LegacyAudioConsumer *consumer; + //OLD:LegacyAudioConsumer *consumer; };