xref: /haiku/src/add-ons/media/media-add-ons/vst_host/VSTAddOn.cpp (revision 268f99dd7dc4bd7474a8bd2742d3f1ec1de6752a)
1 /*
2  * Copyright 2012, Gerasim Troeglazov (3dEyes**), 3dEyes@gmail.com.
3  * All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 
7 #include <Entry.h>
8 #include <Directory.h>
9 #include <FindDirectory.h>
10 #include <PathFinder.h>
11 #include <StringList.h>
12 
13 #include "VSTNode.h"
14 #include "VSTAddOn.h"
15 
make_media_addon(image_id image)16 extern "C" _EXPORT BMediaAddOn* make_media_addon(image_id image)
17 {
18 	return new VSTAddOn(image);
19 }
20 
VSTAddOn(image_id image)21 VSTAddOn::VSTAddOn(image_id image)
22 	:
23 	BMediaAddOn(image)
24 {
25 	fPluginsList.MakeEmpty();
26 
27 	BStringList folders;
28 
29 	BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY,
30 		"media/vstplugins/", B_FIND_PATH_EXISTING_ONLY, folders);
31 
32 	for (int32 i = 0; i < folders.CountStrings(); i++)
33 		ScanPluginsFolder(folders.StringAt(i).String());
34 }
35 
~VSTAddOn()36 VSTAddOn::~VSTAddOn()
37 {
38 
39 }
40 
41 status_t
InitCheck(const char ** text)42 VSTAddOn::InitCheck(const char** text)
43 {
44 	return B_OK;
45 }
46 
47 int32
CountFlavors()48 VSTAddOn::CountFlavors()
49 {
50 	return fPluginsList.CountItems();
51 }
52 
53 status_t
GetFlavorAt(int32 idx,const flavor_info ** info)54 VSTAddOn::GetFlavorAt(int32 idx, const flavor_info** info)
55 {
56 	if (idx < 0 || idx >= fPluginsList.CountItems())
57 		return B_ERROR;
58 
59 	VSTPlugin *plugin = (VSTPlugin*)fPluginsList.ItemAt(idx);
60 
61 	flavor_info *f_info = new flavor_info;
62 	f_info->internal_id = idx;
63 	f_info->kinds = B_BUFFER_CONSUMER | B_BUFFER_PRODUCER | B_CONTROLLABLE;
64 	f_info->possible_count = 0;
65 	f_info->flavor_flags = 0;
66 	f_info->name = plugin->ModuleName();
67 	f_info->info = plugin->Product();
68 
69 	media_format *format = new media_format;
70 	format->type = B_MEDIA_RAW_AUDIO;
71 	format->u.raw_audio = media_raw_audio_format::wildcard;
72 	format->u.raw_audio.format = media_raw_audio_format::B_AUDIO_FLOAT;
73 
74 	f_info->in_format_count = 1;
75 	f_info->in_formats = format;
76 
77 	format = new media_format;
78 	format->type = B_MEDIA_RAW_AUDIO;
79 	format->u.raw_audio = media_raw_audio_format::wildcard;
80 	format->u.raw_audio.format = media_raw_audio_format::B_AUDIO_FLOAT;
81 
82 	f_info->out_format_count = 1;
83 	f_info->out_formats = format;
84 
85 	*info = f_info;
86 
87 	return B_OK;
88 }
89 
90 BMediaNode*
InstantiateNodeFor(const flavor_info * info,BMessage * config,status_t * err)91 VSTAddOn::InstantiateNodeFor(const flavor_info* info, BMessage* config,
92 								  status_t* err)
93 {
94 	VSTPlugin* plugin = (VSTPlugin*)fPluginsList.ItemAt(info->internal_id);
95 	VSTNode* node = new VSTNode(this, plugin->ModuleName(), plugin->Path());
96 	return node;
97 }
98 
99 int
ScanPluginsFolder(const char * path,bool make_dir)100 VSTAddOn::ScanPluginsFolder(const char* path, bool make_dir)
101 {
102 	BEntry ent;
103 
104 	BDirectory dir(path);
105 	if (dir.InitCheck() != B_OK) {
106 		if (make_dir == true)
107 			create_directory(path, 0755);
108 		return 0;
109 	}
110 
111 	while(dir.GetNextEntry(&ent) == B_OK) {
112 		BPath p(&ent);
113 		if (ent.IsDirectory()) {
114 			ScanPluginsFolder(p.Path());
115 		} else {
116 			VSTPlugin* plugin = new VSTPlugin();
117 			int ret = plugin->LoadModule(p.Path());
118 			if (ret == B_OK) {
119 				plugin->UnLoadModule();
120 				fPluginsList.AddItem(plugin);
121 			} else
122 				delete plugin;
123 		}
124 	}
125 	return 0;
126 }
127 
128 status_t
GetConfigurationFor(BMediaNode * node,BMessage * message)129 VSTAddOn::GetConfigurationFor(BMediaNode* node, BMessage* message)
130 {
131 	return B_OK;
132 }
133 
134 bool
WantsAutoStart()135 VSTAddOn::WantsAutoStart()
136 {
137 	return false;
138 }
139 
140 status_t
AutoStart(int count,BMediaNode ** node,int32 * id,bool * more)141 VSTAddOn::AutoStart(int count, BMediaNode** node, int32* id, bool* more)
142 {
143 	return B_OK;
144 }
145