Page 1 sur 6

FmodEx : Jouer un flux shoutcast

Publié : jeu. 21/nov./2013 17:48
par falsam
Fmod Ex est une bibliothéque C++ multiplate-forme (Windows, Linux, Macintosh, Android, XBox, Playstation, Nintendo (WII, 3DS et U), Iphone qui permet la création de module de son.

Fmod Ex supporte une vingtaine de formats musicaux (MP3, FLAC, WAV , WMA, XMA, etc ....) et supporte aussi la lecture de flux internet audios.

■ C'est un exemple simplifié de cette fonctionnalité que je vous présente ci-dessous.

Pour pouvoir exploiter Fmod Ex vous devez copier dans le dossier de votre projet les fichiers fmodex.dll ainsi que fmodex.pbi. Ces deux fichiers sont fournis en annexe de ce post.

:idea: Important : Il faut désactiver le support unicode.

Le code étant documenté, je ne ferais pas de commentaire supplémentaire.

Code : Tout sélectionner

;Fmodex : Jouer un shoutcast

EnableExplicit

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, 100)
  SetGadgetState(#Volume, 50)
  
  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 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
  Url ="http://195.70.62.125:8300" 
  FMOD_System_CreateStream(fmodsystem, @Url, #FMOD_CREATESTREAM, 0, @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 lié à son canal (@Channel)
  
EndProcedure

start()

Repeat
  Event   = WaitWindowEvent(100)    
  GEvent  = EventGadget()
    
  Select Event
            
    Case #PB_Event_Gadget
      Select GEvent
          
        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
          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
■ Annexe
Les DLL (x86 & x64) et l'include necessaires au fonctionnement des codes est disponible sur la platform collaborative GitHub.

:arrow: https://github.com/pbcodex/fmodex

■ A voir aussi
Ecouter un fichier audio

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 21/nov./2013 17:58
par Ar-S
J'adore fmod ex, c'est vraiment bon.

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 21/nov./2013 18:09
par falsam
Ar-S a écrit :J'adore fmod ex, c'est vraiment bon.
J'adore aussi mais ce qui m’embête c'est son principe de licence qui même gratuite pour des applications non commerciales ne permet peut être pas l'exploitation des fichiers mp3.
Please note, FMOD does not include a free license to distribute MP3 in your product
Vue ici

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 21/nov./2013 18:34
par Fred
C'est pour la même raison que PureBasic ne permet pas de lire les mp3 avec la lib sound (seulement la lib movie, mais parce qu'on utilise les codecs de Windows). Le cout d'une licence mp3 "redistribuable" est exorbitant.

Re: FmodEx : Jouer un flux shoutcast

Publié : jeu. 21/nov./2013 20:34
par Ar-S
C'est aussi bien dommage que les flux radio soient souvent en mp3 (plutôt qu'en ogg).

Re: FmodEx : Jouer un flux shoutcast

Publié : ven. 22/nov./2013 3:30
par SPH
Dommage que le .CHM n'est pas en francais :cry:

Re: FmodEx : Jouer un flux shoutcast

Publié : ven. 22/nov./2013 10:36
par falsam
@SPH : Ce n'est pas forcément parfait, mais tu peux aussi utiliser les moyens de traduction disponibles gratuitement sur google. Puisque tu es encore capable de mettre trois quatre mots sur ce forum, c'est qu'à priori tu n'as pas encore les doigt arthrosiques. Un coup de sélection de texte suivi d'un magnifique copier coller sur un site de traduction et tu aura ton texte en français !!

A part ce commentaire que tu as apporté, il te plait ce code ? :)

Re: FmodEx : Jouer un flux shoutcast

Publié : ven. 22/nov./2013 11:19
par Backup
SPH a écrit :Dommage que le .CHM n'est pas en francais :cry:
Dommage que le .CHM ne soit pas en français ;)
il n'est pas en Français
ou
le .CHM n'est pas en francais

je met 100 francs dans le nourin :)

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 26/nov./2013 18:35
par falsam
L'exemple précédent dans lequel j'ai inclus une liste de flux radio ainsi que l'affichage des tags d'informations quand ils sont disponibles (Essayer Chilltrax ou Jazz Radio). Comme pour le lecteur de fichiers musicaux, le spectre musical est affiché.

Le skin de la fenêtre n'est pas intégré de manière à le rendre suffisamment lisible.

Code : Tout sélectionner

;Fmodex : Jouer un flux internet radio

EnableExplicit

IncludeFile "fmodex.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 21
    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(() Récupère le spectre du signal de sortie en cours de lecture.
  ;SpectrumArray est un tableau représente 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() récupère le nombre de mots-clés 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))
        Case "ARTIST", "TPE1", "TPE2", "TP1"
          If Artist=""
            Artist = PeekS(Tag\_data, Tag\datalen)
          EndIf
                    
        Case "TITLE", "TIT1", "TIT2", "TT2"
          If Title=""
            Title = PeekS(Tag\_data, Tag\datalen)
          EndIf
          
        Case "ICY-NAME"
          ICYName = PeekS(Tag\_data, Tag\datalen)
          
        Case "ICY-URL"
          ICYUrl =   PeekS(Tag\_data, Tag\datalen)
         
      EndSelect
      ;Debug PeekS(Tag\name) + " "+PeekS(Tag\_data, Tag\datalen) 
    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()
  
  ;Déclarer 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, @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 lié à son canal (@Channel)
  
EndProcedure

start()

Repeat
  Event   = WaitWindowEvent(100)    
  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, @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: ;21 items
  
  Data.s "http://195.70.62.125:8300","Psychedelik" 
  Data.s "http://server1.chilltrax.com:9000", "Chilltrax"
  Data.s "http://vipicecast.yacast.net/europe1", "Europe1"
  Data.s "http://vipicecast.yacast.net:80/europe1", "Europe1"
  Data.s "http://vipicecast.yacast.net/rmc", "Rmc"
  Data.s "http://vipicecast.yacast.net/rtl", "RTL"
  Data.s "http://vipicecast.yacast.net/bfm", "BFM"
  Data.s "http://vipicecast.yacast.net/rfm", "RFM"
  Data.s "http://vipicecast.yacast.net/funradio", "Fun radio"
  Data.s "http://vipicecast.yacast.net/skyrock", "Skyrock"
  Data.s "http://vipicecast.yacast.net/nova", "Radio Nova"
  Data.s "http://broadcast.infomaniak.net/radionova-high.mp3", "Radio Nova"
  Data.s "http://mp3.live.tv-radio.com/nostalgie/all/nos_113812.mp3","Nostalgie"
  Data.s "http://mp3.live.tv-radio.com/franceculture/all/franceculturehautdebit.mp3", "France Culture"
  Data.s "http://mp3.live.tv-radio.com/francemusique/all/francemusiquehautdebit.mp3","France Musique"
  Data.s "http://broadcast.infomaniak.ch/frequencejazz-high.mp3","Jazz Radio"
  Data.s "http://mp3.live.tv-radio.com/rire_et_chansons/all/rir_124629.mp3", "Rire et Chansons"
  Data.s "http://mp3.live.tv-radio.com/rire_100_blagues/all/rir_123949.mp3", "100% Rire"
  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"
EndDataSection

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 26/nov./2013 20:14
par Backup
attention !

toutes les radios "http://vipicecast.yacast.net/*********" ne marchent plus !!
c'est devenu privé avec abonnement !!

donc , tu peux les retirer de ton Exemple ........ ;)

Re: FmodEx : Jouer un flux shoutcast

Publié : mar. 26/nov./2013 21:02
par falsam
Dobro a écrit :attention !

toutes les radios "http://vipicecast.yacast.net/*********" ne marchent plus !!
c'est devenu privé avec abonnement !!

donc , tu peux les retirer de ton Exemple ........ ;)
avant de dire ça tu aurais pu essayer. Je les utilise regulierement et elles fonctionnent tres bien et je ne suis pas abonné.

Re: FmodEx : Jouer un flux shoutcast

Publié : mer. 27/nov./2013 0:13
par Backup
pourquoi penses tu que je n'ai pas essayé ?
je les aient meme retiré de mon PureRadio !

chez moi par exemple (prestataire Orange )

Code : Tout sélectionner

http://vipicecast.yacast.net:80/europe1", "Europe1
ne marche pas !!
je ne pense pas etre un imbécile , qui dit les choses sans les avoir expérimenté d'abord !!

de plus essaye cette adresse : http://vipicecast.yacast.net/
tu verra s'il ne faut pas etre abonné !

l'information est relayé ici :
http://lea-linux.org/documentations/Tru ... r_internet

lire Remarques en bas de page !

si toutefois cela marche chez toi , poses toi alors la bonne question
ton prestataire a peut etre payé l'abonnement chez Yacast ! ;)

sinon le nombres de commentaires sur le Net indiquent que vipicecast.yacast ne fonctionne plus
ne manquent pas ...

Re: FmodEx : Jouer un flux shoutcast

Publié : mer. 27/nov./2013 0:30
par falsam
Je viens d'essayer à l'instant chez orange (ligne sans option tv et autres) et ça fonctionne parfaitement sur l'ensemble des url que je fourni. Ceci dit, ces url ne sont qu'à titre d'exemples :)

Test avec une connexion Numéricable et ça fonctionne aussi.

Re: FmodEx : Jouer un flux shoutcast

Publié : mer. 27/nov./2013 0:37
par Backup
et tu test a partir de ton code ?
ou en utilisant le navigateur ?

chez moi a partir du code, ça le fait pas ...
alors que sur la page des Radios ça le fait ...
par exemple sur le Site Europe1 je peut l'entendre
http://www.europe1.fr/Radio/Direct/pvr.html

et ceux que ce soit sur mon NC10 (XP)
ou mon MSI (Seven )

:roll:

je re vérifierai mes parefeux demain ...

Re: FmodEx : Jouer un flux shoutcast

Publié : mer. 27/nov./2013 0:45
par falsam
Dobro a écrit :et tu test a partir de ton code ?
Forcement que je teste à partir de mon code. Ce n'est pas autre chose que je présente sur ce post. Et forcement que ça fonctionne depuis les sites respectifs de chaque radio.
Dobro a écrit :de plus essaye cette adresse : http://vipicecast.yacast.net/
tu verra s'il ne faut pas etre abonné !
A mon avis ce n'est que l’accès clients de ceux qui paient pour être diffuser depuis Ce site. Il m'arrive parfois d'avoir besoin d'un serveur de stream payant et j'ai aussi un accés de ce type pour monitorer le serveur.
Dobro a écrit :l'information est relayé ici :
http://lea-linux.org/documentations/Tru ... r_internet
Cette page ne montre que des exemple de flux yacast je n'ai pas vu en bas de la page une information quelconque qui confirme tes dires. Et c'est loin d'être un site de référence.