diff --git a/src/preferences/media/Jamfile b/src/preferences/media/Jamfile index 3908c937ad..7c27dc7fe6 100644 --- a/src/preferences/media/Jamfile +++ b/src/preferences/media/Jamfile @@ -7,7 +7,7 @@ if ! $(TARGET_PLATFORM_HAIKU_COMPATIBLE) { } UseLibraryHeaders icon ; -UsePrivateHeaders media ; +UsePrivateHeaders media shared ; Preference Media : Media.cpp diff --git a/src/preferences/media/MediaViews.cpp b/src/preferences/media/MediaViews.cpp index 8380e1cb1d..27dbc140b0 100644 --- a/src/preferences/media/MediaViews.cpp +++ b/src/preferences/media/MediaViews.cpp @@ -166,7 +166,7 @@ SettingsView::SettingsView (bool isVideo) void -SettingsView::AddNodes(BList& list, bool isInput) +SettingsView::AddNodes(NodeList& list, bool isInput) { BMenu* menu = isInput ? fMenu1 : fMenu2; void* item; @@ -178,8 +178,7 @@ SettingsView::AddNodes(BList& list, bool isInput) message.AddBool("isInput", isInput); for (int32 i = 0; i < list.CountItems(); i++) { - dormant_node_info* info - = static_cast(list.ItemAt(i)); + dormant_node_info* info = list.ItemAt(i); menu->AddItem(new SettingsItem(info, new BMessage(message))); } } diff --git a/src/preferences/media/MediaViews.h b/src/preferences/media/MediaViews.h index 9517fd7e39..4deaf43b9c 100644 --- a/src/preferences/media/MediaViews.h +++ b/src/preferences/media/MediaViews.h @@ -12,8 +12,6 @@ // Created : June 25, 2003 // // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - - #ifndef __MEDIAVIEWS_H__ #define __MEDIAVIEWS_H__ #include @@ -22,6 +20,8 @@ #include #include +#include + const uint32 ML_RESTART_MEDIA_SERVER = 'resr'; const uint32 ML_SHOW_VOLUME_CONTROL = 'shvc'; @@ -59,8 +59,10 @@ public: class SettingsView : public BView { public: + typedef BObjectList NodeList; + SettingsView(bool isVideo); - void AddNodes(BList &list, bool isInput); + void AddNodes(NodeList &nodes, bool isInput); void SetDefault(dormant_node_info &info, bool isInput, int32 outputID = -1); diff --git a/src/preferences/media/MediaWindow.cpp b/src/preferences/media/MediaWindow.cpp index 84ff94683e..d2e24d5787 100644 --- a/src/preferences/media/MediaWindow.cpp +++ b/src/preferences/media/MediaWindow.cpp @@ -50,6 +50,10 @@ MediaWindow::MediaWindow(BRect frame) B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), fCurrentNode(NULL), fParamWeb(NULL), + fAudioInputs(5, true), + fAudioOutputs(5, true), + fVideoInputs(5, true), + fVideoOutputs(5, true), fAlert(NULL), fInitCheck(B_OK) { @@ -66,14 +70,7 @@ MediaWindow::InitCheck() MediaWindow::~MediaWindow() { - for (int i = 0; i < fAudioOutputs.CountItems(); i++) - delete static_cast(fAudioOutputs.ItemAt(i)); - for (int i = 0; i < fAudioInputs.CountItems(); i++) - delete static_cast(fAudioInputs.ItemAt(i)); - for (int i = 0; i < fVideoOutputs.CountItems(); i++) - delete static_cast(fVideoOutputs.ItemAt(i)); - for (int i = 0; i < fVideoInputs.CountItems(); i++) - delete static_cast(fVideoInputs.ItemAt(i)); + _EmptyNodeLists(); BMediaRoster* roster = BMediaRoster::Roster(); if (roster && fCurrentNode) @@ -97,7 +94,21 @@ MediaWindow::~MediaWindow() void -MediaWindow::FindNodes(media_type type, uint64 kind, BList &list) +MediaWindow::_FindNodes() +{ + _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); + _FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); + _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); + _FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); + _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); + _FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); + _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); + _FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); +} + + +void +MediaWindow::_FindNodes(media_type type, uint64 kind, NodeList& into) { dormant_node_info node_info[64]; int32 node_info_count = 64; @@ -115,18 +126,20 @@ MediaWindow::FindNodes(media_type type, uint64 kind, BList &list) if (roster->GetDormantNodes(node_info, &node_info_count, format1, format2, NULL, kind)!=B_OK) { + // TODO: better error reporting! fprintf(stderr, "error\n"); return; } - for (int32 i = 0; iname, node_info[i].name); + strncpy(info->name, node_info[i].name, B_MEDIA_NAME_LENGTH); info->flavor_id = node_info[i].flavor_id; info->addon = node_info[i].addon; - list.AddItem(info); + into.AddItem(info); } } @@ -148,17 +161,27 @@ MediaWindow::FindMediaListItem(dormant_node_info* info) void -MediaWindow::AddNodes(BList &list, bool isVideo) +MediaWindow::_AddNodeItems(NodeList &list, bool isVideo) { - for (int32 i = 0; i(list.ItemAt(i)); + int32 count = list.CountItems(); + for (int32 i = 0; i < count; i++) { + dormant_node_info* info = list.ItemAt(i); if (!FindMediaListItem(info)) fListView->AddItem(new MediaListItem(info, 1, isVideo, &fIcons)); } } +void +MediaWindow::_EmptyNodeLists() +{ + fAudioOutputs.MakeEmpty(); + fAudioInputs.MakeEmpty(); + fVideoOutputs.MakeEmpty(); + fVideoInputs.MakeEmpty(); +} + + void MediaWindow::InitWindow(void) { @@ -283,34 +306,17 @@ MediaWindow::InitMedia(bool first) B_TRANSLATE("Ready for use" B_UTF8_ELLIPSIS)); } - void* listItem; - while ((listItem = fListView->RemoveItem((int32)0))) - delete static_cast(listItem); - while ((listItem = fAudioOutputs.RemoveItem((int32)0))) - delete static_cast(listItem); - while ((listItem = fAudioInputs.RemoveItem((int32)0))) - delete static_cast(listItem); - while ((listItem = fVideoOutputs.RemoveItem((int32)0))) - delete static_cast(listItem); - while ((listItem = fVideoInputs.RemoveItem((int32)0))) - delete static_cast(listItem); + _EmptyNodeLists(); // Grab Media Info - FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); - FindNodes(B_MEDIA_RAW_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); - FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_OUTPUT, fAudioOutputs); - FindNodes(B_MEDIA_ENCODED_AUDIO, B_PHYSICAL_INPUT, fAudioInputs); - FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); - FindNodes(B_MEDIA_RAW_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); - FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_OUTPUT, fVideoOutputs); - FindNodes(B_MEDIA_ENCODED_VIDEO, B_PHYSICAL_INPUT, fVideoInputs); + _FindNodes(); // Add video nodes first. They might have an additional audio // output or input, but still should be listed as video node. - AddNodes(fVideoOutputs, true); - AddNodes(fVideoInputs, true); - AddNodes(fAudioOutputs, false); - AddNodes(fAudioInputs, false); + _AddNodeItems(fVideoOutputs, true); + _AddNodeItems(fVideoInputs, true); + _AddNodeItems(fAudioOutputs, false); + _AddNodeItems(fAudioInputs, false); fAudioView->AddNodes(fAudioOutputs, false); fAudioView->AddNodes(fAudioInputs, true); diff --git a/src/preferences/media/MediaWindow.h b/src/preferences/media/MediaWindow.h index d6c49ba314..4f41e8497d 100644 --- a/src/preferences/media/MediaWindow.h +++ b/src/preferences/media/MediaWindow.h @@ -12,16 +12,18 @@ // Created : June 25, 2003 // // ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ - #ifndef __MEDIAWINDOWS_H__ #define __MEDIAWINDOWS_H__ + +#include +#include #include -#include #include #include -#include -#include +#include + +#include #include "MediaViews.h" #include "MediaListItem.h" @@ -46,10 +48,15 @@ public: private: + typedef BObjectList NodeList; + + status_t InitMedia(bool first); - void FindNodes(media_type type, uint64 kind, - BList &list); - void AddNodes(BList &list, bool isVideo); + void _FindNodes(); + void _FindNodes(media_type type, uint64 kind, + NodeList& into); + void _AddNodeItems(NodeList& from, bool isVideo); + void _EmptyNodeLists(); MediaListItem* FindMediaListItem(dormant_node_info* info); void InitWindow(); @@ -68,10 +75,11 @@ private: media_node* fCurrentNode; BParameterWeb* fParamWeb; - BList fAudioInputs; - BList fAudioOutputs; - BList fVideoInputs; - BList fVideoOutputs; + + NodeList fAudioInputs; + NodeList fAudioOutputs; + NodeList fVideoInputs; + NodeList fVideoOutputs; BList fIcons; MediaAlert* fAlert;