Допилить Puppet Master

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
Redrik Shuhart
Друг Кота
Сообщения: 3641
Зарегистрирован: Пт апр 03, 2009 22:12:58
Откуда: Из Украины, Кировоградская облась,

Допилить Puppet Master

Сообщение Redrik Shuhart »

Есть такая программа для управления компом с мобильника через блютус. Puppet Master.
Дык, загорелся идеей допилить в скрипт винампа возможность включать\выключать шафл. Как сделать?
Вроде визуал бэйсик, вроде-бы понятно что надо дописать еще 1 else с функцией, но куда обращаться всм команды и память я не понимаю.
Спойлер

Код: Выделить всё

//***************************************************************************
// WinAMP
//***************************************************************************

winampPath = getEnvironmentString("ProgramFiles") # "\WinAMP\WinAMP.exe";

etIgnore		= 0;
etActivate		= 1;
etBegin			= 2;
etEnd			= 3;
etKeyPress		= 4;
etKeyRelease	= 5;
etIntegerInput	= 6;
etBack			= 7;
etTimer			= 8;
etNext			= 9;
etTextInput		= 10;

stNormal		= 0;
stHelp			= 1;
stVolume		= 2;
stFastForward	= 3;
stRewind		= 4;
stExtraMenu		= 5;
stBrowseAll		= 6;
stBrowseArtists = 7;
stBrowseArtistSongs	= 8;
stVolumeNoTimeout	= 9;
stSearch			= 10;
stSearchError		= 11;
stSearchList		= 12;

emSearch			= 0;
emBrowseAll			= 1;
emBrowseAllSorted	= 2;
emBrowseArtists		= 3;

showDialog		= false;

windowClassName	= "Winamp v1.x";

window			= Windows.findWindow(windowClassName);

timeout			= 50;
movementStep	= 1000;

if(ExecuteData.type == etActivate)
{
	showDialog = true;
	RemoteController.setStore(new Array(3));
	RemoteController.store[0] = stNormal;
}
else if(ExecuteData.type == etBegin)
{
	RemoteController.startTimer(500);
}
else if(ExecuteData.type == etEnd)
{
	RemoteController.stopTimer();
}
else if(ExecuteData.type == etTimer)
{
	showDialog = true;
}

if(!window)
{
	if(ExecuteData.type == etBack) return;
	if(ExecuteData.type == etNext)
	{
		RemoteController.showProgress("Launching...");
		if(!Windows.open(winampPath))
		{
			RemoteController.showDialog("WinAMP not installed");
			RemoteController.stopTimer();
			return;
		}
	
		for(i = 0; i < 20; i += 1)
		{
			window = Windows.findWindow(windowClassName);
			if(window) break;
			Windows.sleep(400);
		}
	
		showDialog = true;
	}
}
else if(RemoteController.store[0] == stNormal)
{
	if(ExecuteData.type == etBack) return;
	if(ExecuteData.type == etNext)
	{
		// Play/Pause
		showDialog = true;
		state = window.sendMessageTimeout(0x400, 0, 104, timeout, 0);
		
		if(state == 0)	// Stopped
		{
			// Play
			window.postMessage(0x111, 40045, 0);			
		}
		else // Playing or paused
		{
			// Pause - this toggles it if paused already
			window.postMessage(0x111, 40046, 0);
		}
	}
	else if(ExecuteData.type == etKeyPress)
	{
		if(ExecuteData.keyID == "<")
		{
			// Rewind
			RemoteController.store[0] = stRewind;
			RemoteController.store[1] = movementStep;
			RemoteController.startTimer(100);
		}
		else if(ExecuteData.keyID == ">")
		{
			// Fast Forward
			RemoteController.store[0] = stFastForward;
			RemoteController.store[1] = movementStep;
			RemoteController.startTimer(100);
		}
		else if(ExecuteData.keyID == "c")
		{
			// Stop
			window.postMessage(0x111, 40047, 0);
		}
		else if(ExecuteData.keyID == "^")
		{
			// Previous
			window.postMessage(0x111, 40044, 0);
		}
		else if(ExecuteData.keyID == "v")
		{
			// Next
			window.postMessage(0x111, 40048, 0);
		}
		else if(ExecuteData.keyID == "u" || 
				ExecuteData.keyID == "d" ||
				ExecuteData.keyID == "1") 
		{
			volume = window.sendMessageTimeout(0x400, -666, 122, timeout, -1);
			if(volume != -1)
			{
				RemoteController.showPercentInput("Volume", volume / 2.55);
				RemoteController.store[0] = stVolume;
				RemoteController.startTimer(3000);
			}			
		}
		else if(ExecuteData.keyID == "*")
		{
			// Help!
			RemoteController.store[0] = stHelp;
			showDialog = true;
		}
		else if(ExecuteData.keyID == "f")
		{
			// Menu!
			RemoteController.store[0] = stExtraMenu;
			RemoteController.stopTimer();
			showDialog = true;
		}
		else if(ExecuteData.keyID == "4")
		{
			hWinampAl = Windows.findWindow("Winamp AL");
			if(hWinampAl) 
			{
				window.postMessage(0x111, 40047, 0);
				hWinampAl.postMessage(0x400, 114, 0);
			}
		}		
		else if(ExecuteData.keyID == "6")
		{
			hWinampAl = Windows.findWindow("Winamp AL");
			if(hWinampAl) 
			{
				window.postMessage(0x111, 40047, 0);
				hWinampAl.postMessage(0x400, 115, 0);
			}
		}		
	}
	else if(ExecuteData.type == etKeyRelease)
	{
		if(ExecuteData.keyID == "<")
		{
			// Nothing
		}
		else if(ExecuteData.keyID == ">")
		{
			// Nothing
			
		}
	}
}
else if(RemoteController.store[0] == stHelp)
{
	if(ExecuteData.type == etTimer) return;
	
	if(ExecuteData.type == etBack || ExecuteData.type == etNext)
	{
		showDialog = true;
		RemoteController.store[0] = stNormal;
	}
}
else if(RemoteController.store[0] == stVolume)
{
	if(ExecuteData.type == etTimer || ExecuteData.type == etBack || ExecuteData.type == etNext)
	{
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		RemoteController.startTimer(3000);
		window.postMessage(0x400, ExecuteData.input * 2.55, 122);		
	}
}
else if(RemoteController.store[0] == stVolumeNoTimeout)
{
	if(ExecuteData.type == etBack || ExecuteData.type == etNext)
	{
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		window.postMessage(0x400, ExecuteData.input * 2.55, 122);		
	}
}
else if(RemoteController.store[0] == stFastForward)
{
	if(ExecuteData.type == etTimer)
	{
		time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
		if(time != -1)
		{
			window.postMessage(0x400, time+RemoteController.store[1], 106);
			RemoteController.store[1] += 100;
		}
	}
	else if(ExecuteData.type == etKeyRelease)
	{
		RemoteController.startTimer(500);
		RemoteController.store[0] = stNormal;
	}
}
else if(RemoteController.store[0] == stRewind)
{
	if(ExecuteData.type == etTimer)
	{
		time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
		if(time != -1)
		{
			time = time - RemoteController.store[1];
			if(time < 0) time = 0;
			window.postMessage(0x400, time, 106);
			
			RemoteController.store[1] += 100;
		}
	}
	else if(ExecuteData.type == etKeyRelease)
	{
		RemoteController.startTimer(500);
		RemoteController.store[0] = stNormal;
	}
}
else if(RemoteController.store[0] == stExtraMenu)
{
	if(ExecuteData.type == etBack || ExecuteData.type == etNext)
	{
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		// 0 = Browse all
		// 1 = Browse all sorted
		// 2 = Browse by artist
		if(ExecuteData.input == emBrowseAll)
		{
			// Request writing the playlist.
			if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
			{
				// Shit.. problems!
				showDialog = true;
				RemoteController.store[0] = stNormal;
			}

			m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
			m3uFile = new Reader(m3uName);
			
			songArray	= new Array(0);
			songName	= "";
			
			while(m3uFile.isReadable())
			{
				line = m3uFile.readLine();
				if(!line) continue;
				if(line ~ "^#")
				{
					if(line ~ "^#EXTINF:\d+,(?:.*? - )?(.*?)$") songName = regex_captures[1];
				}
				else
				{
					if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
					songArray.append(songName);
					songName = "";
				}
			}
			
			RemoteController.showMenu("Songs", songArray);
			RemoteController.store[0] = stBrowseAll;
		}
		else if(ExecuteData.input == emBrowseAllSorted)
		{
			// Request writing the playlist.
			if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
			{
				// Shit.. problems!
				showDialog = true;
				RemoteController.store[0] = stNormal;
			}

			m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
			m3uFile = new Reader(m3uName);
			
			songArray	= new Array(0);
			songName	= "";
			
			while(m3uFile.isReadable())
			{
				line = m3uFile.readLine();
				if(!line) continue;
				if(line ~ "^#")
				{
					if(line ~ "^#EXTINF:\d+,(?:.*? - )?(.*?)$") songName = regex_captures[1];
				}
				else
				{
					if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
					songArray.append(songName);
					songName = "";
				}
			}
			
			RemoteController.showSortedMenu("Songs", songArray);
			RemoteController.store[0] = stBrowseAll;
		}
		else if(ExecuteData.input == emBrowseArtists)
		{
			if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
			{
				// Shit.. problems!
				showDialog = true;
				RemoteController.store[0] = stNormal;
			}

			m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
			m3uFile = new Reader(m3uName);
			
			artistDictionary = new Dictionary;
			artistName	= "";
			songName	= "";
			index		= 0;
			
			while(m3uFile.isReadable())
			{
				line = m3uFile.readLine();
				if(!line) continue;
				if(line ~ "^#")
				{
					if(line ~ "^#EXTINF:\d+,(?:(.*?) - )?(.*?)$")
					{
						artistName	= regex_captures[1];
						songName	= regex_captures[2];
					}
				}
				else
				{
					if(!artistName) artistName = "<Unknown artist>";
					if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
					if(!artistDictionary.hasKey(artistName)) artistDictionary.insert(artistName, new Array(0));
					
					data = new Array(2);
					data[0] = songName;
					data[1] = index;
					
					artistDictionary[artistName].append(data);
					artistName = "";
					songName = "";
					
					index += 1;
				}
			}
			
			// Now build artist array
			artistArray = new Array(0);
			artist = artistDictionary.enumerate;
			while(artist) artistArray.append(artist.nextKey);
			
			RemoteController.showMenu("Artists", artistArray);
			RemoteController.store[0] = stBrowseArtists;
			RemoteController.store[1] = artistDictionary;
		}
		else if(ExecuteData.input == emSearch)
		{
			RemoteController.store[0] = stSearch;
			showDialog = true;
		}
	}
}
else if(RemoteController.store[0] == stBrowseAll)
{
	if(ExecuteData.type == etBack)
	{
		showDialog = true;
		RemoteController.store[0] = stExtraMenu;
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		// Stop
		window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
		// Set play list pos
		window.sendMessageTimeout(0x400, ExecuteData.input, 121, timeout, -1);
		// Start play
		window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);

		// Return to info display
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
}
else if(RemoteController.store[0] == stBrowseArtists)
{
	if(ExecuteData.type == etBack)
	{
		showDialog = true;
		RemoteController.store[0] = stExtraMenu;
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		artist = RemoteController.store[1].enumerate;
		for(i = 0; i < ExecuteData.input; i += 1) artist.nextKey;
		
		artistName = artist.nextKey;
		
		if(artistName == "")
		{
			showDialog = true;
			RemoteController.store[0] = stExtraMenu;
		}
		else
		{
			songList = new Array(0);
			artistData = RemoteController.store[1][artistName];
			
			for(i = 0; i < artistData.size; i += 1) songList.append(artistData[i][0]);
		
			RemoteController.showMenu(artistName, songList);
			RemoteController.store[0] = stBrowseArtistSongs;
			RemoteController.store[2] = RemoteController.store[1][artistName];
		}
	}
}
else if(RemoteController.store[0] == stBrowseArtistSongs)
{
	if(ExecuteData.type == etBack)
	{
		// Now build artist array
		artistArray = new Array(0);
		artist = RemoteController.store[1].enumerate;
		while(artist)
		{
			artistArray.append(artist.nextKey);
		}
		
		RemoteController.showMenu("Artists", artistArray);
		RemoteController.store[0] = stBrowseArtists;
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		songIndex = RemoteController.store[2][ExecuteData.input][1];
	
		// Stop
		window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
		// Set play list pos
		window.sendMessageTimeout(0x400, songIndex, 121, timeout, -1);
		// Start play
		window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);

		// Return to info display
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
}
else if(RemoteController.store[0] == stSearch)
{
	if(ExecuteData.type == etBack)
	{
		showDialog = true;
		RemoteController.store[0] = stExtraMenu;		
	}
	else if(ExecuteData.type == etTextInput)
	{
		StringInput = ExecuteData.input;
		if(String.length(StringInput) < 2)
		{
			RemoteController.showDialog("Search must be 2 characters or greater");
			RemoteController.store[0] = stSearchError;			
		}
		else
		{
			if(window.sendMessageTimeout(0x400, 0, 120, timeout, -1) == -1)
			{
				// Shit.. problems!
				showDialog = true;
				RemoteController.store[0] = stNormal;
			}

			m3uName = window.moduleFileName ^ "^(.*)\.exe$/$1.m3u/i";
			m3uFile = new Reader(m3uName);
			
			songArray	= new Array(0);
			match		= false;
			songName	= "";
			index		= 0;
			
			SearchString = (StringInput ^ "[^A-Za-z0-9 ]+//g") # "/i";
			
			while(m3uFile.isReadable())
			{
				line = m3uFile.readLine();
				if(!line) continue;
				if(line ~ "^#")
				{
					if(line ~ "^#EXTINF:\d+,(?:(.*?) - )?(.*?)$") songName	= regex_captures[2];
					if(line ~ SearchString) match = true;
				}
				else
				{
					if(!songName) songName = line ^ "^(?:.*\\)(.*)$/$1";
					if(line ~ SearchString) match = true;

					if(match)
					{
						data = new Array(2);
						data[0] = songName;
						data[1] = index;
						songArray.append(data);
					}
					
					songName = "";
					match	 = false;
					
					index += 1;
				}
			}
			
			if(songArray.size == 0)
			{
				RemoteController.showDialog("No songs found");
				RemoteController.store[0] = stSearchError;			
			}
			else
			{			
				// Now build artist array
				menuArray = new Array(0);
				for(i = 0; i < songArray.size; i += 1) menuArray.append( songArray[i][0] );
				
				RemoteController.showSortedMenu("Search: " # StringInput, menuArray);
				RemoteController.store[0] = stSearchList;
				RemoteController.store[1] = songArray;
			}			
		}
	}
}
else if(RemoteController.store[0] == stSearchError)
{
	if(ExecuteData.type == etBack || ExecuteData.type == etNext)
	{
		showDialog = true;
		RemoteController.store[0] = stSearch;
	}
}
else if(RemoteController.store == stSearchList)
{
	if(ExecuteData.type == etBack)
	{
		showDialog = true;
		RemoteController.store[0] = stSearch;
	}
	else if(ExecuteData.type == etIntegerInput)
	{
		songIndex = RemoteController.store[1][ExecuteData.input][1];
	
		// Stop
		window.sendMessageTimeout(0x111, 40047, 0, timeout, -1);
		// Set play list pos
		window.sendMessageTimeout(0x400, songIndex, 121, timeout, -1);
		// Start play
		window.sendMessageTimeout(0x111, 40045, 0, timeout, -1);

		// Return to info display
		showDialog = true;
		RemoteController.store[0] = stNormal;
		RemoteController.startTimer(500);
	}
}

if(showDialog)
{	
	if(!window)
	{
		RemoteController.showDialog("Press OK to launch WinAMP");
	}
	else if(RemoteController.store[0] == stNormal || 
			RemoteController.store[0] == stFastForward ||
			RemoteController.store[0] == stRewind)
	{
		if(window.name ~ "\d+\.\s+(.+?)(?: - (.+?))?\s*- Winamp(?:\s*?\[(.+)\])?")
		{
			if(regex_captures[2]) text = regex_captures[2] # crlf # regex_captures[1];
			else text = regex_captures[1];
		}
		else
		{
			text = window.name;
		}
		
		time = window.sendMessageTimeout(0x400, 0, 105, timeout, -1);
		if(time != -1)
		{
			time = time / 1000;
			
			text #= crlf # asInteger(time/60) # ":" # asBaseNString(time%60, 10, 2);
			
			time = window.sendMessageTimeout(0x400, 1, 105, timeout, -1);
			if(time != -1)
			{
				text #= "/" # asInteger(time/60) # ":" # asBaseNString(time%60, 10, 2);
			}
		}
		
		text #= crlf # "(* for help)";
		RemoteController.showDialog(text);
	}
	else if(RemoteController.store[0] == stHelp)
	{
		Text = "OK: Play/Pause" # crlf #
				"Menu: Extras" # crlf #
				"c: Stop" # crlf #
				"+,-: Volume Up/Down" # crlf #
				"Left,Right: Rewind/Fast Forward" # crlf #
				"Up,Down: Previous/Next Track" # crlf #
				"1: Change Volume";
		
		if(Windows.findWindow("Winamp AL")) Text #= crlf # "4,6: Previous/Next Album";
	
		RemoteController.showText("WinAMP", Text);
	}
	else if(RemoteController.store[0] == stVolume)
	{
		// Nothing.. Already done.
	}
	else if(RemoteController.store[0] == stVolumeNoTimeout)
	{
		// Nothing.. Already done.
	}
	else if(RemoteController.store[0] == stExtraMenu)
	{
		MenuItems = new Array(0);
		MenuItems.append("Search...");
		MenuItems.append("Browse all");
		MenuItems.append("Browse all sorted");
		MenuItems.append("Browse by artist");
		RemoteController.showMenu("WinAMP", MenuItems);
	}
	else if(RemoteController.store[0] == stBrowseAll)
	{
		// Nothing.. already done
	}
	else if(RemoteController.store[0] == stBrowseArtists)
	{
		// Nothing.. already done
	}
	else if(RemoteController.store[0] == stBrowseArtistSongs)
	{
		// Nothing.. already done
	}
	else if(RemoteController.store[0] == stSearch)
	{
		RemoteController.showTextInput("Search...");
	}
	else if(RemoteController.store[0] == stSearchError)
	{
		// Nothing.. already done
	}
	else
	{
		RemoteController.showDialog("Internal error - unknown state");
	}
}

//***************************************************************************
Мотание тороидов- вышивание по мужски.
Реклама
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: Допилить Puppet Master

Сообщение zebrox »

Пдозреваю, что if добавить сюда

Код: Выделить всё

else if(ExecuteData.type == etKeyPress)
{

}
еще нужно знать какое сообщение слать окну проигрывателя и какому контролу на нем
Реклама
Аватара пользователя
Redrik Shuhart
Друг Кота
Сообщения: 3641
Зарегистрирован: Пт апр 03, 2009 22:12:58
Откуда: Из Украины, Кировоградская облась,

Re: Допилить Puppet Master

Сообщение Redrik Shuhart »

Я про это и говорю, Что else if конструкцию добавить, но я не знаю что писать в этой конструкции, тк не знаю ни флагов, ни команд аимпа.
Прошу людей которые занимались таким- киньте флаги и адреса команд... или только команды шафл. Ну или на крайняк киньте библиотеку аимпа.
Мотание тороидов- вышивание по мужски.
Аватара пользователя
zebrox
Встал на лапы
Сообщения: 117
Зарегистрирован: Вс апр 12, 2009 22:40:37

Re: Допилить Puppet Master

Сообщение zebrox »

есть такая прога, Spy++, она все эти дела очень хорошо узнает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Redrik Shuhart
Друг Кота
Сообщения: 3641
Зарегистрирован: Пт апр 03, 2009 22:12:58
Откуда: Из Украины, Кировоградская облась,

Re: Допилить Puppet Master

Сообщение Redrik Shuhart »

По подробнее пожалуйста...
Мотание тороидов- вышивание по мужски.
Реклама
Ответить

Вернуться в «Разные вопросы по МК»