FmodEx : Jouer un flux shoutcast

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message par Marc56 »

El Papounet a écrit :Je pense qu'après cette modification le programme compilé en unicode fonctionne aussi.
Fantastique, ça marche! :P
El Papounet tu es mon sauveur: Solution et explication simple :!: :wink:
L'exemple fonctionne maintenant parfaitement en unicode, en 32 et 64 bits
Mon ACME Desk retrouve la voix et la voie :) je peux continuer avec la 5.50 (il faut que je pense à recharger le site)
Merci, merci, bravo à vous tous, je vais bien dormir ce soir :wink:

@Falsam: Je pense que tu peux modifier ton excellent package sur github: ligne 986 et 992 du .pbi et ligne 40 de l'exemple Fmod Ex - Play Shoutcast.pb (je n'ai pas regardé les autres)
https://github.com/pbcodex/FMODEX
(avec crédit pour la modif à El Papounet pour l'unicode) Ça va servir à tout le monde 8)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Bonjour Marc56.

J'ai testé les suggestions de El Papounet et contrairement à toi, ça ne fonctionne pas avec PureBasic 5.50 Beta.

Par hasard est ce que tu n'aurais forcé à compiler avec la version 5.42 (ou autres) dans les paramètres de compilation ?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message par Marc56 »

falsam a écrit :Bonjour Marc56.

J'ai testé les suggestions de El Papounet et contrairement à toi, ça ne fonctionne pas avec PureBasic 5.50 Beta.

Par hasard est ce que tu n'aurais forcé à compiler avec la version 5.42 (ou autres) dans les paramètres de compilation ?
Bonjour falsam,

Je viens de revérifier à l'instant je suis bien en 5.50 B1 dans les options du compilateur.

Code : Tout sélectionner

;Tutorial : Jouer un shoutcast
EnableExplicit

Debug #PB_Compiler_Version

IncludeFile "fmodex.pbi"

Enumeration
  #Mainform
  #Pause
  #Volume
EndEnumeration

Define.l Event, GEvent, TiEvent

Global WindowStyle.i=#PB_Window_SystemMenu|#PB_Window_ScreenCentered

Global fmodsystem.i, Channel.i, Sound.i, Volume.f = 0.5, PauseStatus.b
Global Url.s

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 300, 100, "Play Shoutcast", WindowStyle)
  TextGadget(#PB_Any, 10, 50, 30, 20, "Vol")
  TrackBarGadget(#Volume, 45, 45, 200, 24, 0, 10)
  SetGadgetState(#Volume, 5)
  
  ButtonGadget(#Pause, 117, 70, 50, 22, "Pause")
  
EndProcedure

Procedure Start()
  Open_MainForm()
  
  ;Déclarer l'objet FMOD System
  FMOD_System_Create(@fmodsystem)
  
  ;Initialiser le system (32 canaux) un seul suffirait pour cet exemple
  FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
  
  ;CreateStream permet de commencer la lecture avant le chargement complet de l'url
  ; Url ="http://server1.chilltrax.com:9000"
  Url = "http://audio.scdn.arkena.com/11008/franceinter-midfi128.mp3"
  
  FMOD_System_CreateStream(fmodsystem, Url, #FMOD_CREATESTREAM, 0, @sound)
  
  ;On joue le son sur le canal 1
  FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)
  
  ;Et on ajuste le volume (le son est compris entre 0.0 et 1.0)
  FMOD_Channel_SetVolume(Channel, 0.5)
  
  
EndProcedure

start()

Repeat
  Event   = WaitWindowEvent(100)    
  GEvent  = EventGadget()
    
  Select Event
            
    Case #PB_Event_Gadget
      Select GEvent
          
        Case #Volume
          Volume = GetGadgetState(#Volume)/10
          FMOD_Channel_SetVolume(Channel, Volume)
          
        Case #Pause
          ;FMOD_Channel_GetPaused permet de savoir si le son sur le canal est en pause ou pas
          FMOD_Channel_GetPaused(Channel, @PauseStatus) 
          
          If PauseStatus = #False
            FMOD_Channel_SetPaused(Channel, #True) ;Pause
          Else
            FMOD_Channel_SetPaused(Channel, #False) ;Reprise de la lecture
          EndIf
                              
      EndSelect
        
    Case #PB_Event_CloseWindow
      FMOD_Channel_Stop(Channel)
      FMOD_System_Release(fmodsystem)
      End
      
  EndSelect
ForEver
Confirmation par la ligne que j'ai ajouté:
Affichage du debug : 550

dans le .pbi, j'ai juste modifié (Name_or_data.l -> Name_or_data.p-ascii)

Code : Tout sélectionner

  ;- FMOD_System_CreateStream_
  ; Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.l, Mode.l, *exinfo, *Sound)
  Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.p-ascii, Mode.l, *exinfo, *Sound)
  Global FMOD_System_CreateStream.FMOD_System_CreateStream_Prototype
  FMOD_System_CreateStream = GetFunction(fmodLib, "FMOD_System_CreateStream")
Marche en 550 B1 x86 et x64

Ai-je un coup de bol ?
:)

Je vais essayer dans ma VM XP pour voir.
Edit: Confirmé pour XP, ça marche aussi bien (j'ai cru que ça ne fonctionnait pas, mais je n'avais pas remis le nouveau .pbi)

Quelqu'un d'autres peut tester ?
Dernière modification par Marc56 le lun. 13/juin/2016 15:20, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Je vais vérifier à nouveau ce que j'ai fait dans ce cas. Merci.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message par Marc56 »

Comme je n'ai besoin que de la fonction shoutcast, je n'ai modifié que la ligne 991 du .pbi
et ensuite, supprimé l'@ d'@Url dans l'exemple
FMOD_System_CreateStream(fmodsystem, Url, #FMOD_CREATESTREAM, 0, @sound)

Ça fonctionne aussi sur XP

Dans les options de mon projet, j'ai aussi vérifié que les deux versions (x86 et x64) utilisent bien le nouveau compilateur et ça marche aussi :)
J'ai aussi changé l'URL pour mettre france inter (marche sur l'autre...) :mrgreen: qui n'a pas le même type, mais les deux fonctionnent.
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: FmodEx : Jouer un flux shoutcast

Message par El Papounet »

Par acquis de conscience je viens de tester avec la version 5.50b1 et ça fonctionne aussi sans problème.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par Ar-S »

Merci pour vos retours. J'attendrai la 5.50 finale avant de tester.
Si vous aviez le courage et la gentillesse d'uploader le pbi compatible x64 x86 en 5.50 ce serait top.
Merci.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Bonsoir El Papounet.

Pourrais tu, si ça ne te dérange pas, reprendre ce code simplifié et le modifier pour que ça fonctionne avec PB 5.50 Beta.

Code : Tout sélectionner

#FMOD_INIT_NORMAL = $0
#FMOD_CREATESTREAM = $80

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex.dll")
CompilerElse
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex64.dll")
CompilerEndIf

If fmodLib
  
  ;// Declare prototype
  
  ;- FMOD_System_Create
  Prototype.l FMOD_System_Create_Prototype(*system)
  Global FMOD_System_Create.FMOD_System_Create_Prototype = GetFunction(fmodLib, "FMOD_System_Create")
  
  ;- FMOD_System_Init_
  Prototype.l FMOD_System_Init_Prototype (system.l, Maxchannels.l, flags.l, Extradriverdata.l);system.l, Maxchannels.l, flags.l, Extradriverdata.l
  Global FMOD_System_Init.FMOD_System_Init_Prototype = GetFunction(fmodLib, "FMOD_System_Init")
  
  ;- FMOD_System_CreateStream_
  Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.l, Mode.l, *exinfo, *Sound)
  Global FMOD_System_CreateStream.FMOD_System_CreateStream_Prototype = GetFunction(fmodLib, "FMOD_System_CreateStream")
  
  ;- FMOD_System_PlaySound_
  Prototype.l FMOD_System_PlaySound_Prototype (system.l, channelid.l, sound.l, paused.l, *channel)
  Global FMOD_System_PlaySound.FMOD_System_PlaySound_Prototype = GetFunction(fmodLib, "FMOD_System_PlaySound")
  
  
  ;// Test
  Global fmodsystem, url.S, Sound, Channel.i
  
  FMOD_System_Create(@fmodsystem)
  
  FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
  
  Url ="http://server1.chilltrax.com:9000"
  FMOD_System_CreateStream(fmodsystem, @Url, #FMOD_CREATESTREAM, 0, @sound)
  
  FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)
  
  Delay(10000)
EndIf
Code + Dll https://github.com/falsam/fmodex-min/archive/master.zip

PS : Le principe d'une nouvelle release, c'est qu'elle soit compatible avec les précédentes versions.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: FmodEx : Jouer un flux shoutcast

Message par El Papounet »

falsam a écrit :Bonsoir El Papounet.

Pourrais tu, si ça ne te dérange pas, reprendre ce code simplifié et le modifier pour que ça fonctionne avec PB 5.50 Beta..
Voilà

Code : Tout sélectionner

#FMOD_INIT_NORMAL = $0
#FMOD_CREATESTREAM = $80

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
	Global fmodLib = OpenLibrary(#PB_Any, "fmodex.dll")
CompilerElse
	Global fmodLib = OpenLibrary(#PB_Any, "fmodex64.dll")
CompilerEndIf

If fmodLib
	
	;// Declare prototype
	
	;- FMOD_System_Create
	Prototype.l FMOD_System_Create_Prototype(*system)
	Global FMOD_System_Create.FMOD_System_Create_Prototype = GetFunction(fmodLib, "FMOD_System_Create")
	
	;- FMOD_System_Init_
	Prototype.l FMOD_System_Init_Prototype (system.l, Maxchannels.l, flags.l, Extradriverdata.l);system.l, Maxchannels.l, flags.l, Extradriverdata.l
	Global FMOD_System_Init.FMOD_System_Init_Prototype = GetFunction(fmodLib, "FMOD_System_Init")
	
	;- FMOD_System_CreateStream_
	Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.p-ascii, Mode.l, *exinfo, *Sound)
	Global FMOD_System_CreateStream.FMOD_System_CreateStream_Prototype = GetFunction(fmodLib, "FMOD_System_CreateStream")
	
	;- FMOD_System_PlaySound_
	Prototype.l FMOD_System_PlaySound_Prototype (system.l, channelid.l, sound.l, paused.l, *channel)
	Global FMOD_System_PlaySound.FMOD_System_PlaySound_Prototype = GetFunction(fmodLib, "FMOD_System_PlaySound")
	
	
	;// Test
	Global fmodsystem, url.S, Sound, Channel.i
	
	FMOD_System_Create(@fmodsystem)
	
	FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
	
	Url ="http://server1.chilltrax.com:9000"
	FMOD_System_CreateStream(fmodsystem, Url, #FMOD_CREATESTREAM, 0, @sound)
	
	FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)
	
	Delay(10000)
EndIf
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Merci beaucoup El Papounet ça fonctionne.
Ar-S a écrit :Si vous aviez le courage et la gentillesse d'uploader le pbi compatible x64 x86 en 5.50 ce serait top.
Je vais faire un include avec les fonctions minimums de fmodex pour pouvoir jouer des fichiers mp3, ogg, etc ... , lire/ecouter les flux shoutcast, ....
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Les modifications de El Papounet étaient suffisante mais je ne savais pas si l'include de Fmodex était fonctionnel à 100%.

J'ai lancé le sujet sur le forum anglophone et j'ai eu une réponse de nco2k.

La fonction Ascii() est apparu avec la version PB 5.50 et permet de résoudre ce problème sans toucher à l'include initiale de Fmodex.

Il faut envoyer la représentation ASCII des variables contenant un son ou un flux shoutcast.

■ Exemple pour un stream

Code : Tout sélectionner

FMOD_System_CreateStream(fmodsystem, @Url, #FMOD_CREATESTREAM, 0, @sound)
Il faut coder

Code : Tout sélectionner

code]FMOD_System_CreateStream(fmodsystem, Ascii(Url), #FMOD_CREATESTREAM, 0, @sound
■ Exemple pour un son

Code : Tout sélectionner

FMOD_System_CreateStream(fmodsystem, @File, #FMOD_SOFTWARE, 0, @sound)
Il faut coder

Code : Tout sélectionner

FMOD_System_CreateStream(fmodsystem, Ascii(File), #FMOD_SOFTWARE, 0, @sound)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: FmodEx : Jouer un flux shoutcast

Message par El Papounet »

Merci pour le retour d'info. Une fonction qui va certainement être des plus utiles.

Par contre, as-tu résolu le problème des tags suivant les différentes options du compilateur (Unicode ou non et x64/x86) ?
falsam a écrit :Ok avec le débug j'ai bien les tags. Par contre ils ne portent pas le meme nom suivant le type de compilation !!!
C'est délirant ça.
Sinon j'ai fait quelques tests et le code qui suit (en reprenant ton code précédent) semble fonctionner.
C'est encore au niveau du wrapper que ça cloche (la structrure FMOD_TAG) et au niveau de la récupération des chaines:

Code : Tout sélectionner

#FMOD_INIT_NORMAL = $0
#FMOD_CREATESTREAM = $80

Structure FMOD_TAG
  type.l         ; [out] The type of this tag.
  datatype.l     ; [out] The type of data that this tag contains 
  *name         ; [out] The name of this tag i.e. "TITLE", "ARTIST" etc.
  *_data        ; [out] Pointer to the tag data - its format is determined by the datatype member 
  datalen.l      ; [out] Length of the data contained in this tag 
  udated.l       ; [out] True if this tag has been updated since last being accessed with Sound::getTag 
EndStructure

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
	Global fmodLib = OpenLibrary(#PB_Any, "fmodex.dll")
CompilerElse
	Global fmodLib = OpenLibrary(#PB_Any, "fmodex64.dll")
CompilerEndIf

If fmodLib
	
	;// Declare prototype
	
	;- FMOD_System_Create
	Prototype.l FMOD_System_Create_Prototype(*system)
	Global FMOD_System_Create.FMOD_System_Create_Prototype = GetFunction(fmodLib, "FMOD_System_Create")
	
	;- FMOD_System_Init_
	Prototype.l FMOD_System_Init_Prototype (system.l, Maxchannels.l, flags.l, Extradriverdata.l);system.l, Maxchannels.l, flags.l, Extradriverdata.l
	Global FMOD_System_Init.FMOD_System_Init_Prototype = GetFunction(fmodLib, "FMOD_System_Init")
	
	;- FMOD_System_CreateStream_
	Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.p-ascii, Mode.l, *exinfo, *Sound)
	Global FMOD_System_CreateStream.FMOD_System_CreateStream_Prototype = GetFunction(fmodLib, "FMOD_System_CreateStream")
	
	;- FMOD_System_PlaySound_
	Prototype.l FMOD_System_PlaySound_Prototype (system.l, channelid.l, sound.l, paused.l, *channel)
	Global FMOD_System_PlaySound.FMOD_System_PlaySound_Prototype = GetFunction(fmodLib, "FMOD_System_PlaySound")
	
	
	
	
  	Prototype.l FMOD_Sound_GetNumTags_Prototype (sound.l, *Numtags, *Numtagsupdated)
  	Global FMOD_Sound_GetNumTags.FMOD_Sound_GetNumTags_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetNumTags")	
  	
  	Prototype.l FMOD_Sound_GetTag_Prototype (sound.l, pNameOrNull.l, Index.l, *Tag)
  	Global FMOD_Sound_GetTag.FMOD_Sound_GetTag_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetTag")
  
	
	;// Test
	Global fmodsystem, url.S, Sound, Channel.i
	
	FMOD_System_Create(@fmodsystem)
	
	FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
	
	Url ="http://server1.chilltrax.com:9000"
	FMOD_System_CreateStream(fmodsystem, Url, #FMOD_CREATESTREAM, 0, @sound)
	
	FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)


	
	Delay(1000)
	TagCount.l = 0
	FMOD_Sound_GetNumTags(sound, @TagCount, #Null)
	Debug Str(TagCount) + " Tags"
	
	Tag.FMOD_TAG
	For i = 0 To TagCount - 1      
		FMOD_Sound_GetTag(Sound, 0, i, @Tag)
		
		Select UCase(PeekS(Tag\name, -1, #PB_Ascii))
			Case "ARTIST", "TPE1", "TPE2", "TP1"
				Debug Str(i) + " Artist : " + PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
				
			Case "TITLE", "TIT1", "TIT2", "TT2"
				Debug Str(i) + " Title  : " + PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
				
			Case "ICY-NAME"
				Debug Str(i) + " ICYName: " + PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
				
			Case "ICY-URL"
				Debug Str(i) + " ICYUrl : " + PeekS(Tag\_data, Tag\datalen, #PB_Ascii)

				
		EndSelect
		
	Next
	
	Delay(10000)
EndIf
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Bonjour El Papounet.
El Papounet a écrit :Par contre, as-tu résolu le problème des tags suivant les différentes options du compilateur (Unicode ou non et x64/x86) ?
Si les versions précédentes de PureBasic permettaient de compiler Unicode ou ASCII, ce n'est plus le cas avec la futur version de PureBasic estampillé 5.50 : PureBasic est seulement unicode dans sa nouvelle version comme le précise Fred.
Fred a écrit :Removed: ASCII mode for internal PureBasic string representation, PureBasic is now unicode only.
Voila pourquoi ces quelques tests avec cette future version.
El Papounet a écrit :J'ai fait quelques tests et le code qui suit semble fonctionner.
C'est encore au niveau du wrapper que ça cloche (la structrure FMOD_TAG) et au niveau de la récupération des chaines:
Je n'avais pas encore testé les TAGS et je te remercie beaucoup pour ce temps passé à résoudre ce problème car effectivement les tags ne fonctionnent pas si on compile avec la future version de PureBasic.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par falsam »

Vous trouverez un include minimum fonctionnant avec PB 5.50 suffisant pour la plupart des applications utilisant fmodex.

■ fmodex-min.pbi

Code : Tout sélectionner

;/ FMODEX-Min.pbi for fmodex 
;/
;/ Based on the code of Froggerprogger - 27.02.2007 - http://www.purebasic.fr/english/viewtopic.php?f=12&t=25144
;/ Update       : falsam, 13.06.2016 (PB 5.50)
;/ Contributor  : El Papounet, nco2k, spikey

#FMOD_INIT_NORMAL = $0      ; All platforms - Initialize normally.
#FMOD_CREATESTREAM = $80    ; Decompress at runtime, streaming from the source provided (standard stream).
#FMOD_SOFTWARE = $40        ; Makes sound reside in software.
#FMOD_CHANNEL_FREE = -1     ; For a channel index, FMOD chooses a free voice using the priority system.
#FMOD_CHANNEL_REUSE = -2    ; For a channel index, re-use the channel handle that was passed in.

#FMOD_TIMEUNIT_MS = $1      ; Milliseconds.

Structure FMOD_TAG
  type.l                    ; [out] The type of this tag.
  datatype.l                ; [out] The type of data that this tag contains 
  *name                     ; [out] The name of this tag i.e. "TITLE", "ARTIST" etc.
  *_data                    ; [out] Pointer to the tag data - its format is determined by the datatype member 
  datalen.l                 ; [out] Length of the data contained in this tag 
  udated.l                  ; [out] True if this tag has been updated since last being accessed with Sound::getTag 
EndStructure

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex.dll")
CompilerElse
  Global fmodLib = OpenLibrary(#PB_Any, "fmodex64.dll")
CompilerEndIf

If fmodLib
  
  ;- FMOD_System_Create
  Prototype.l FMOD_System_Create_Prototype(*system)
  Global FMOD_System_Create.FMOD_System_Create_Prototype = GetFunction(fmodLib, "FMOD_System_Create")
  
  ;- FMOD_System_Init_
  Prototype.l FMOD_System_Init_Prototype (system.l, Maxchannels.l, flags.l, Extradriverdata.l);system.l, Maxchannels.l, flags.l, Extradriverdata.l
  Global FMOD_System_Init.FMOD_System_Init_Prototype = GetFunction(fmodLib, "FMOD_System_Init")
  
  ;- FMOD_System_CreateStream_
  Prototype.l FMOD_System_CreateStream_Prototype (system.l, Name_or_data.l, Mode.l, *exinfo, *Sound)
  Global FMOD_System_CreateStream.FMOD_System_CreateStream_Prototype = GetFunction(fmodLib, "FMOD_System_CreateStream")
  
  ;- FMOD_System_PlaySound_
  Prototype.l FMOD_System_PlaySound_Prototype (system.l, channelid.l, sound.l, paused.l, *channel)
  Global FMOD_System_PlaySound.FMOD_System_PlaySound_Prototype = GetFunction(fmodLib, "FMOD_System_PlaySound")
  
  ;- FMOD_Sound_Release_
  Prototype.l FMOD_Sound_Release_Prototype (sound.l)
  Global FMOD_Sound_Release.FMOD_Sound_Release_Prototype = GetFunction(fmodLib, "FMOD_Sound_Release")
  
  ;- FMOD_Channel_SetVolume
  Prototype.l FMOD_Channel_SetVolume_Prototype(channel.l, Volume.f)
  Global FMOD_Channel_SetVolume.FMOD_Channel_SetVolume_Prototype = GetFunction(fmodLib, "FMOD_Channel_SetVolume")  
  
  ;- FMOD_Channel_SetPaused_
  Prototype.l FMOD_Channel_SetPaused_Prototype (channel.l, paused.l)
  Global FMOD_Channel_SetPaused.FMOD_Channel_SetPaused_Prototype = GetFunction(fmodLib, "FMOD_Channel_SetPaused")
  
  ;- FMOD_Channel_GetPaused_
  Prototype.l FMOD_Channel_GetPaused_Prototype (channel.l, *paused)
  Global FMOD_Channel_GetPaused.FMOD_Channel_GetPaused_Prototype = GetFunction(fmodLib, "FMOD_Channel_GetPaused")
  
  ;- FMOD_Channel_Stop_
  Prototype.l FMOD_Channel_Stop_Prototype (channel.l)
  Global FMOD_Channel_Stop.FMOD_Channel_Stop_Prototype = GetFunction(fmodLib, "FMOD_Channel_Stop")
  
  ;- FMOD_System_Release
  Prototype.l FMOD_System_Release_Prototype(system.l)
  Global FMOD_System_Release.FMOD_System_Release_Prototype = GetFunction(fmodLib, "FMOD_System_Release")
  
  ;- FMOD_Channel_GetPosition_
  Prototype.l FMOD_Channel_GetPosition_Prototype (channel.l, *Position, Postype.l)
  Global FMOD_Channel_GetPosition.FMOD_Channel_GetPosition_Prototype = GetFunction(fmodLib, "FMOD_Channel_GetPosition")
  
  ;- FMOD_Channel_SetPosition_
  Prototype.l FMOD_Channel_SetPosition_Prototype (channel.l, Position.l, Postype.l)
  Global FMOD_Channel_SetPosition.FMOD_Channel_SetPosition_Prototype = GetFunction(fmodLib, "FMOD_Channel_SetPosition")
  
  ;- FMOD_Sound_GetLength_
  Prototype.l FMOD_Sound_GetLength_Prototype (sound.l, *Length, Lengthtype.l)
  Global FMOD_Sound_GetLength.FMOD_Sound_GetLength_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetLength")
  
  ;- FMOD_Sound_GetNumTags_
  Prototype.l FMOD_Sound_GetNumTags_Prototype (sound.l, *Numtags, *Numtagsupdated)
  Global FMOD_Sound_GetNumTags.FMOD_Sound_GetNumTags_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetNumTags")   
  
  ;- FMOD_Sound_GetTag_
  Prototype.l FMOD_Sound_GetTag_Prototype (sound.l, pNameOrNull.l, Index.l, *Tag)
  Global FMOD_Sound_GetTag.FMOD_Sound_GetTag_Prototype = GetFunction(fmodLib, "FMOD_Sound_GetTag")
  
  ;- FMOD_Channel_GetSpectrum_
  Prototype.l FMOD_Channel_GetSpectrum_Prototype (channel.l, *Spectrumarray, Numvalues.l, Channeloffset.l, Windowtype.l)
  Global FMOD_Channel_GetSpectrum.FMOD_Channel_GetSpectrum_Prototype = GetFunction(fmodLib, "FMOD_Channel_GetSpectrum")

Else
  Debug "fmodex.dll or fmodex64.dll is needed and is not found." 
  End
EndIf
■ Demo : Lecture un fichier mp3

Code : Tout sélectionner

;Fmod Ex : Jouer un titre musical

EnableExplicit

IncludeFile "fmodex.pbi"

Enumeration
  #Mainform
  #File
  #OpenFile
  #Play
  #Pause
  #Stop
  #Volume
EndEnumeration

Define.l Event, GEvent, TiEvent

Global WindowStyle.i=#PB_Window_SystemMenu|#PB_Window_ScreenCentered

Global fmodsystem.i, Channel.i, Sound.i, Volume.f = 0.5, PauseStatus.b
Global File.s

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 300, 100, "Play Mp3", WindowStyle)
  StringGadget(#File, 10, 20, 230, 22, "", #PB_String_ReadOnly)
  ButtonGadget(#OpenFile, 245, 20, 50, 22, "Select")
  TextGadget(#PB_Any, 10, 50, 30, 20, "Vol")
  TrackBarGadget(#Volume, 45, 45, 200, 24, 0, 100)
  SetGadgetState(#Volume, 50)
  
  ButtonGadget(#Play, 55, 70, 60, 22, "Start")
  ButtonGadget(#Pause, 117, 70, 60, 22, "Pause")
  ButtonGadget(#Stop, 183, 70, 60, 22, "Stop")
  
EndProcedure

Open_MainForm()
  
;Declare l'objet FMOD System
FMOD_System_Create(@fmodsystem)
  
;Initialiser le system (32 canaux) un seul suffirait pour cet exemple
FMOD_System_Init(fmodsystem, 1, #FMOD_INIT_NORMAL, 0)

Global name.s, namelen, position, postype
Repeat
  Event   = WaitWindowEvent(100)    
  GEvent  = EventGadget()
  
  
  Select Event
            
    Case #PB_Event_Gadget
      Select GEvent
        Case #OpenFile
          
          ;Decharge le son precedent
          If Sound <> 0
            FMOD_Sound_Release(Sound)
          EndIf
          
          File = OpenFileRequester("Selectionner un fichier mp3","","Musique|*.mp3;*.wav;*.ogg;*.flac",0)
          If File <> ""
            SetGadgetText(#File, GetFilePart(File))
            FMOD_System_CreateStream(fmodsystem, Ascii(File), #FMOD_SOFTWARE, 0, @sound)
          EndIf
          
        Case #Volume
          Volume = GetGadgetState(#Volume)/100
          FMOD_Channel_SetVolume(Channel, Volume)
                  
        Case #Play  
          ;PlaySound va jouer le son sur un des canaux libre
          ;la variable Channel contiendra le handle du canal utilisé par le son.
          
          FMOD_System_PlaySound(fmodsystem, #FMOD_CHANNEL_FREE, sound, 0, @channel)
                    
          ;Et on ajuste le volume (le son est compris entre 0.0 et 1.0)
          FMOD_Channel_SetVolume(Channel, Volume)
          
        Case #Pause
          ;FMOD_Channel_GetPaused permet de savoir si le son sur le canal est en pause ou pas
          FMOD_Channel_GetPaused(Channel, @PauseStatus) 
          
          If PauseStatus = #False
            FMOD_Channel_SetPaused(Channel, #True) ;Pause
            SetGadgetText(#Pause, "Reprendre")
          Else
            FMOD_Channel_SetPaused(Channel, #False) ;Reprise de la lecture
            SetGadgetText(#Pause, "Pause")
          EndIf
          
        Case #Stop
          FMOD_Channel_Stop(Channel)
          
      EndSelect
        
    Case #PB_Event_CloseWindow
      FMOD_Channel_Stop(Channel)
      FMOD_System_Release(fmodsystem)
      End
      
  EndSelect
ForEver
■ Demo : Lecture d'un flux shoutcast

Code : Tout sélectionner

;Tutorial : Jouer un flux shoutcast

EnableExplicit

IncludeFile "fmodex-min.pbi"

Enumeration
  #Mainform
  #Pause
  #Volume
EndEnumeration

Define.l Event, GEvent, TiEvent

Global WindowStyle.i=#PB_Window_SystemMenu|#PB_Window_ScreenCentered

Global fmodsystem.i, Url.s, Channel.i, Sound.i, Volume.f = 0.5, PauseStatus.b

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 300, 100, "Play Shoutcast", WindowStyle)
  TextGadget(#PB_Any, 10, 50, 30, 20, "Vol")
  TrackBarGadget(#Volume, 45, 45, 200, 24, 0, 10)
  SetGadgetState(#Volume, 5)
  
  ButtonGadget(#Pause, 117, 70, 50, 22, "Pause")
  
EndProcedure

Procedure Start()
  Open_MainForm()
  
  ;Déclarer l'objet FMOD System
  FMOD_System_Create(@fmodsystem)
  
  ;Initialiser le system (32 canaux) un seul suffirait pour cet exemple
  FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
  
  ;CreateStream permet de commencer la lecture avant le chargement complet de l'url
  Url ="http://server1.chilltrax.com:9000"
  FMOD_System_CreateStream(fmodsystem, Ascii(Url), #FMOD_CREATESTREAM, 0, @sound)
  
  ;On joue le son sur le canal 1
  FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)
  
  ;Et on ajuste le volume (le son est compris entre 0.0 et 1.0)
  FMOD_Channel_SetVolume(Channel, 0.5)
  
EndProcedure

start()

Repeat
  Event   = WaitWindowEvent(10)    
  GEvent  = EventGadget()
    
  Select Event
            
    Case #PB_Event_Gadget
      Select GEvent
          
        Case #Volume
          Volume = GetGadgetState(#Volume)/10
          FMOD_Channel_SetVolume(Channel, Volume)
          
        Case #Pause
          ;FMOD_Channel_GetPaused permet de savoir si le son sur le canal est en pause ou pas
          FMOD_Channel_GetPaused(Channel, @PauseStatus) 
          
          If PauseStatus = #False
            FMOD_Channel_SetPaused(Channel, #True) ;Pause
          Else
            FMOD_Channel_SetPaused(Channel, #False) ;Reprise de la lecture
          EndIf
                              
      EndSelect
        
    Case #PB_Event_CloseWindow
      FMOD_Channel_Stop(Channel)
      FMOD_System_Release(fmodsystem)
      End
      
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message par Marc56 »

Merci pour tout ce travail 8)

En l'absence de la dll dans le répertoire, il n'y a aucun son, ni même message d'erreur lors de la compilation (normal)

Je propose cet ajout à la fin de ton fmodex-min.pbi :idea:

Code : Tout sélectionner

...
Else
    Debug "fmodex.dll or fmodex64.dll is needed and is not found." 
    End
EndIf 
:wink:
Répondre