FmodEx : Jouer un flux shoutcast

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

Re: FmodEx : Jouer un flux shoutcast

Message 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)
El Papounet
Messages : 57
Inscription : mer. 09/juin/2010 23:47

Re: FmodEx : Jouer un flux shoutcast

Message 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é.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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.
~~~~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
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message 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. :)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: FmodEx : Jouer un flux shoutcast

Message 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
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message 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:
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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
~~~~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
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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?
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: FmodEx : Jouer un flux shoutcast

Message 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:
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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?
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message par MetalOS »

Putain je cherche un code pour jouer un flux shoutcast depuis des années et c'est chose faite. Merci beaucoup.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: FmodEx : Jouer un flux shoutcast

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre