Interagir avec Winamp (VS 2005 express) [C# .NET 2.0] - C#/.NET managed - Programmation
Marsh Posté le 31-12-2006 à 14:39:50
bon, là je dois m'absenter, mais je réponds dés que je suis de retour
Marsh Posté le 31-12-2006 à 15:11:33
voilà déjà ce que j'ai et qui fonctionne :
Code :
|
si j'ai a peu prés compris ce que j'ai fait, je récupère le numéro de la chanson en cours d'écoute dans la playlist et grace à ce numéro, je récupère une sorte d'adresse mémoire ou je devrait trouver des infos sur le fichier en cours de lecture (dans le process de winamp). Mais aprés je coince.
j'ai bon déjà ? :-)
Marsh Posté le 07-01-2007 à 22:39:55
Désolé pour le retard, avec les fêtes ce topic m'est complètement sorti de la tête
Alors, reprenons :
Personnellement, j'importe SendMessage comme ceci :
Code :
|
Je reviendrais plus tard sur le unsafe.
Ensuite, venons en au vif du sujet : la ligne 16. C'est effectivement le message IPC_GETPLAYLISTFILE qui renverra le fichier en cours de lecture. Tu reçois effectivement en retour un pointeur vers la chaine de caractère contenant le nom du fichier. Or, en C#, pas de pointeurs, donc pas de possibilité de récupérer la valeur pointée. Bienvenue dans le calvaire de l'API en C de Winamp...
Néanmoins, le C# permet d'utiliser des pointeurs en faisant du code unsafe. Ce qui signifie que ce sera à toi de gérer la mémoire dans ton bloc unsafe. D'ou ma déclaration unsafe de SendMessage, car je vais utiliser des pointeurs en paramètre.
J'avoue que j'ai choisi la solution la plus "pratique" : l'API de Winamp utilise des pointeurs, donc j'utilise des pointeurs. Il y a surement moyen de rendre le code safe en utilisant des ref machin. Je m'y penche pour la prochaine version de mon plugin.
Une fois ta chaine récupérée, c'est tout bête : tu construis un objet String, managé celui ci, avec le buffer en paramètre.
Venons en au type du buffer dans lequel sera stocké la chaine. En C, tu récupères un char*, donc il faut trouver l'équivalent en C#, et surtout d'un type accepté par le constructeur de String. Une fois la doc parcourue, on découvre le type sbyte, qui convient tout à fait.
Ce qui nous donne :
Code :
|
ligne 3 : je récupère le résultat de SendMessage (donc le chemin du fichier joué) dans la variable fileName
ligne 4 : je construis un objet String (donc managé) à partir de cette variable.
Voila. Après tu fais ce que tu veux de ta String, elle est utilisable avec toutes les classes .NET
Bon courage avec le P/Invoke, le Marshalling, et l'API pourrie de Winamp en C tout aussi pourri
Marsh Posté le 08-01-2007 à 20:39:42
super! je vais tester ça de suite. Finalement ça me rassure, j'étais pas si loin du résultat mais un grand merci à toi car j'étais complètement bloqué sur ce truc :-(
C'est la seule interaction que je vais avoir avec Winamp. Une fois que j'ai le chemin du fichier, je récupère toutes les valeurs des Tags (ID3 pour le MP3 ou autre pour le OGG, APE etc...) via un librairie (DLL) que j'ai trouvé chez Novell. Elle est pas documenté mais finalement j'ai trouvé comment m'en servir facilement en C# (ctc moi en MP si ça intéresse quelqu'un).
encore merci!
Marsh Posté le 09-01-2007 à 05:57:41
oh la cest vraiment la fete dutiliser win32 en C#
on a limpression de faire du win32 en vb (voir pire encore)
Marsh Posté le 10-01-2007 à 19:38:06
bon, je dois pas être doué parce meme avec ce que tu m'as donné, il me retourne toujours une chaine vide :-(
ci joint un extrait de mon code
Code :
|
je lance donc mon winamp, et quand mon programme execute le getCurrentSongPath() j'ai ça dans mon log :
handle : 132100 |
je ne vois pas bien ou peut se trouver l'erreur...
je n'ai pas trouvé la valeur de WM_WA_IPC mais j'ai lu que WM_WA_IPC était la meme chose que WM_USER (0x400) donc j'ai utilisé WM_USER à la place. Le probleme vient peut etre de là ? une idée ?
Marsh Posté le 14-01-2007 à 19:00:44
j'ai lu a droite à gauche qu'il n'était pas possible de récupérer le chemin de la musique en cours de lecture dans winamp dans une application externe (autre qu'un plugin winamp) ce qui pourrait peut etre expliqué que mon code soit bon mais que je n'ai pas le retour escompté.
J'ai également vu des exemple pour lire dans la mémoire du processus de winamp pour contourner le probleme mais je n'y arrive pas. Pour lire dans la mémoire d'un process il faut récupéré son hande à partir du hande du thread mais cette fonction (OpenProcess) me retourne toujours zero.
Code :
|
sortie dans le log :
playlistPosition : 4 |
je suis donc dans une impasse... vraiment personne pour me donner un coup de main ?
Marsh Posté le 31-12-2006 à 14:18:43
Bonjour,
Je souhaite récupérer en C# (.NET 2.0) le chemin de la musique en cours de lecture dans Winamp. Les portages du WinampSDK pour C# sont tous en beta, peu avancés et surtout plus maintenu.
Je sais qu'il faut récupérer le handle de la fenetre de winamp, pour pouvoir lui transmettre des messages mais je ne m'en sort pas trop. J'ai reussi à récupéré le numéro de la chanson en cours de lecture dans la playlist (via le WinAmpSDK C#) mais bon, dés qu'il faut faire transiter des données plus complexe j'ai du mal.
si quelqu'un a des infos, je suis prenneur. merci!
ps : j'ai aussi trouvé ça : http://msmvps.com/blogs/ch21st/arc [...] /3279.aspx
c'est du VB mais je pense que la méthode doit etre bonne. Reste que je suis pas expert du PInvoke et de la programmation système donc...
Message édité par xtream le 12-01-2007 à 21:01:01