diff --git a/src/preferences/media/Jamfile b/src/preferences/media/Jamfile index e585392e73..dcc11b630e 100644 --- a/src/preferences/media/Jamfile +++ b/src/preferences/media/Jamfile @@ -15,6 +15,7 @@ Preference Media : MediaListItem.cpp MediaViews.cpp MediaWindow.cpp + MidiSettingsView.cpp : media be localestub [ TargetLibsupc++ ] : media.rdef ; diff --git a/src/preferences/media/MediaListItem.cpp b/src/preferences/media/MediaListItem.cpp index 2e1e508d7e..e64238404c 100644 --- a/src/preferences/media/MediaListItem.cpp +++ b/src/preferences/media/MediaListItem.cpp @@ -21,6 +21,7 @@ #include "MediaIcons.h" #include "MediaWindow.h" +#include "MidiSettingsView.h" #define kITEM_MARGIN 1 @@ -307,6 +308,13 @@ NodeListItem::Comparator::Visit(AudioMixerListItem* item) } +void +NodeListItem::Comparator::Visit(MidiListItem* item) +{ + result = GREATER_THAN; +} + + // #pragma mark - DeviceListItem @@ -371,6 +379,13 @@ DeviceListItem::Comparator::Visit(AudioMixerListItem* item) } +void +DeviceListItem::Comparator::Visit(MidiListItem* item) +{ + result = LESS_THAN; +} + + void DeviceListItem::SetRenderParameters(Renderer& renderer) { @@ -454,8 +469,101 @@ AudioMixerListItem::Comparator::Visit(AudioMixerListItem* item) } +void +AudioMixerListItem::Comparator::Visit(MidiListItem* item) +{ + result = GREATER_THAN; +} + + void AudioMixerListItem::SetRenderParameters(Renderer& renderer) { renderer.AddIcon(&Icons()->mixerIcon); } + + +// #pragma mark - MidiListItem + +MidiListItem::MidiListItem(const char* title) + : + MediaListItem(), + fTitle(title) +{ +} + + +void +MidiListItem::AlterWindow(MediaWindow* window) +{ + window->SelectMidiSettings(fTitle); +} + + +const char* +MidiListItem::Label() +{ + return "MIDI"; +} + + +void +MidiListItem::Accept(MediaListItem::Visitor& visitor) +{ + visitor.Visit(this); +} + + +int +MidiListItem::CompareWith(MediaListItem* item) +{ + Comparator comparator(this); + item->Accept(comparator); + return comparator.result; +} + + +MidiListItem::Comparator::Comparator(MidiListItem* compareOthersTo) + : + result(0), + fTarget(compareOthersTo) +{ +} + + +void +MidiListItem::Comparator::Visit(NodeListItem* item) +{ + result = GREATER_THAN; +} + + +void +MidiListItem::Comparator::Visit(DeviceListItem* item) +{ + result = GREATER_THAN; + if (item->Type() == AUDIO_TYPE) + result = LESS_THAN; +} + + +void +MidiListItem::Comparator::Visit(AudioMixerListItem* item) +{ + result = LESS_THAN; +} + + +void +MidiListItem::Comparator::Visit(MidiListItem* item) +{ + result = 0; +} + + +void +MidiListItem::SetRenderParameters(Renderer& renderer) +{ + // TODO: Create a nice icon + renderer.AddIcon(&Icons()->mixerIcon); +} diff --git a/src/preferences/media/MediaListItem.h b/src/preferences/media/MediaListItem.h index fa71875773..2335f9e29c 100644 --- a/src/preferences/media/MediaListItem.h +++ b/src/preferences/media/MediaListItem.h @@ -27,6 +27,7 @@ class MediaWindow; class AudioMixerListItem; class DeviceListItem; +class MidiListItem; class NodeListItem; @@ -55,6 +56,7 @@ public: virtual void Visit(AudioMixerListItem* item) = 0; virtual void Visit(DeviceListItem* item) = 0; virtual void Visit(NodeListItem* item) = 0; + virtual void Visit(MidiListItem* item) = 0; }; virtual void Accept(Visitor& visitor) = 0; @@ -100,6 +102,7 @@ public: virtual void Visit(NodeListItem* item); virtual void Visit(DeviceListItem* item); virtual void Visit(AudioMixerListItem* item); + virtual void Visit(MidiListItem* item); int result; // -1 : < item; 0 : == item; 1 : > item @@ -137,6 +140,7 @@ public: virtual void Visit(NodeListItem* item); virtual void Visit(DeviceListItem* item); virtual void Visit(AudioMixerListItem* item); + virtual void Visit(MidiListItem* item); int result; // -1 : < item; 0 : == item; 1 : > item @@ -169,6 +173,7 @@ public: virtual void Visit(NodeListItem* item); virtual void Visit(DeviceListItem* item); virtual void Visit(AudioMixerListItem* item); + virtual void Visit(MidiListItem* item); int result; // -1 : < item; 0 : == item; 1 : > item @@ -185,4 +190,37 @@ private: const char* fTitle; }; + +class MidiListItem : public MediaListItem { +public: + MidiListItem(const char* title); + + virtual void AlterWindow(MediaWindow* window); + + virtual const char* Label(); + + virtual void Accept(MediaListItem::Visitor& visitor); + + struct Comparator : public MediaListItem::Visitor { + Comparator(MidiListItem* compareOthersTo); + virtual void Visit(NodeListItem* item); + virtual void Visit(DeviceListItem* item); + virtual void Visit(AudioMixerListItem* item); + virtual void Visit(MidiListItem* item); + + int result; + // -1 : < item; 0 : == item; 1 : > item + private: + MidiListItem* fTarget; + }; + + // -1 : < item; 0 : == item; 1 : > item + virtual int CompareWith(MediaListItem* item); + +private: + + virtual void SetRenderParameters(Renderer& renderer); + + const char* fTitle; +}; #endif /* __MEDIALISTITEM_H__ */ diff --git a/src/preferences/media/MediaWindow.cpp b/src/preferences/media/MediaWindow.cpp index edfffc62c4..04ac596d3e 100644 --- a/src/preferences/media/MediaWindow.cpp +++ b/src/preferences/media/MediaWindow.cpp @@ -36,7 +36,7 @@ #include #include "MediaIcons.h" - +#include "MidiSettingsView.h" #undef B_TRANSLATION_CONTEXT #define B_TRANSLATION_CONTEXT "Media Window" @@ -60,7 +60,7 @@ public: virtual void Visit(AudioMixerListItem*){} virtual void Visit(DeviceListItem*){} - + virtual void Visit(MidiListItem*){} virtual void Visit(NodeListItem* item) { item->Accept(fComparator); @@ -233,6 +233,14 @@ MediaWindow::SelectAudioMixer(const char* title) } +void +MediaWindow::SelectMidiSettings(const char* title) +{ + fContentLayout->SetVisibleItem(fContentLayout->IndexOfView(fMidiView)); + fTitleView->SetLabel(title); +} + + void MediaWindow::UpdateInputListItem(MediaListItem::media_type type, const dormant_node_info* node) @@ -371,6 +379,9 @@ MediaWindow::_InitWindow() fVideoView = new VideoSettingsView(); fContentLayout->AddView(fVideoView); + fMidiView = new MidiSettingsView(); + fContentLayout->AddView(fMidiView); + // Layout all views BLayoutBuilder::Group<>(this, B_HORIZONTAL) .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, @@ -455,6 +466,9 @@ MediaWindow::_InitMedia(bool first) MediaListItem::AUDIO_TYPE); fListView->AddItem(audio); + MidiListItem* midi = new MidiListItem(B_TRANSLATE("MIDI Settings")); + fListView->AddItem(midi); + MediaListItem* video = new DeviceListItem(B_TRANSLATE("Video settings"), MediaListItem::VIDEO_TYPE); fListView->AddItem(video); diff --git a/src/preferences/media/MediaWindow.h b/src/preferences/media/MediaWindow.h index 7b03aa2b49..be0af2f24d 100644 --- a/src/preferences/media/MediaWindow.h +++ b/src/preferences/media/MediaWindow.h @@ -29,7 +29,7 @@ class BCardLayout; class BSeparatorView; - +class MidiSettingsView; class MediaWindow : public BWindow { public: @@ -43,6 +43,7 @@ public: void SelectAudioSettings(const char* title); void SelectVideoSettings(const char* title); void SelectAudioMixer(const char* title); + void SelectMidiSettings(const char* title); // methods to be called by SettingsViews... void UpdateInputListItem( @@ -99,6 +100,7 @@ private: BCardLayout* fContentLayout; AudioSettingsView* fAudioView; VideoSettingsView* fVideoView; + MidiSettingsView* fMidiView; SmartNode fCurrentNode; BParameterWeb* fParamWeb; diff --git a/src/preferences/media/MidiSettingsView.cpp b/src/preferences/media/MidiSettingsView.cpp new file mode 100644 index 0000000000..b6df74bbe8 --- /dev/null +++ b/src/preferences/media/MidiSettingsView.cpp @@ -0,0 +1,177 @@ +/* + * Copyright 2014, Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + */ + +#include "MidiSettingsView.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "Midi View" + +#define SETTINGS_FILE "midi" + +const static uint32 kSelectSoundFont = 'SeSf'; + + +MidiSettingsView::MidiSettingsView() + : + SettingsView() +{ + BBox* defaultsBox = new BBox("SoundFont"); + defaultsBox->SetLabel(B_TRANSLATE("SoundFont")); + BGridView* defaultsGridView = new BGridView(); + + fListView = new BListView(B_SINGLE_SELECTION_LIST); + fListView->SetSelectionMessage(new BMessage(kSelectSoundFont)); + + BScrollView *scrollView = new BScrollView("ScrollView", fListView, + 0, false, true); + BLayoutBuilder::Grid<>(defaultsGridView) + .SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING, + B_USE_DEFAULT_SPACING) + .Add(scrollView, 0, 0); + + defaultsBox->AddChild(defaultsGridView); + + BLayoutBuilder::Group<>(this) + .SetInsets(0, 0, 0, 0) + .Add(defaultsBox) + .AddGlue(); +} + + +/* virtual */ +void +MidiSettingsView::AttachedToWindow() +{ + SettingsView::AttachedToWindow(); + + fListView->SetTarget(this); + _RetrieveSoftSynthList(); + + _LoadSettings(); +} + + +/* virtual */ +void +MidiSettingsView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kSelectSoundFont: + _SaveSettings(); + break; + + default: + SettingsView::MessageReceived(message); + break; + } +} + + +void +MidiSettingsView::_RetrieveSoftSynthList() +{ + char **paths = NULL; + size_t pathCount = 0; + status_t status = find_paths(B_FIND_PATH_DATA_DIRECTORY, "synth", + &paths, &pathCount); + if (status != B_OK) + return; + + fListView->MakeEmpty(); + + for (size_t i = 0; i < pathCount; i++) { + BDirectory directory(paths[i]); + BEntry entry; + if (directory.InitCheck() != B_OK) + continue; + while (directory.GetNextEntry(&entry) == B_OK) { + // TODO: Get rid of this as soon as we update + // the SoundFont package not to create the link + // anymore + if (!strcmp(entry.Name(), "big_synth.sy")) + continue; + BNode node(&entry); + BNodeInfo nodeInfo(&node); + char mimeType[B_MIME_TYPE_LENGTH]; + // TODO: For some reason this doesn't work + if (nodeInfo.GetType(mimeType) == B_OK + /*&& !strcmp(mimeType, "audio/x-soundfont")*/) { + BPath fullPath = paths[i]; + fullPath.Append(entry.Name()); + fListView->AddItem(new BStringItem(fullPath.Path())); + } + } + } +} + + +void +MidiSettingsView::_LoadSettings() +{ + // TODO: Duplicated code between here + // and BSoftSynth::LoadDefaultInstruments + + char buffer[512]; + BPath path; + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { + path.Append(SETTINGS_FILE); + BFile file(path.Path(), B_READ_ONLY); + if (file.InitCheck() == B_OK) + file.Read(buffer, sizeof(buffer)); + } + + char soundFont[512]; + sscanf(buffer, "# Midi Settings\n soundfont = %s\n", + soundFont); + + for (int32 i = 0; i < fListView->CountItems(); i++) { + BStringItem* item = (BStringItem*)fListView->ItemAt(i); + if (!strcmp(item->Text(), soundFont)) { + fListView->Select(i); + break; + } + } +} + + +void +MidiSettingsView::_SaveSettings() +{ + int32 selection = fListView->CurrentSelection(); + if (selection < 0) + return; + BStringItem* item = (BStringItem*)fListView->ItemAt(selection); + if (item == NULL) + return; + + char buffer[512]; + snprintf(buffer, 512, "# Midi Settings\n soundfont = %s\n", + item->Text()); + + BPath path; + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { + path.Append(SETTINGS_FILE); + BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); + if (file.InitCheck() == B_OK) + file.Write(buffer, strlen(buffer)); + } +} + diff --git a/src/preferences/midi/MidiView.h b/src/preferences/media/MidiSettingsView.h similarity index 72% rename from src/preferences/midi/MidiView.h rename to src/preferences/media/MidiSettingsView.h index 44b7090d63..d267c44fc6 100644 --- a/src/preferences/midi/MidiView.h +++ b/src/preferences/media/MidiSettingsView.h @@ -7,20 +7,21 @@ #define MIDIVIEW_H_ -#include +#include "MediaViews.h" class BButton; class BListView; -class MidiView : public BGroupView { +class MidiSettingsView : public SettingsView { public: - MidiView(); + MidiSettingsView(); virtual void AttachedToWindow(); virtual void MessageReceived(BMessage* message); private: void _RetrieveSoftSynthList(); + void _LoadSettings(); + void _SaveSettings(); - BButton* fImportButton; BListView* fListView; }; diff --git a/src/preferences/midi/Jamfile b/src/preferences/midi/Jamfile deleted file mode 100644 index b67bcd3931..0000000000 --- a/src/preferences/midi/Jamfile +++ /dev/null @@ -1,8 +0,0 @@ -SubDir HAIKU_TOP src preferences midi ; - -Preference Midi : - MidiApp.cpp - MidiView.cpp - MidiWindow.cpp - : midi be localestub [ TargetLibsupc++ ] - ; diff --git a/src/preferences/midi/MidiApp.cpp b/src/preferences/midi/MidiApp.cpp deleted file mode 100644 index b3e1bec09c..0000000000 --- a/src/preferences/midi/MidiApp.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014, Haiku, Inc. All rights reserved. - * Distributed under the terms of the MIT License. - */ - -#include - -#include "MidiWindow.h" - -class MidiApp : public BApplication { -public: - MidiApp(); - virtual void ReadyToRun(); -}; - - -int main() -{ - MidiApp app; - app.Run(); - - return 0; -} - - -MidiApp::MidiApp() - : - BApplication("application/x-vnd.MidiPreflet") -{ - -} - - -/* virtual */ -void -MidiApp::ReadyToRun() -{ - (new MidiWindow())->Show(); -} diff --git a/src/preferences/midi/MidiView.cpp b/src/preferences/midi/MidiView.cpp deleted file mode 100644 index 2fdb87c90d..0000000000 --- a/src/preferences/midi/MidiView.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2014, Haiku, Inc. All rights reserved. - * Distributed under the terms of the MIT License. - */ - -#include "MidiView.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -const static uint32 kImportSoundFont = 'ImSf'; - -MidiView::MidiView() - : - BGroupView(B_VERTICAL, B_USE_DEFAULT_SPACING) -{ - BBox* defaultsBox = new BBox("defaults"); - defaultsBox->SetLabel("Defaults"); - BGridView* defaultsGridView = new BGridView(); - - fListView = new BListView(B_SINGLE_SELECTION_LIST); - fImportButton = new BButton("Import SoundFont", - new BMessage(kImportSoundFont)); - - BLayoutBuilder::Grid<>(defaultsGridView) - .SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING, - B_USE_DEFAULT_SPACING) - .Add(fListView, 0, 0) - .Add(fImportButton, 0, 1); - - defaultsBox->AddChild(defaultsGridView); - - BLayoutBuilder::Group<>(this) - .SetInsets(0, 0, 0, 0) - .Add(defaultsBox) - .AddGlue(); -} - - -/* virtual */ -void -MidiView::AttachedToWindow() -{ - fImportButton->SetTarget(this); - _RetrieveSoftSynthList(); -} - - -/* virtual */ -void -MidiView::MessageReceived(BMessage* message) -{ - switch (message->what) { - case kImportSoundFont: - break; - - default: - BGroupView::MessageReceived(message); - break; - } -} - - -void -MidiView::_RetrieveSoftSynthList() -{ - char **paths = NULL; - size_t pathCount = 0; - status_t status = find_paths(B_FIND_PATH_DATA_DIRECTORY, "synth", - &paths, &pathCount); - if (status != B_OK) - return; - - fListView->MakeEmpty(); - - for (size_t i = 0; i < pathCount; i++) { - BDirectory directory(paths[i]); - BEntry entry; - if (directory.InitCheck() != B_OK) - continue; - while (directory.GetNextEntry(&entry) == B_OK) { - fListView->AddItem(new BStringItem(entry.Name())); - } - } -} diff --git a/src/preferences/midi/MidiWindow.cpp b/src/preferences/midi/MidiWindow.cpp deleted file mode 100644 index e4a3a9ea0a..0000000000 --- a/src/preferences/midi/MidiWindow.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2014, Haiku, Inc. All rights reserved. - * Distributed under the terms of the MIT License. - */ - -#include "MidiWindow.h" - -#include - -#include "MidiView.h" - - -MidiWindow::MidiWindow() - : - BWindow(BRect(40, 40, 260, 260), "Midi Preferences", - B_TITLED_WINDOW, B_SUPPORTS_LAYOUT) -{ - fMidiView = new MidiView(); - BLayoutBuilder::Group<>(this, B_HORIZONTAL) - .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, - B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING) - .Add(fMidiView, 0.0f); -} - - diff --git a/src/preferences/midi/MidiWindow.h b/src/preferences/midi/MidiWindow.h deleted file mode 100644 index 2c16551e62..0000000000 --- a/src/preferences/midi/MidiWindow.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2014, Haiku, Inc. All rights reserved. - * Distributed under the terms of the MIT License. - */ -#ifndef MIDIWINDOW_H_ -#define MIDIWINDOW_H_ - -#include - -class MidiView; -class MidiWindow : public BWindow { -public: - MidiWindow(); -private: - MidiView* fMidiView; -}; - - -#endif /* MIDIWINDOW_H_ */