Page 5 sur 6

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 8:29
par Marc56
Maintenant, c'est vrai que ce serait bien si la lib Movie qui lit très bien les mp3 (pas les tags, mais c'est pas important) pouvait aussi lire les flux shoutcast. :P
Ça éviterait de devoir empaqueter deux lib d'1 Mo chacune.

Fred, si jamais c'est techniquement / facilement possible ? ça nous ferait plaisir :D

(mon english spoken est trop mauvais pour que je mette ça dans Feature Requests and Wishlists du forum us, donc si jamais tu passes par ici)

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 8:55
par El Papounet
Merci falsam.

Ça m'a fait passer un bon moment, et comprendre pourquoi ça ne marche pas est un de mes passe temps préféré.

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 9:08
par Ar-S
J'ai pas trop eu le temps de regarder vos codes mais j'ai vu que ta version mini ne contient pas la gestion du spectrum.
Je tâcherai de modifier la fmodex pbi complète dés que j'aurai un moment.

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 9:19
par Marc56
C'est intéressant, ces versions mini, car ça permet d'inclure uniquement le code nécessaire à l'application, sans charger la RAM du programme appelant par tout un tas de variables et constantes globales qui ne seront pas utilisées nécessairement. :)

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 9:53
par Zorro
Marc56 a écrit :qui lit très bien les mp3 (pas les tags, mais c'est pas important)

voir la : http://www.purebasic.fr/french/viewtopi ... 03#p183903

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 10:17
par Marc56
Zorro a écrit :...(pas les tags, mais c'est pas important)...
voir la : http://www.purebasic.fr/french/viewtopi ... 03#p183903
Oui, j'avais étudié avec attention ton programme, ça m'a bien servi à comprendre. Merci :)
De même que la description faite dans wikipedia les ID3
Comme je ne voulais pas inclure 800 ligne et que la majorité des mp3 utilisent encore les tags id3V1, j'ai juste intégré cette partie: le titre de l'album me suffit.
:wink:

Je n'ai pas essayé de voir si un flux webradio mp3 diffuse aussi des tags ? :o

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 10:25
par falsam
Marc56 a écrit :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)
Tu as tout à fait raison. Le code est modifié.
Marc56 a écrit :Je n'ai pas essayé de voir si un flux webradio mp3 diffuse aussi des tags ?
Il y a diffusion des tags. Un exemple d'ici peu utilisant FModex-min.pbi

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 10:40
par Marc56
S'il y a au moins le nom de la station c'est super (je pourrais enlever ça de la configuration manuelle), le titre de la musique en cours c'est moins important.
:wink:

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 11:01
par falsam
Ar-S a écrit :J'ai pas trop eu le temps de regarder vos codes mais j'ai vu que ta version mini ne contient pas la gestion du spectrum.
Ajouté dans la version mini de fmodex.
Marc56 a écrit :S'il y a au moins le nom de la station c'est super
Un exemple affichant les tags utilisant la dernière version de fmodex-min.pbi intégrant la gestion du spectrum. (PB 5.50 Minimum)

Code : Tout sélectionner

;Fmodex : Jouer un flux internet radio

EnableExplicit

IncludeFile "fmodex-min.pbi"

Enumeration Font
  #FontGlobal
  #FontAuthor
  #FontTitle
EndEnumeration

Enumeration Window
  #Mainform
EndEnumeration

Enumeration Gadget
  #WebRadio
  #Pause
  #Volume
  
  #Spectrum
  
  #TagICYName
  #TagICYUrl
  #TagAuthor
  #TagTitle
  
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, N.i

Structure Radio
  Url.s
  Name.s
EndStructure
Global NewList WebRadio.Radio(), Url.s

Procedure WebRadioLoad()
  Protected Buffer.s, i.i
  
  Restore WebRadio
  For i=1 To 9
    AddElement(WebRadio())
    
    Read.s Buffer     
    WebRadio()\Url = Buffer
    
    Read.s Buffer     
    WebRadio()\Name = Buffer
    
    AddGadgetItem(#WebRadio, -1, WebRadio()\Name)
    SetGadgetItemData(#WebRadio, i-1, i-1)
  Next 
  
  SetGadgetState(#WebRadio, 0)
  
EndProcedure

Procedure ShowSpectrum()
  Protected Dim SpectrumArray.f(128), i.i, j.i, Max, Position.i
  
  ;FMOD_Channel_GetSpectrum(() Recupere le spectre du signal de sortie en cours de lecture.
  ;SpectrumArray est un tableau represente les amplitudes de chaque bande de fréquence.
  ;Le nombre d'amplitudes doit etre une puissance de 2 (Min 64 Max 8192) 
  FMOD_Channel_GetSpectrum(Channel, SpectrumArray(), 64, 0, 0 )
  
  StartDrawing(CanvasOutput(#Spectrum))
  
  ;Clear de l'histogramme
  Box(0, 0, 290, 100, RGB(245, 245, 245)) 
  
  ;Cadre autour de l'histogramme
  DrawingMode(#PB_2DDrawing_Outlined) 
  Box(0, 0, 290, 100, RGB(0, 0, 0)) 
  
  ;Dessin des points
  DrawingMode(#PB_2DDrawing_Default)
  For i=0 To 50
    Max= SpectrumArray(i)*300 
    
    Box(i*6, 100-max, 4, max-2, RGB(0, 191, 255)) 
    Box(i*6, 95-max, 4, 3, RGB(255, 0, 0)) ;Points rouges
  Next 
  
  StopDrawing()
  
EndProcedure


Procedure TagUpdate(Sound)
  Protected TagCount, Tag.FMOD_TAG, i, Title.s, Artist.s, ICYName.s, ICYUrl.s
  
  ;La fonction FMOD_Sound_GetNumTags() recupere le nombre de mots-cles appartenant à un son.
  FMOD_Sound_GetNumTags(Sound, @TagCount, #Null) 
  
  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"
        If Artist=""
          Artist = PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
        EndIf
        
      Case "TITLE", "TIT1", "TIT2", "TT2"
        If Title=""
          Title = PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
        EndIf
        
      Case "ICY-NAME"
        ICYName = PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
        
      Case "ICY-URL"
        ICYUrl =   PeekS(Tag\_data, Tag\datalen, #PB_Ascii)
        
    EndSelect
  Next
  
  If Artist <> GetGadgetText(#TagAuthor)
    SetGadgetText(#TagAuthor, Artist)
  EndIf
  
  If Title <> GetGadgetText(#TagTitle)
    SetGadgetText(#TagTitle, Title)
  EndIf
  
  If ICYName <> GetGadgetText(#TagICYName) Or N<>0
    If Len(ICYName) > 47
      N+1
      If N > Len(ICYName)-47
        N = 0
      EndIf
    Else
      N=0
    EndIf
    
    SetGadgetText(#TagICYName, Mid(ICYName, N, 47))
  EndIf
  
  If ICYUrl <> GetGadgetText(#TagICYUrl)
    SetGadgetText(#TagICYUrl, ICYUrl)
  EndIf
  
EndProcedure

Procedure Open_MainForm()    
  LoadFont(#FontGlobal, "Tahoma", 10)
  SetGadgetFont(#PB_Default, FontID(#FontGlobal)) 
  
  LoadFont(#FontAuthor, "Tahoma", 15)
  LoadFont(#FontTitle, "Tahoma", 12)
  
  OpenWindow(#Mainform, 0, 0, 300, 315, "Play Shoutcast", WindowStyle)
  ComboBoxGadget(#WebRadio, 10, 10, 280, 24)
  
  TextGadget(#PB_Any, 5, 45, 30, 20, "Vol")
  TrackBarGadget(#Volume, 45, 45, 251, 24, 0, 100)
  SetGadgetState(#Volume, 50)
  
  ;Auteur & Titre
  TextGadget(#TagAuthor, 5, 72, 290, 22, "?")
  SetGadgetFont(#TagAuthor, FontID(#FontAuthor)) 
  TextGadget(#TagTitle, 5, 95, 290, 22, "?")
  SetGadgetFont(#TagTitle, FontID(#FontTitle))
  
  ;Nom de la radio et site
  TextGadget(#TagICYName, 5, 120, 290, 22, "?")
  TextGadget(#TagICYUrl, 5, 150, 280, 22, "?")
  
  ;Spectrum
  CanvasGadget(#Spectrum, 5, 175, 290, 100)
  ButtonGadget(#Pause, 117, 285, 50, 24, "Pause")
  
  AddWindowTimer(#Mainform, 100, 100)
  AddWindowTimer(#Mainform, 101, 500)
EndProcedure

Procedure Start()
  Open_MainForm()
  WebRadioLoad()
  
  ;Declarer l'objet FMOD System
  FMOD_System_Create(@fmodsystem)
  
  ;Initialiser le system (32 canaux) 
  ;Un seul canal suffirait pour cet exemple.
  ;Le maximum est de 4093 canaux.
  FMOD_System_Init(fmodsystem, 32, #FMOD_INIT_NORMAL, 0)
  
  ;CreateStream permet de commencer la lecture avant le chargement complet de l'url
  FirstElement(WebRadio())
  Url = WebRadio()\Url
  FMOD_System_CreateStream(fmodsystem, Ascii(Url), #FMOD_CREATESTREAM, 0, @sound)
  
  TagUpdate(Sound)
  
  ;On joue le son sur le canal 1 (@Channel contiendra le handle du cannal 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)
  
  ;le son (@Sound) et intimement lie a son canal (@Channel)
  
EndProcedure

start()

Repeat
  Event   = WaitWindowEvent(10)    
  GEvent  = EventGadget()
  TiEvent = EventTimer()
  
  Select Event
      
    Case #PB_Event_Timer
      Select TIEvent
        Case 100
          ShowSpectrum() 
          
        Case 101
          TagUpdate(Sound)
          
      EndSelect
      
    Case #PB_Event_Gadget
      
      Select GEvent
        Case #WebRadio
          SelectElement(Webradio(), GetGadgetState(#WebRadio))
          FMOD_System_CreateStream(fmodsystem, Ascii(Webradio()\Url), #FMOD_CREATESTREAM, 0, @sound)
          TagUpdate(Sound)
          FMOD_System_PlaySound(fmodsystem, 1, sound, 0, @channel)
          FMOD_Channel_SetVolume(Channel, GetGadgetState(#Volume)/100)
          
        Case #Volume
          Volume = GetGadgetState(#Volume)/100
          FMOD_Channel_SetVolume(Channel, Volume)
          
        Case #Pause
          ;FMOD_Channel_GetPaused permet de savoir si le son sur le canal est en pause ou pas
          TagUpdate(Sound)
          FMOD_Channel_GetPaused(Channel, @PauseStatus) 
          
          If PauseStatus = #False
            FMOD_Channel_SetPaused(Channel, #True) ;Pause
            SetGadgetText(#Pause, "Play")
          Else
            FMOD_Channel_SetPaused(Channel, #False) ;Reprise de la lecture
            SetGadgetText(#Pause, "Pause")
          EndIf
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      FMOD_Channel_Stop(Channel)
      FMOD_System_Release(fmodsystem)
      End
      
  EndSelect
ForEver

DataSection
  Webradio:
  
  Data.s "http://server1.chilltrax.com:9000", "Chilltrax"
  Data.s "http://broadcast.infomaniak.ch/frequencejazz-high.mp3","Jazz Radio"
  Data.s "http://stream.pulsradio.com:5000", "Pulse Radio"
  Data.s "http://stream1.chantefrance.com/Chante_France", "Chante France"
  Data.s "http://streaming202.radionomy.com:80/70s-80s-90s-riw-vintage-channel","RIWVintage Channel"
  Data.s "http://mfm.ice.infomaniak.ch/mfm-128.mp3", "MFM Radio"
  Data.s "http://broadcast.infomaniak.net/tsfjazz-high.mp3", "TSF Jazz"
  Data.s "http://199.101.51.168:8004", "Blues Connection"
  Data.S "http://185.33.22.15:10036", "GAIA"
EndDataSection
Certains flux n’intègrent pas les tags comme dans cette exemple avec Chante France.

Merci à El Papounet pour le temps passé (Il a veillé tard) à comprendre pourquoi la lecture des tags ne fonctionné pas avec la future version 5.50 de PureBasic.

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 14/juin/2016 12:06
par Ar-S
Avec Fmodex Mini, (testé en PB 5.42 x86) ça marche aussi via l'ancienne commande

Code : Tout sélectionner

FMOD_System_CreateStream(fmodsystem, @url$, #FMOD_CREATESTREAM, 0, @sound)
PS : Tu devrais editer ton 1er post voir créer un nouveau topic pour retrouver le code du Fmodex Mini
Et ajouter les 2 exemples pour 5.50 et 5.42

ça a l'air de passer nikel en tout cas, merci à vous

---edit---- Oups à non en unicode sur la 5.42 ça marche pas

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 23/juin/2016 13:06
par JohnJohnsonSHERMAN
Si j'ais bien tout compris, en ajoutant Ascii() devant chaque chaine de caractéres à passer à Fmod, ca marche sans probléme avec l'unicode, c'est ca?

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 23/juin/2016 13:32
par Marc56
JohnJohnsonSHERMAN a écrit :Si j'ais bien tout compris, en ajoutant Ascii() devant chaque chaine de caractéres à passer à Fmod, ca marche sans probléme avec l'unicode, c'est ca?
Pour moi, tout s'est mis à fonctionner en suivant les indications de El Papounet (en bas de la page 3 de ce topic)

:wink:

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 23/juin/2016 14:07
par JohnJohnsonSHERMAN
C'est là que j'ai peur de dire des co******* : Dans l'exemple de El Papounet, on modifie le type de la variable qui recoit, d'un type Long .l qui change selon qu'on soit en ascii ou en unicode, on passe a un type Pseudo-Ascii, .p-ascii, qui reste de l'Ascii. Avec Ascii(), on change la variable que l'on passe en Ascii. C'est pas la même chose avec pour seule différence de le faire tantot a la réception, tantot a la source??? (J'y comprend plus rien moi...) Enfin dans les deux cas FMOD recoit bien de l'Ascii non?

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 30/juin/2016 11:19
par MetalOS
Putain je cherche un code pour jouer un flux shoutcast depuis des années et c'est chose faite. Merci beaucoup.

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 30/juin/2016 11:28
par falsam
le cri du coeur MetalOS ^^

Tu as une version minimum de FmoDex sur ce lien qui fonctionne avec la version 5.42 et 5.50 Beta de PureBasic
:arrow: http://www.purebasic.fr/french/viewtopi ... =6&t=16135

Package complet (DLL, Include, exemple d'utilisation Shoutcast, exemple d'utilisation MP3, Ogg, etc ....)
:arrow: https://github.com/pbcodex/FMODEX-MIN/a ... master.zip