Проект является opensource и доступен на GitHub https://github.com/martin211/aimp_dotnet (https://github.com/martin211/aimp_dotnet)Очень здорово, +1 как минимум! Обязательно поизучаю :)
Какая версия .NET использкется?
Есть планы по Aimp RemoteAPI? Дело в том, что я его портировал, но пока так и не решился выложить код (не хватает законченного примера).
Я скопировал плагин из релиза в папку Plugins, но он не появляется в AIMP'e.Ну самый простой вариант, копировали dll-ку в отдельную одноименную (dll-файлу) папку? Установка старых плагинов на v3.60 (https://www.aimp.ru/forum/index.php?topic=44978.0).
Ну самый простой вариант, копировали dll-ку в отдельную одноименную (dll-файлу) папку?Я так и делал.
Здравствуйте! :)
Хочу попробовать написать плагин на C#.
Я скопировал плагин из релиза в папку Plugins, но он не появляется в AIMP'e.
Martin, не могли бы вы сделать небольшую инструкцию, как создавать проект для написания нового плагина?
Или этот SDK не поддерживает AIMP 4?
А будет работать в студии 2010?
Нужна 2013 или 2015?
И ещё вопрос, SDK поддерживает возможность получение массива данных спектра?
А вы можете хотя бы примерно назвать сроки, когда будет реализована визуализация, или этого в планах нет?
Ошибка C1083 Не удается открыть файл включение: boost/intrusive_ptr.hpp: No such file or directory aimp_dotnet d:\zapis\___aimp\aimp_dotnet-master\aimp_dotnet\Stdafx.h
Ну и конечно же буду ожидать сервисы визуализации.
После вызова и закрытия формы плагина dotnet_demo повторный вызов выдаёт критическое исключение E0434352.
public void Draw(IntPtr dc, AimpVisualData data)
{
var g = Graphics.FromHdc(dc);
g.Clear(Color.Black);
for (int i = 0; i < 100; i++)
{
g.DrawLine(new Pen(Color.Orange), (float)i, 45, (float)i, 45 - (float)data.Spectrum[1][i]);
}
}
Вот только мне непонятно, почему Spectrum состоит из 3-х индексов по 256 элементов, а не из двух? Разве кроме левого и правого каналов там ещё что-то есть?
Spectrum(3) TAIMPVisualDataSpectrum
Массив из трех элементов типа TAIMPVisualDataSpectrum.
0 - спектр левого канала
1 - спектр правого канала
2 - спектр суммы левого и правого каналов
Данные заполняются только в том случае, если расширение вернуло в GetFlags флаг AIMP_VISUAL_FLAGS_RQD_DATA_SPECTRUM.
TAIMPVisualDataWaveform
array [0..AIMP_VISUAL_WAVEFORM_MAX - 1] of Single;
Исходные данные сигнала в виде "волны".
Распределение значений: [-бесконечность .. -1.0 .. 0.0 .. 1.0 .. бесконечность], где |1.0| равно 0 дБ.
Практически всегда в data.WaveForm массиве нули.TAIMPVisualDataSpectrum
array [0..AIMP_VISUAL_SPECTRUM_MAX - 1] of Single;
Распределение значений: [0.0 .. 100.0 .. бесконечность]
но там значения от 0 до 100, поэтому всё хорошо.Спасибо огромное за помощь!Впечетляюще! +1 Очень здорово!
Вот что получилось: http://lightportal.at.ua/publ/cvetomuzykalnye_ustanovki/aimp_plagin_dlja_cmu_soyuz_lt/3-1-0-118
На подходе спектроанализатор на светодиодных модулях. :D
Прошу прощения, создал репозиторий, переписал все интерфейсы на C# (все, которые были в SDK https://aimp.ru/files/sources/aimp_sdk.zip)Очень здорово, спасибо! +1
https://github.com/antrv/AIMP-net-api
Для отладки я создал символическую ссылку на папку bin\Debug проекта SamplePlugin в папке AIMP4\Plugins, в свойствах проекта на вкладке Debug указал Start external program и путь к AIMP.exe.
Почему-то 2015 студия не хочет восстановить пакет 'UnmanagedExports' из репозитория. Хотя при открытии солюшена из вложения (https://www.aimp.ru/forum/index.php?topic=21774.msg322103#msg322103) восстановила. ???Nuget пакеты я не кладу в репозиторий, у меня они при компиляции сами скачиваются.
public void Initialize(IAIMPCore core)
{
var testString = "Test";
var dialogName = (IAIMPString)core.CreateObject(typeof(IAIMPString).GUID);
dialogName.SetData(testString, testString.Length);
MessageBox.Show(dialogName.GetData());
}
Добил спектроанализатор:Можна исходники?
http://lightportal.at.ua/publ/spektroanalizatory/spektroanalizator_plagin_aimp/18-1-0-121
А есть информация как в массиве спектра частота распределена?(какой индекс какой частоте соответствует) А какой максимум по значениям?
SDK поддерживает AIMP 4.10?Конечно.
Шкала логарифмическая:
0 - 20 Гц
128 - ~4.3 KГц
255 - 20 КГц
Желающие писать плагины на C#, VB и других Net. языках могут воспользоваться данной SDK оберткой. Которая представляет из себя AIMP плагин, представляющий собой прослойку между AIMP и DotNet.
Плагин находится в стадии разработки и некоторые возможности из SDK еще не реализованы, так же существуют и баги, которые исправляются по мере возможности.
Проект является opensource и доступен на GitHub https://github.com/martin211/aimp_dotnet (https://github.com/martin211/aimp_dotnet)
Бинарные файлы можно скачать тут https://github.com/martin211/aimp_dotnet/releases (https://github.com/martin211/aimp_dotnet/releases)
Как пользоваться:
1. Создаем новый проект плагина на c#.
2. Подключаем в проект сборку AIMP.SDK.dll
3. Реализуем нужный функционал, примеры реализации можно скачать с github. Там пока 2 демо-плагина.
4. В папке Aimp\Plugins создаем новую папку, например dotnet_myplugin.
5. Необходимо переименовать aimp_dotnet.dll в dotnet_myplugin.dll и скопировать в папку Aimp\Plugins\dotnet_myplugin
6. Билдим наш плагин и копируем его в туже папку.
7. Открываем настройки плагинов aimp'a и должны увидеть наш плагин
Еще на компьютере должены быть установлены C++ 2015 Redist x86 (https://www.microsoft.com/ru-ru/download/details.aspx?id=48145) версии не ниже 14.0.23026
Hello, I really appreciate the work you did on this project.
I have a question on your MediaLibrary branch. Do you plan to support IAIMPMLGroupingTreeDataProvider and IAIMPMLGroupingTreeDataProviderSelection?
Thanks.
Hi. Thanks. Yes, I'll continue work on this branch after my vacation.
Hi, is grouping tree stuff in an usable state yet?
I can't get it to work. No official documentation for aimp sdk does not help either.
Hi, I saw that you updated the grouping tree demo plugin. Does it work for you?
Also why are you not using Marshal.GetObjectForNativeVariant and Marshal.GetNativeVariantForObject in ToVariant and FromVariant methods?
I dont know anything about COM but it seems like currently you only allow string to be converted to variant.
IAIMPMLDataFilterGroup.Add seems to be throwing an exception in AimpDataFilterGroup::Add, could not find anything wrong in the code so I think its a bug in aimp?
Уважаемый Martin!
На некоторых компьютерах Аимп не видит плагин, хотя фреймворк установлен 4.5 и с++ нужной версии тоже.
Что ещё может влиять на его видимость?
Why isn't this working? I've downloaded the source and then I tried to build the dotnet_demo app. It builds correctly and then I put the dotnet_demo.dll file in my Plugins/dotnet_demo folder. I open AIMP and check the plugins settings, but I don't see the plugin I built.
What am I missing here?
Hi, I saw that you updated the grouping tree demo plugin. Does it work for you?
I have this problem with your plugin and mine where it only shows the last node from IAimpGroupingTreeDataProviderSelection.
You put there dotnet_demo.dll file only?You mean in the folder "C:\Program Files (x86)\AIMP\Plugins\dotnet_demo"?
There should be 3 files: AIMP.SDK.dll, dotnet_demo.dll, dotnet_demo_plugin.dll
You can build sources at release mode and then check the folder 'aimp_dotnet\Release\AIMP.SDK\Demos\'
You mean in the folder "C:\Program Files (x86)\AIMP\Plugins\dotnet_demo"?
If so, yes, there are.
Got it working! I want to create a universal class library, but the SDK targets .NETFramework and what I'm using is .NETCore. Anything I can do about that?
Hi. I've fixed it. Now all nodes are displayed
День добрый.
Плагин будет работать как в версии AIMP 3.60 так и в 4.0.
На данный момент aimp_dotnet.dll, это плагин загрузчик, который загружает ваш плагин и позволяет ему общаться с плеером.
Порядок действий такой:
1. Создаем новый проект плагина на c#.
2. Подключаем в проект сборку AIMP.SDK.dll
3. Реализуем нужный функционал, примеры реализации можно скачать с github. Там пока 2 демо-плагина.
4. В папке Aimp\Plugins создаем новую папку кредо убийцы (http://my-movies.org/load/zhanry/kredo_ubijcy/1-1-0-1113), например dotnet_myplugin.
5. Необходимо переименовать aimp_dotnet.dll в dotnet_myplugin.dll и скопировать в папку Aimp\Plugins\dotnet_myplugin
6. Билдим наш плагин и копируем его в туже папку.
7. Открываем настройки плагинов aimp'a и должны увидеть наш плагин
Еще на компьютере должены быть установлены C++ 2015 Redist x86 (https://www.microsoft.com/ru-ru/download/details.aspx?id=48145) версии не ниже14.0.23026
И еще, сдк еще сырой и не все возможности присутствуют
DotNetPlugin: QueryInterface
Exception thrown: 'System.AccessViolationException' in aimp_dotnet.dll
InternalAimpGroupingTreeDataProvider.Release
AIMP.exe Information: 0 : Dispose AimpCore
Dispose ManagedAimpCore
Detected memory leaks!
Dumping objects ->
h:\.projects\csharp\aimp.dlna\aimp.dlna\lib\aimp_dotnet\aimp_dotnet\sdk\musiclibrary\AimpGroupingPresets.h(43) : {157} normal block at 0x094B05D8, 12 bytes long.
Data: < ` p > A8 60 D3 06 70 11 E4 06 01 00 00 00
SDK\ManagedAimpCore.cpp(103) : {154} normal block at 0x09523C18, 12 bytes long.
Data: <pl > 70 6C D3 06 01 00 00 00 88 11 E4 06
SDK\ManagedAimpCore.cpp(99) : {153} normal block at 0x095235F8, 12 bytes long.
Data: <Xl > 58 6C D3 06 01 00 00 00 8C 11 E4 06
AimpDotnetPlugin.cpp(12) : {145} normal block at 0x00CABA48, 36 bytes long.
Data: < d <d > 14 64 D3 06 01 00 00 00 3C 64 D3 06 CD 00 CD CD
Object dump complete.
public enum AimpActionResult : uint
{
Ok = 0x00000000,
AccessDenied = 0x80070005,
Handle = 0x80070006,
InvalidArguments = 0x80070057,
NotImplemented = 0x80004001,
Unexpected = 0x8000FFFF,
Fail = 0x80004005
}
Martin, are you going to fix the bug with AimpActionResult I mentioned in my last post?
Or its not a bug and I am missing something?
Thanks.
Добрый день господа. Перепробовал уже все варианты описанные на форуме, но AIMP так и не увидел плагины, может надо еще что то устанавливать или настройки какие то делать?
Здравствуйте! У меня возникла проблема. Никак не могу подписаться на событие TrackChanged. Событие не срабатывает. Прокси и сам плагин работает
Приветствую. Посмотрю на днях.
Исправил.
Проект является opensource и доступен на GitHub https://github.com/martin211/aimp_dotnet (https://github.com/martin211/aimp_dotnet)1) Скачал бинарник. Бинарник dotnet_visual поместил в AIMP\Plugins\dotnet_visual. AIMP увидел плагин. В диалоге настроек поставил соответствующую галку - плагин заработал. Рисует какие-то кривули в такт музыке.
Бинарные файлы можно скачать тут https://github.com/martin211/aimp_dotnet/releases (https://github.com/martin211/aimp_dotnet/releases)
Как пользоваться:
1. Создаем новый проект плагина на c#.
2. Подключаем в проект сборку AIMP.SDK.dll
3. Реализуем нужный функционал, примеры реализации можно скачать с github. Там пока 2 демо-плагина.
4. В папке Aimp\Plugins создаем новую папку, например dotnet_myplugin.
5. Необходимо переименовать aimp_dotnet.dll в dotnet_myplugin.dll и скопировать в папку Aimp\Plugins\dotnet_myplugin
6. Билдим наш плагин и копируем его в туже папку.
7. Открываем настройки плагинов aimp'a и должны увидеть наш плагин
:o Чё я делаю не так?
Кстати, а что за таинственный 3-й файл dotnet_visual_plugin.dll
В бинарнике он есть, а в проекте я его не вижу.
Может дело в нем?
Не получается сбилдить проект aimp_dotnet в VS2017. Ошибка: LNK2001 unresolved external symbol __CorDllMain@12.
В Windows SDK были установлены не все компоненты. После добавления C++ arm Apps ошибка пропала.
Спасибо, Martin :)
Как пользоваться этим простому пользователю? Кинул всё из папки AIMP.SDK в папку AIMP и ни один плагин не отображается в меню плагиновпростому пользователю это не нужно, это для разработчиков плагинов
народ что-то никак не могу заставить работать ни один демо плагин:
качаю от сюда релиз: https://github.com/martin211/aimp_dotnet/releases/download/AIMP.SDK_4.50.2042.11347/AIMP.SDK.zip
Где можно скачать (или кто может поделиться) уже собранным файлом AIMP.SDK.dll???Вот здесь.
Не срабатывает событие Player.TrackChanged.
Martin, добавь пожалуйста документацию .xml в NuGet пакет.
что вынесено в пакеты AimpSDK.Symbols и AimpSDK.Sources?Symbols содержат отладочные файлы, они нужны если вы захотети продебажить код обёртки.
Не срабатывает событие Player.TrackChanged. Подписался, переключаю песни, но мой код не срабатывает.Оно теперь не должно работать. Удалю его в следующем релизе. Теперь необходимо использовать Player.ServiceMessageDispatcher
public class AimpMessageHook : IAimpMessageHook
{
public AimpActionResult CoreMessage(AimpMessages.AimpCoreMessageType message, int param1, int param2)
{
return AimpActionResult.OK;
}
}
public class Program : AimpPlugin
{
private AimpMessageHook _hook;
public override void Initialize()
{
_hook= new AimpMessageHook();
Player.ServiceMessageDispatcher.Hook(_hook);
}
}
Есть онлайн документация, вот тут https://martin211.github.io/aimp_dotnet_docs/api/AIMP.SDK.html (https://martin211.github.io/aimp_dotnet_docs/api/AIMP.SDK.html) НО не уверен на сколько она свежая
When closing AIMPac.exe (AIMP Audio Converter) or AIMPate.exe (AIMP Advanced Tag Editor), even a completely empty plugin made with aimp_dotnet throws an exception (see attachment).
(https://www.aimp.ru/forum/index.php?topic=63088.0 for reproduction.)
var action = Player.ActionManager.CreateAction();
После закрытия плеера с отладчиком такая ошибка:menuItem.Shortcut = Player.ActionManager.MakeHotkey(ModifierKeys.Shift, 0x4C);
В пункте меню появилась надпись Shift+L, но по нажатию этих клавиш ничего не происходит, только по клику на сам пункт меню.
var fileInfo = Player.CurrentFileInfo;
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):
37 - 52 bytes: TDictionary<System.Integer,AIMP.Core.Services.Adapters.TAIMPMappedObjectAdapter.TLocalPropInfo> x 1
53 - 68 bytes: TAIMPActionAdapter x 1
309 - 340 bytes: Unknown x 1
Попробовал установить таким способом:Code: [Select]menuItem.Shortcut = Player.ActionManager.MakeHotkey(ModifierKeys.Shift, 0x4C);
В пункте меню появилась надпись Shift+L, но по нажатию этих клавиш ничего не происходит, только по клику на сам пункт меню.
Я понял, установить сочетание клавиш можно только через Action. Свойство Shortcut нужно только для отображения клавиш в пункте меню
Добрый день, можете подсказать, какое событие происходит, если плейлист заканчивается и плеер переходит в режим ожидания? Судя по всему, это не AimpCoreMessageType.AIMP_MSG_CMD_STOP, а что-то другое, но никак не пойму, что именно. :-\
Что именно вы хотите отследить? Прекращение проигрывания?Да, прекращение проигрывания, но не когда пользователь сам его останавливает, а оно останавливается автоматически в связи с окончанием плейлиста.
Да, прекращение проигрывания, но не когда пользователь сам его останавливает, а оно останавливается автоматически в связи с окончанием плейлиста.
Можно ли как-то определить, включён ли режим повтора? Мне удалось только найти событие AIMP_MSG_PROPERTY_REPEAT, возникающее при нажатии на кнопку повтора, причём даже так невозможно определить, включили повтор или выключили. Было бы удобно иметь свойство, например, IsRepeat, по аналогии с IsMute.
Вызов _aimp.PlaybackQueueManager.GetNextTrack() также возвращает пустой объект IAimpPlaylistItem.
Каким образом можно узнать, следующий файл в очереди? Или это не реализовано?
Каким образом можно узнать, следующий файл в очереди? Или это не реализовано?
Я, по-видимому, совсем тугой. Захотелось мене написать плагин, собрал пустой, AIMP его не видит, попробовал установить демо плагин, и его не видит, обновил AIMP, проверил, вроде, всё, что нужно, установлено, не видит и всё.
Скорее всего не установлен c++ redistributable (https://support.microsoft.com/ru-ru/help/2977003/the-latest-supported-visual-c-downloads)Спасибо, всё, что можно, переустановил, но ошибка была не в этом. Оказывается плагины написанные посредством этого SDK, по крайней мере у меня, не видны, если их просто закинуть в папку, но видны, если их запаковать и установить через AIMP, при этом другие плагины спокойно устанавливаются в любом виде.
Спасибо, всё, что можно, переустановил, но ошибка была не в этом. Оказывается плагины написанные посредством этого SDK, по крайней мере у меня, не видны, если их просто закинуть в папку, но видны, если их запаковать и установить через AIMP, при этом другие плагины спокойно устанавливаются в любом виде.
Я использую Properties.Settings.Default для хранения нужных значений.
Я бы порекомендовал использовать IAimpServiceConfig (Player.ServiceConfig) для хранения настроек плагина. Вы можете использовать Player.Core.GetPath() чтобы получить необходимый путь до плеера.Спасибо, попробую. А можете ещё подсказать, как сделать, чтобы плагин работал только в самом плеере, но не в редакторе тегов и аудиоконвертере? Сейчас при их запуске запускаются новые экземпляры плагина, из-за чего лезут ошибки. Уже долго думаю, как это решить, но так и нет никаких идей.
Спасибо, попробую. А можете ещё подсказать, как сделать, чтобы плагин работал только в самом плеере, но не в редакторе тегов и аудиоконвертере? Сейчас при их запуске запускаются новые экземпляры плагина, из-за чего лезут ошибки. Уже долго думаю, как это решить, но так и нет никаких идей.
И ещё у моего друга наблюдается странное поведение - после закрытия плеера у него стали пропадать горячие клавиши для действий в плагине (только локальные; глобальные и альтернативные глобальные остаются на месте), хотя у меня такого нет. Пытались дебажить на его компьютере, но ничего не обнаружили. Не знаете, с чем это может быть связано? У меня стоит портативная версия аимпа, а у него обычная, больше вроде никаких различий нет.
А можете ещё подсказать, как сделать, чтобы плагин работал только в самом плеере, но не в редакторе тегов и аудиоконвертере? Сейчас при их запуске запускаются новые экземпляры плагина, из-за чего лезут ошибки. Уже долго думаю, как это решить, но так и нет никаких идей.
Идеологически так: на инициализации плагина вы спрашиваете у IAIMPCore нужные вам интерфейсы, если их нет - возвращаете ошибку.Вроде помогло избавиться от ошибок в самих приложениях (например, не открывались настройки из-за этого), но после закрытия окна редактора тегов или аудиоконвертера ошибка через несколько секунд всё равно появляется:
Хоткеи реализуются через наш механизм? Локальная клавиша ни с чем не конфликтует?Реализуются через ActionManager, конфликтов никаких нет, специально такие сочетания клавиш подбирали, которые не используются нигде. Других сторонних плагинов у него нет.
Edit: Заметил, что если в настройках плеера выключить плагин, перезапустить плеер, потом снова включить плагин, то у меня тоже пропадают горячие клавиши. Но просто при перезапуске плеера такого нет.
IAimpFileTagEditor tagEditor = aimp.ServiceFileTagEditor.EditFile(selectedItem.FileName).Result;
tagEditor.SetToAll(selectedItem.FileInfo);
tagEditor.Save();
При этом изменения отображаются в аимпе (в окне плейлиста и в редакторе тегов по F4), но сам файл в проводнике становится заблокированным (никакие теги не отображаются и недоступны для редактирования) до закрытия аимпа. При этом неважно, редактировался проигрываемый файл или какой-то другой: даже если воспроизведение полностью остановлено, происходит то же самое. При этом, если открыть редактор тегов и нажать кнопку Сохранить, появится сообщение, что файл занят другим процессом.
Code: [Select]IAimpFileTagEditor tagEditor = aimp.ServiceFileTagEditor.EditFile(selectedItem.FileName).Result;
tagEditor.SetToAll(selectedItem.FileInfo);
tagEditor.Save();
Всем привет. Хочу написать плагин. Делаю всё по инструкции в первом посте, нет ничего. Даже если я в пустую папку засуну aimp_dotnet переименованный в название папки, Аимп не видит даже прокси папку.
Добрый день.
Скачайте последнюю версию сдк (https://github.com/martin211/aimp_dotnet/releases/download/4.70.2227.2/aimp.sdk.zip) там есть папка с демо-плагинами. Попробуйте какой-нибудь из них скопировать в папку плагинов и посмотреть появится ли он в списке. На портативной версии они тоже будут работать без проблем. Если не помогло, то скорее всего в системе не установлен c++ redistributable. Попробуйте скачать свежий и устновить отсюда (https://support.microsoft.com/ru-ru/topic/%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5-%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8-visual-c-%D0%B4%D0%BB%D1%8F-%D1%81%D0%BA%D0%B0%D1%87%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-2647da03-1eea-4433-9aff-95f26a218cc0)
C++ redistributable установлен, не помогает.
Как правильно сохранять файл после редактирования тегов? Использую следующий код:Code: [Select]IAimpFileTagEditor tagEditor = aimp.ServiceFileTagEditor.EditFile(selectedItem.FileName).Result;
При этом изменения отображаются в аимпе (в окне плейлиста и в редакторе тегов по F4), но сам файл в проводнике становится заблокированным (никакие теги не отображаются и недоступны для редактирования) до закрытия аимпа. При этом неважно, редактировался проигрываемый файл или какой-то другой: даже если воспроизведение полностью остановлено, происходит то же самое. При этом, если открыть редактор тегов и нажать кнопку Сохранить, появится сообщение, что файл занят другим процессом.
tagEditor.SetToAll(selectedItem.FileInfo);
tagEditor.Save();
ModifierKeys.Shift | ModifierKeys.Control,//Bug приводит к комбинации Alt+Shift+S