Тряхнул стариной...
Плагин для Аимпа
Сообщений 1 страница 30 из 35
Поделиться22016-03-09 11:29:31
Режим стробоскопа мне показался по живее/интереснее.
Поделиться32016-03-09 11:31:26
Мне тоже стробоскоп нравится.
Хотя в обычном режиме ЦМУ можно затухание ускорить, тоже пошустрее станет.
А вообще поле для экспериментов не паханое.
Поделиться42016-03-09 12:04:02
Так всегда: море идей, доработки...только время нужно.)
зы: radan, глянь плиз ЛС.
Поделиться52016-03-09 20:57:14
Посмотрел SDK плагинов Аимпа. Вроде не сложно. Чем-то на модели протеуса похоже.
Аимп успешно "скушал" тестовый плагин.

Поделиться62016-03-09 21:02:13
Пётр как всегда на высоте! Честно сказать платформа NET для написания плагина Аимпа - что из гаубицы по воробьям...
На делфи писать не хочется, вот Пурик для этих вещей самое то.
Поделиться72016-03-10 20:19:52
Тестовый плагин, может кому будет интересно. http://pure-basic.narod.ru/forum_files/ … alPlug.zip
Нужно папку VisualPlug скопировать в папку плагинов AIMP.
Поделиться82016-03-10 21:43:25
Пётр, я восхищён!
Самое интересное и полезное в том, что ваш плагин визуализации работает параллельно с другими плагинами!
Т.е. можно управлять железными девайсами на фоне каких либо сторонних визуализаций.
Взял на заметку, придётся опять Пурик расчехлять!
Поделиться92016-03-10 22:01:44
Плагин использует расширение IAIMPExtensionCustomVisualization сервиса IAIMPServiceVisualizations. Его описание.
IAIMPExtensionCustomVisualization
Представляет собой расширение для сервиса IAIMPServiceVisualizations. Этот тип визуализации позволяет выводить данные за пределом дисплея визуализации плеера, а так же не зависит от наличия дисплея визуализации в скине и его активности (выбрана визуализация пользователем или нет).
А если проще, то AIMP имеет несколько расширений для визуализации и эта по видимому предназначена для подобных цветомузык, т. к. работает в фоне и не требует рисования в окне плеера.
Ее класс содержит всего два метода.
Interface IAIMPExtensionCustomVisualization Extends IUnknown ; Common Information GetFlags() ; Basic functionality Draw(*Data.TAIMPVisualData) EndInterface
Нам интересен метод Draw, т. к. он периодически вызывается плеером и передает нам заполненную структуру с двумя массивами, в одном из которых "сырые" данные, а во втором уже обработанные быстрым преобразованием Фурье.
Поделиться102016-03-10 22:17:23
Про Draw понятно, непонятно как он сразу стартует параллельно с активной в текущий момент визуализацией.
Практически в окне визуализации есть возможность выбирать только одну визуализацию.
Поделиться112016-03-10 22:36:52
Тип визуализации IAIMPExtensionCustomVisualization не предназначен для рисования в окне плеера и работает независимо от других визуализаций.
Та визуализация что сейчас активна, скорее всего имеет тип IAIMPExtensionEmbeddedVisualization.
Представляет собой расширение для сервиса IAIMPServiceVisualizations - визуализацию, отображаемую на дисплее визуализации в скине плеера и/или полноэкранном режиме.
Поделиться122016-03-10 23:46:35
Посмотрел тему на форуме Аимпа. В .NET действительно используется расширение IAimpExtensionEmbeddedVisualization. Нужно попросить чтобы Martin добавил еще и IAIMPExtensionCustomVisualization. Тогда появится возможность получать спектр без выбора активной визуализации и без необходимости рисования в окне Аимпа.
Поделиться132016-03-11 07:31:03
Есть IAIMPExtensionCustomVisualization.
Получается что он работает постоянно в каждом подгруженном плагине, в отличии от IAimpExtensionEmbeddedVisualization, который работает только при выборе конкретной визуализации.
Поделиться142016-03-11 18:29:35
Еще один пример плагина, типа IAimpExtensionEmbeddedVisualization, рисующий в окне аимпа. http://pure-basic.narod.ru/forum_files/ … zation.zip
Нужно выбрать визуализацию "Тест".
И еще, не кликайте в верхней левой области визуализации. Плагину это не нравится. 
Поделиться152016-03-11 20:32:48
Ну вот, так всегда...
Один человек разрабатывал - разрабатывал прослойку между Аимпом и Нетом, другой писал-писал этот плагин...
Пришли Пётр с Пуриком и крупным размашистым почерком поставили своё резюме. 
Поделиться162016-03-11 21:19:14
разрабатывал прослойку между Аимпом и Нетом
У него ведь не только визуализация но и много чего другого...
Поделиться172016-03-11 23:57:06
Да, он на данный момент почти весь SDK портировал.
Я тут подумал что неплохо бы на Пурике сделать универсальную библиотеку, которая получает спектр и помещает его в открытый для внешних программ массив.
Тогда появится возможность разрабатывать свои визуальные приложения на основе этого плагина на любом ЯП, включая НЕТ.
Поделиться182016-03-12 00:10:02
Теоретически это возможно. Нужно лишь придумать как информировать приложение о наличии новых данных чтобы программа вызвала функцию из DLL и забрала данные. В .NET поддерживаются CallBack функции?
Отредактировано Пётр (2016-03-12 00:12:27)
Поделиться192016-03-12 08:20:47
Один из вариантов информировать приложение о наличии новых данных:
Когда спектр обновляется(стремится к 25 разам в секунду со слов разработчика Аимпа), мы изменяем значение счётчика открытой для внешнего мира переменной.
Стороннее приложение в потоке обращается к этой переменной со скоростью большей, чем скорость изменения спектра.
Если значение переменной изменилось - забираем данные, если нет - ждём дальше.
В .NET поддерживаются CallBack функции?
https://msdn.microsoft.com/en-us/library/5zwkzwf4(v=vs.110).aspx
Поделиться202016-03-12 12:13:46
Если с DLL работает только один процесс/поток, то проблем вообще нет, а если множество... Если делать универсальную библиотеку, то так чтобы с DLL могли работать много программ, и каждую их них нужно проинформировать о новых данных и предоставить их по запросу.
Поделиться212016-03-12 21:33:19
Наверное для начала можно с одним процессом попробовать.
Поделиться222016-03-13 00:31:14
Итак, плагин. http://pure-basic.narod.ru/forum_files/ … lShare.zip
В плагине VisualShare.dll есть функции
AIMPPluginGetHeader(*Header.Integer) SetCallBack(*Proc, Flag.a) GetShare(*Data.TAIMPVisualData)
Функция AIMPPluginGetHeader для плеера и она нам не нужна (вызывать не нужно), а вот две другие позволяют получить доступ к данным визуализации.
Данные можно забрать двумя способами - через CallBack функцию или непосредственно запрашивая их.
В первом случае, нужно один раз вызвать функцию SetCallBack() и передать ей указатель на функцию такого формата.
CallBack(*Data.TAIMPVisualData)
и плагин будет ее регулярно вызывать по мере поступления данных. Если при вызове SetCallBack() во втором параметре передать 0 (#False), то CallBack функция будет вызываться с нулевым указателем, а данные потребуется забирать вызывая функцию GetShare(), а если передать 1 (#True), то CallBack функции будет передаваться указатель на структуру TAIMPVisualData.
Хочу обратить внимание что CallBack функция вызывается в отдельном потоке. Это нужно учитывать.
Структура TAIMPVisualData имеет вид.
PureBasic.
#AIMP_VISUAL_SPECTRUM_MAX = 256 #AIMP_VISUAL_WAVEFORM_MAX = 512 Structure TAIMPVisualDataSpectrum Arr.f[#AIMP_VISUAL_SPECTRUM_MAX] EndStructure Structure TAIMPVisualDataWaveform Arr.f[#AIMP_VISUAL_WAVEFORM_MAX]; EndStructure Structure TAIMPVisualData Peaks.f[2] Spectrum.TAIMPVisualDataSpectrum[3] WaveForm.TAIMPVisualDataWaveform[2] Reserved.i EndStructure
Дельфи.
AIMP_VISUAL_SPECTRUM_MAX = 256;
AIMP_VISUAL_WAVEFORM_MAX = 512;
type
TAIMPVisualDataSpectrum = array[0..AIMP_VISUAL_SPECTRUM_MAX - 1] of Single;
TAIMPVisualDataWaveform = array[0..AIMP_VISUAL_WAVEFORM_MAX - 1] of Single;
PAIMPVisualData = ^TAIMPVisualData;
TAIMPVisualData = packed record
Peaks: array[0..1] of Single;
Spectrum: array[0..2] of TAIMPVisualDataSpectrum;
Waveform: array[0..1] of TAIMPVisualDataWaveform;
Reserved: Integer;
end;C++
const int AIMP_VISUAL_SPECTRUM_MAX = 256;
const int AIMP_VISUAL_WAVEFORM_MAX = 512;
typedef float TAIMPVisualDataSpectrum[AIMP_VISUAL_SPECTRUM_MAX];
typedef float TAIMPVisualDataWaveform[AIMP_VISUAL_WAVEFORM_MAX];
#pragma pack(push, 1)
struct TAIMPVisualData
{
float Peaks[2];
TAIMPVisualDataSpectrum Spectrum[3];
TAIMPVisualDataWaveform WaveForm[2];
int Reserved;
};
#pragma pack(pop)Для доступа к данным, приложение должно работать DLL находящейся в папке с плагином. В папке с плагином есть два примера. Поддерживается одновременная работа с множеством процессов, так что можете запустить сколько хотите копий приложений (в пределах разумного конечно).
Поделиться232016-03-13 08:38:50
Спасибо, Пётр!
Как только немного освобожусь, сделаю примеры для C# и VBNET.
Поделиться242016-03-13 13:53:11
Добавил функцию IsData(), которая возвращает не 0 в случае наличия данных и переименовал функцию GetShare в GetData.
Также добавил пример считывания данных визуализации без CallBack, а только с использованием IsData и GetData.
Ссылка та же.
Отредактировано Пётр (2016-03-13 13:56:30)
Поделиться252016-03-14 13:15:44
Сделал пример на C#. Спасибо ещё раз, Пётр!
Нужно подключить пространство:
using System.Runtime.InteropServices;
Затем объявления:
[DllImport("VisualShare.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetData([MarshalAs(UnmanagedType.Struct)] ref TAIMPVisualData data);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TAIMPVisualData
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public Single[] Peaks;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3 * 256)]
public Single[] Spectrum;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2 * 512)]
public Single[] WaveForm;
public int Reserved;
};
TAIMPVisualData tavd = new TAIMPVisualData();Затем в таймере получение данных:
bool t = GetData(ref tavd);
if (t)
{
//Выводим уровень левого и правого каналов в прогресс бары
int LeftPeaks = Convert.ToInt32(tavd.Peaks[0] * 100);
if (LeftPeaks > 100) LeftPeaks = 100;
progressBar1.Value = LeftPeaks;
int RightPeaks = Convert.ToInt32(tavd.Peaks[1] * 100);
if (RightPeaks > 100) RightPeaks = 100;
progressBar2.Value = RightPeaks;
//рисуем спектр на имидже
Bitmap bit = new Bitmap(PicVis.Width, PicVis.Height);
Graphics graph = Graphics.FromImage(bit);
Pen YellowPen = new Pen(Color.Green, 1);
for (int X = 0; X <= PicVis.Width; X = X + 2)
{
Single YY = tavd.Spectrum[X / 2];
YY = YY * PicVis.Height / 10;
if (YY > PicVis.Height) YY = PicVis.Height;
int DDD = Convert.ToInt16(YY);
graph.DrawLine(YellowPen, X, PicVis.Height, X, PicVis.Height - DDD);
}
PicVis.Image = bit;
}На форме должны быть прогресс бары - progressBar1, progressBar2 и контейнер для рисования PicVis шириной не более 512.
Чуть позже выложу полный код.
Поделиться262016-03-14 13:24:05
[DllImport("VisualShare.dll", CallingConvention = CallingConvention.Cdecl)]
Удивительно что оно вообще работает, т. к. у всех функций библиотеки (в т. ч. CallBack) соглашения вызова stdcall, т. е. как у WinAPI функций.
Поделиться272016-03-14 13:57:56
CallingConvention = CallingConvention.Cdecl можно вообще выбросить.
Поделиться282016-03-16 15:31:03
Доработал плагин (версия 1.0.0.5) http://pure-basic.narod.ru/forum_files/ … .0.0.5.zip
Добавлена функция IsAimp() возвращающая не 0 если плеером используется плагин, а также добавлена поддержка запуска программ при инициализации плагина плеером. Список программ должен находится в файле ProgramList.txt рядом с плагином. Формат файла - стандартный для ini файлов. Кодировка UTF-8.
Подробнее про этот тип файлов можно прочитать в википедии https://ru.wikipedia.org/wiki/.ini
Пример файла (две программы).
[1] Program = Программа.exe Parameter = Параметры программы Directory = Папка программы [2] Program = Программа.exe Parameter = Параметры программы Directory = Папка программы
Секции могут иметь любое имя. Они нужны только для разделения пространства имен ключей.
Ключ Program должен содержать путь к программе. Абсолютный или относительный по отношению к папке с плагином.
Ключ Parameter содержит параметры программы. Является необязательным и может отсутствовать.
Ключ Directory содержит путь к рабочей папке программы. Является необязательным и может отсутствовать.
Отредактировано Пётр (2016-03-16 15:42:44)
Поделиться292016-07-07 16:34:07
Пётр, столкнулся с проблемой на 64 разрядной ОС.
IsData всегда возвращает 0, а в данных уровня и спектра тоже всегда нулевые значения.
Как то нужно перекомпилировать библиотеку для работы на 64 разряда ОС?
Поделиться302016-07-07 20:29:28
Какая версия винды? Тестировал на Win7 x64. Нормально работает.
Похожие темы
| USB - PWM | Не пора ли нам попробовать ARM? | 2017-01-30 |
