<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Il Blog di Fabrizio Mondo &#187; Web Radio</title>
	<atom:link href="http://www.fabriziomondo.com/blog/category/web-radio/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fabriziomondo.com/blog</link>
	<description>Don&#039;t hate the media.. become the media.</description>
	<lastBuildDate>Thu, 05 Aug 2010 10:22:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Come creare una web radio con Linux, Icecast e Ices2 (Guida avanzata) &#8211; Ices-Alsa</title>
		<link>http://www.fabriziomondo.com/blog/2010/05/03/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-avanzata-ices-alsa/</link>
		<comments>http://www.fabriziomondo.com/blog/2010/05/03/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-avanzata-ices-alsa/#comments</comments>
		<pubDate>Mon, 03 May 2010 13:59:29 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=772</guid>
		<description><![CDATA[Settantasettesimo articolo dedicato alle web radio. Cominciamo le guide avanzate dedicate ad icecast su linux, studiando i file XML di esempio che vengono forniti a corredo con ices2. E&#8217; chiaro che il server icecast può non essere utilizzato necessariamente con ices2, ma in questo caso, risulta secondariamente necessario alla trasmissione (quantomeno per passare da un [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft" src="http://www.gentoo.org/images/docs/alsa-mixermuted.png" alt="Alsamixer" width="275" height="136" /><br />
Settantasettesimo articolo dedicato alle web radio.</p>
<p>Cominciamo le guide avanzate dedicate ad icecast su linux, studiando i file <acronym title="eXtensible Markup Language">XML</acronym> di esempio che vengono forniti a corredo con ices2.</p>
<p>E&#8217; chiaro che il server icecast può non essere utilizzato necessariamente con ices2, ma in questo caso, risulta secondariamente necessario alla trasmissione (quantomeno per passare da un livello amatoriale ad uno semi-professionale)  conoscere e sapere manipolare i file di configurazione, che in questo caso sono del tipo Extensive Markup Language.</p>
<p>Il primo di questi file che considereremo è quello dedicato allo streaming da <a href="http://it.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture">ALSA</a>.  Alsa sta per Advanced Linux Sound Architecture e contraddistingue in questo caso una modalità di streaming improntata sul live o sull&#8217;ingresso della scheda audio, ad esempio un banale simulcasting.</p>
<p>Andiamo quindi a considerare le parti di questo file, che è meglio ricordare, si trova in <strong>/usr/share/doc/ices2/examples</strong></p>
<p>La prima parte del file è questa:<br />
<center></p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- run in background &nbsp;--&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;background<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/background<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- where logs go. --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logpath<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/var/log/ices<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logpath<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>ices.log<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logfile<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- size in kilobytes --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;logsize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2048<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/logsize<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- 1=error, 2=warn, 3=infoa ,4=debug --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;loglevel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/loglevel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">&lt;!-- logfile is ignored if this is set to 1 --&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;consolelog<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/consolelog<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>
<p></center></p>
<p>Il tag <strong>background</strong> va settato ad 1 se si vuole porre ices in background.</p>
<p>Il tag <strong>logpath</strong> identifica una directory che può essere scritta dall&#8217;utente che ices2 sta identificando. Può essere piazzata ovunque, ma chiaramente devono essere abilitati i permessi di scrittura.</p>
<p>Il tag <strong>logfile</strong> identifica il nome del file di log. Alla riapertura del log file l&#8217;esistente viene rinominato come &#8220;logfile&#8221;.1</p>
<p>Il tag <strong>logsize</strong> indica la massima grandezza del file di log prima di andare in modalità ciclica di scrittura.</p>
<p>Il tag <strong>loglevel</strong> Indica un numero che rappresenta il livello di logging  prescelto.<br />
1 &#8211; Loggati solo i messaggi d&#8217;errore<br />
2 &#8211; Come il punto uno, ma anche i Warnings verranno loggati<br />
3 &#8211; Come il punto due, ma anche i messaggi informativi verranno loggati.<br />
4 &#8211; Come il punto tre, ma anche i messaggi di debug verranno loggati.</p>
<p>Il tag <strong>consolelog</strong>, se impostato ad 1 causa l&#8217;apparizione dei messaggi loggati in console, piuttosto che in un log file. </p>
<p>Nelle applicazioni più sensibili al ritardo (tra cui OVVIAMENTE una radio), è sconsigliato avere logging in console. E&#8217; un opzione utile in fase di studio del software.</p>
<p>Il tag <strong>pidfile</strong> consente di creare un file in cui è scritto il ProcessID del processo ices2 corrente.</p>
<p>Veniamo adesso alla sezione stream.</p>
<p>La sezione stream è composta da tre sottoparti, chiamate <b>metadata</b>, <b>input</b> e <b>instance</b>.</p>
<p>Esaminiamole tutte e tre nel dettaglio.</p>
<p><b>Metadata</b> intuitivamente si capisce già su cosa abbia influenza, ovvero si occupa di trasmettere tutti i dati a corredo della trasmissione stessa.</p>
<p>Le sue sottoparti sono nome, genere, descrizione e url, esattamente gli stessi campi che si trovano in generale nei server shoutcast, ma in realtà praticamente in tutti.</p>
<p><b>Input</b> invece tratta la parte hardware della trasmissione, vediamo come.</p>
<p>Module, ci indica di scegliere quale modulo hardware stiamo trattando, qui si parla di alsa, per cui scriviamo alsa.</p>
<p>I successivi parametri sono rate, channels, device e i metadata.</p>
<p>Rate indica la frequenza di campionamento del segnale analogico di partenza. E&#8217; normalmente settata a 44100 hertz, se non sapete come mai, vi invito caldamente a leggere il <a href="http://it.wikipedia.org/wiki/Teorema_del_campionamento_di_Nyquist-Shannon">teorema divino</a>.</p>
<p>Channels indica se vogliamo una trasmissione mono o stereo.</p>
<p>Device indica la posizione della scheda audio nell&#8217;elenco delle periferiche del nostro sistema.</p>
<p>Metadata e metadatafilename rappresentano uno switch di scrittura e un nome file dove vengono scritti i metadati.</p>
<p><b>Istance</b> rappresenta la generica istanza di trasmissione. Dico &#8220;generica&#8221; in quanto, se conoscete il software di cui stiamo parlando, o avete letto altri articoli (non per forza di questo blog) su ices2, saprete che è un source multi-instanziabile, ovvero ha la possibilità di trasmettere, a differenza di molti software per shoutcast ad esempio, lo stesso stream a più server contemporaneamente.</p>
<p>hostname indica l&#8217;indirizzo ip del server da contattare, può essere sia un ipv4 che ipv6.</p>
<p>port indica la porta del processo sul server da contattare, vi ricordo che si comunica in tcp.</p>
<p>password non necessità spiegazioni</p>
<p>mount, identifica il cosidetto mountpoint, ovvero un particolare stream in un singolo server icecast, che può trasmettere più stream contemporaneamente.</p>
<p>yp è uno switch che abilita o disabilita la visione pubblica dell&#8217;emittente.</p>
<p>La sezione Encode indica i parametri di codifica dello stream, che devono matchare chiaramente quelli impostati in hardware nella sezione precedente.</p>
<p>Il tag downmix è uno switch che indica se, in caso di necessità, si preferisce diminuire il numero di canali da due ad uno, ovvero passare da stereo a mono.</p>
<p>La sezione Resample definisce la frequenza in hertz a cui passare in caso ad esempio di problemi di rete. Tipicamente si preferisce passare ad un valore pari alla metà della frequenza di partenza. Ricordatevi sempre che sempre per il teorema divino, se volete ricostruire senza aliasing un segnale che ha banda N hertz, avete bisogno di una frequenza di campionamento NON INFERIORE a 2N hertz. Quindi avere 22050 hertz di frequenza di campionamento, consente di sentire discretamente una banda di 10000 hertz. Sufficiente per il parlato ma non certo per la marcia turca di mozart.</p>
<p>Con questa sezione finisce la parte alsa, vedremo nei prossimi articoli di considerare anche le altre opzioni possibili, ovvero <acronym title="Open Source Software">OSS</acronym> e una playlist.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2010/05/03/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-avanzata-ices-alsa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Come creare una web radio con Linux, Icecast e Ices2 (Guida basilare)</title>
		<link>http://www.fabriziomondo.com/blog/2010/02/20/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-basilare/</link>
		<comments>http://www.fabriziomondo.com/blog/2010/02/20/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-basilare/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 18:38:58 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Configurazioni]]></category>
		<category><![CDATA[Icecast]]></category>
		<category><![CDATA[Ices2]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ogg]]></category>
		<category><![CDATA[Streaming]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=755</guid>
		<description><![CDATA[Settantaseiesimo articolo dedicato alle web radio Carissimi internauti vi ricordate di questo articolo? In quell&#8217;articolo si parlava di Icecast, un server di streaming rilasciato con licenza GPL e che permette lo streaming audio/video dei file Ogg, sia Vorbis che Theora. Lo abbiamo introdotto in ambiente windows, adesso, vedremo di parlarne anche in ambiente linux. Cominceremo [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft" src="http://wam.flyer.it/Immagini_correlate/cubetti.jpg" alt="Icecast" width="144" height="108" />Settantaseiesimo articolo dedicato alle web radio</p>
<p>Carissimi internauti vi ricordate di <a href="http://www.fabriziomondo.com/blog/2007/05/09/come-creare-una-web-radio-con-windows-winamp-e-icecast-guida-basilare/">questo articolo</a>?</p>
<p>In quell&#8217;articolo si parlava di <a href="http://it.wikipedia.org/wiki/Icecast">Icecast</a>, un server di streaming rilasciato con licenza <acronym title="GNU General Public License">GPL</acronym> e che permette lo streaming audio/video dei file Ogg, sia Vorbis che Theora. Lo abbiamo introdotto in ambiente windows, adesso, vedremo di parlarne anche in ambiente linux.</p>
<p>Cominceremo dall&#8217;inizio, ovvero dall&#8217;installazione dei componenti fino all&#8217;effettiva messa in onda della radio. Successivamente, in una guida avanzata, procederemo a vagliare e valutare tutte le possibili opzioni. Per adesso, mettiamo in moto la nostra radiolina linuxiana.</p>
<p><strong><em>Supponiamo di lavorare su una debian-based</em></strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">apt-get install icecast ices2</div></div>
<p>Una volta installati i due programmi, effettuiamo una modifica al file <strong>/etc/default/icecast2</strong> tramite un qualsiasi editor di testo modificando il parametro ENABLE, da false a true. Ciò permetterà di potere effettuare la prossima operazione.</p>
<p>Facciamo partire il nostro server icecast2 tramite il comando:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/etc/init.d/icecast2 start</div></div>
<p>Potremo quindi trovare l&#8217;interfaccia web, comprensiva di pannello di amministrazione, all&#8217;indirizzo http://localhost:8000<br />
Studieremo successivamente le peculiarità web di questo server di streaming,</p>
<p>In questo momento abbiamo il nostro server di streaming funzionante (almeno in locale) e possiamo cominciare a lavorare su ICES2.</p>
<p>Ices2 è:</p>
<blockquote><p> usato per fornire a server audio streaming Icecast2 flussi<br />
audio Ogg Vorbis. Supporta sia input audio live dalla scheda audio, sia la<br />
ricodifica di file Ogg Vorbis da una scaletta. </p></blockquote>
<p>Creiamo tre cartelle da terminale:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mkdir /var/log/ices<br />
mkdir /etc/ices2<br />
mkdir /etc/ices2/music</div></div>
<p>La prima servirà a contenere i log, la seconda servirà invece a contenere i file di configurazione mentre la terza conterrà i file musicali.</p>
<p>All&#8217;interno della cartella <strong>/usr/share/doc/ices2/examples/</strong> si trovano tre files:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-rw-r--r-- 1 root root 3426 2005-01-03 05:07 ices-alsa.xml<br />
-rw-r--r-- 1 root root 3427 2005-01-03 21:39 ices-oss.xml<br />
-rw-r--r-- 1 root root 4245 2004-07-19 23:53 ices-playlist.xml</div></div>
<p>I tre files corrispondono alle tre modalità di streaming, ovvero tramite ALSA (Advanced Linux Sound Architecture) oppure <acronym title="Open Source Software">OSS</acronym> (Open sound system) oppure tramite una playlist di file OGG, che è il caso che tratteremo in questa guida basilare.</p>
<p>Copiamo il file <strong>ices-playlist.xml</strong> all&#8217;interno della cartella <strong>/etc/ices2</strong> ad esempio con il comando</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cp /usr/share/doc/ices2/examples/ices-playlist.xml /etc/ices2</div></div>
<p>a questo punto dobbiamo verificare che vi sia <em>matching perfetto</em> tra la password impostata su ices2 e quella del server icecast, come del resto avviene per qualsiasi accoppiata, encoder/server.</p>
<p>La password del server di streaming icecast2 si trova nel file <strong> /etc/icecast2/icecast.xml</strong> alla sezione AUTHENTICATION.<br />
La password da impostare in ices2, che deve chiaramente essere uguale a quella (per adesso di default) del server icecast2, è nella sezione INSTANCE del file ices-playlist.xml.</p>
<p>Penseremo a tutti i parametri opzionali (tra cui anche la modifica delle password) nella guida avanzata. Per adesso il nostro unico obiettivo è quello di mettere (almeno localmente) la radio in trasmissione.</p>
<p>Dopo avere controllato la corrispondenza tra le password passiamo al riempimento della cartella music, precedentemente impostata con i file ogg vorbis che ci interessa trasmettere.</p>
<p>Una volta riempita la cartella music, creiamo il file playlist.txt all&#8217;interno della cartella <strong>/etc/ices2</strong> e scriviamo una riga per ciascun file OGG che dobbiamo trasmettere, con tanto di PATH completo.</p>
<p>Una volta creato il file, startiamo ices2 con il seguente comando:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ices2 /etc/ices2/ices-playlist.xml</div></div>
<p>In questo modo il server icecast avrà come mountpoint il flusso creato da ices2.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2010/02/20/come-creare-una-web-radio-con-linux-icecast-e-ices2-guida-basilare/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Parsing Audio</title>
		<link>http://www.fabriziomondo.com/blog/2009/12/28/parsing-audio/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/12/28/parsing-audio/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 16:51:16 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Parsing]]></category>
		<category><![CDATA[Streaming]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=518</guid>
		<description><![CDATA[Settantacinquesimo articolo dedicato alle web radio Questo articolo potrebbe risultare leggermente fantascientifico, ma in realtà non risulterà esserlo affatto. Cominciamo a discutere e valutare la possibilità, di idealizzare, cercare e perchè no creare un parser audio, o quantomeno, di andarci molto vicini. Secondo Wikipedia: Il parsing o analisi sintattica è il processo atto ad analizzare [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft" src="http://www.pescasportmt.com/images/setaccio1.jpg" alt="" width="180" height="137" align="left" />Settantacinquesimo articolo dedicato alle web radio</p>
<p>Questo articolo potrebbe risultare leggermente fantascientifico, ma in realtà non risulterà esserlo affatto.<br />
Cominciamo a discutere e valutare la possibilità, di idealizzare, cercare e perchè no creare un parser audio, o quantomeno, di andarci molto vicini.</p>
<p>Secondo Wikipedia:</p>
<blockquote><p>Il parsing o analisi sintattica è il processo atto ad analizzare uno stream continuo in input (letto per esempio da un file o una tastiera) in modo da determinare la sua struttura grammaticale grazie ad una data grammatica formale. Un parser è un programma che esegue questo compito.</p></blockquote>
<p>Considereremo vari casi nella studio del parsing audio applicato alle web radio, cominceremo dividendo dicotomicamente il problema di studio:</p>
<li>File audio come input di analisi</li>
<li>Web radio come input di analisi.</li>
<p>Vedremo che le cose non sono poi cosi diverse, ma vanno valutate separatamente.</p>
<p>Un file audio digitalizzato non compresso è composto, come abbiamo già visto tempo addietro da una frequenza di campionamento, una risoluzione ed un numero di canali.</p>
<p>Possiamo quindi esprimere in sintassi <acronym title="eXtensible Markup Language">XML</acronym> un file audio in un primo modo:</p>
<p><strong><br />
&lt;brano&gt;<br />
&lt;titolo&gt;Titolo Brano&lt;/titolo&gt;<br />
&lt;infoAggiuntive&gt;Informazioni Aggiuntive&lt;/infoAggiuntive&gt;<br />
&lt;canale&gt;<br />
&lt;campione&gt;<br />
&lt;id&gt;ID&lt;/id&gt;<br />
&lt;risoluzione&gt;Risoluzione&lt;/risoluzione&gt;<br />
&lt;/campione&gt;<br />
&lt;/canale&gt;<br />
&lt;/brano&gt;<br />
</strong></p>
<p>In questo modo è rispettata una struttura gerarchica che riproduce esattamente il contenuto di un file audio.</p>
<p>Un file audio, normalmente, ovvero per la maggior parte dei generi musicali, ha una struttura LOGICA di questo tipo:</p>
<p><strong><br />
&lt;brano&gt;<br />
&lt;intro&gt;introduzione&lt;/intro&gt;<br />
&lt;strofa&gt;strofa&lt;/strofa&gt;<br />
&lt;refrain&gt;refrain&lt;/refrain&gt;<br />
&lt;strofa&gt;strofa&lt;/strofa&gt;<br />
&lt;outro&gt;Outro&lt;/outro&gt;<br />
&lt;/brano&gt;<br />
</strong></p>
<p>Tale struttura divide il file in parti, ovvero l&#8217;introduzione, il ritornello, le strofe e l&#8217;uscita.</p>
<p>Combinando le due rappresentazioni è possibile effettivamente creare una struttura gerarchica suscettibile al parsing ad opera di un parser, che potrebbe quindi strutturare un file audio dato in input.</p>
<p>Passando dai file alle web radio, il discorso non cambia molto.</p>
<p>Si potrebbe benissimo considerare una web radio alla stregua di un brano, ottenendo ad esempio:</p>
<p><strong>&lt;flusso&gt;<br />
&lt;brano&gt;NomeBrano&lt;/brano&gt;<br />
&lt;Vocal&gt;InterventoVocale&lt;/vocal&gt;<br />
&lt;brano&gt;NomeBrano&lt;/brano&gt;<br />
&lt;/flusso&gt;</strong></p>
<p>Oppure la stessa programmazione:</p>
<p><strong>&lt;webradio&gt;<br />
&lt;Day&gt;<br />
&lt;hour&gt;<br />
&lt;programma&gt;Nomeprogramma&lt;/programma&gt;<br />
&lt;/hour&gt;<br />
&lt;/day&gt;<br />
&lt;/webradio&gt;</strong></p>
<p>e così via&#8230;</p>
<p>Abbiamo già parlato di un programma che segmentava l&#8217;input di una web radio in parti in base a dei pattern, tale programma si chiama streamripper.</p>
<p>In quel caso il discrimen è dato dal volume, che può essere preso come delimitatore di sezione all&#8217;interno del secondo modello di parsing.<br />
Si può passare dal campo intro al campo strofa in base ad un superamento di soglia di volume prefissata, oppure esattamente all&#8217;inizio della parte vocale, quindi in base ad un controllo del timbro o delle frequenze in gioco.</p>
<p>La trasposizione in linguaggio <acronym title="eXtensible Markup Language">XML</acronym> di un brano non è un puro esercizio matematico fine a se stesso.</p>
<p>Alcune sue applicazioni, oltre allo stesso streamripper, possono essere Tunatic e Midomi, di cui parleremo in prossimi articoli.</p>
<p>Il primo programma riconosce titolo e autore di un brano semplicemente ascoltandolo, mentre il secondo tenta di riconoscere i dettagli di un brano, quando viene cantato. Sono per lo più applicazioni da cellulare, per chi non riesce a trovare un titolo di un brano sentito alla radio.</p>
<p>Tuttavia queste applicazioni, applicate a stream digitali quali ad esempio le web radio o le radio fm stesse, consentono di controllare in modo proporzionale alla precisione dell&#8217;algoritmo di riconoscimento dei brani, se una radio ha difformità tra i tracciati cartacei e il flusso, ad esempio nella reportistica siae.</p>
<p>Ho effettuato un controllo a tappeto della web radio che ascolto più spesso (radio mela) e della radio in fm in cui ho lavorato più recentemente (dabliuradio)</p>
<p>In entrambi i casi i risultati sono stati soddisfacenti ma non perfetti. Spesso la mia memoria ha vinto su tunatic, ma altrettanto spesso è accaduto il contrario.</li><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/12/28/parsing-audio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Studio di un mixer</title>
		<link>http://www.fabriziomondo.com/blog/2009/10/02/studio-di-un-mixer/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/10/02/studio-di-un-mixer/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 10:37:22 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[mixer]]></category>
		<category><![CDATA[Yamaha]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=493</guid>
		<description><![CDATA[Settantaquattresimo articolo dedicato alle web radio Continuiamo il nostro excursus attraverso l&#8217;hardware necessario per strutturare degnamente una web radio, argomento di questo articolo sono i mixer. Un mixer è un apparecchiatura che di base effettua una miscelazione, ovvero una emissione contemporanea di due o più strumenti musicali (intesi in senso lato, teoricamente qualsiasi attrezzo che [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><strong>Settantaquattresimo</strong> articolo dedicato alle web radio</p>
<p>Continuiamo il nostro excursus attraverso l&#8217;hardware necessario per strutturare degnamente una web radio, argomento di questo articolo sono i <a href="http://it.wikipedia.org/wiki/Mixer">mixer</a>.</p>
<p>Un mixer è un apparecchiatura che di base effettua una miscelazione, ovvero una emissione contemporanea di due o più strumenti musicali (intesi in senso lato, teoricamente qualsiasi attrezzo che sia in grado di generare onde sonore).</p>
<p>Tale strumento, fondamentale per una radio che effettui interventi vocali o strumentali live, è rappresentabile in questa immagine:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/schemamixer.JPG" alt="Schema mixer" width="361" height="143" /></p>
<p>Le sorgenti etichettate con S, possono essere rappresentative di tutto, dai microfoni, a strumenti musicali qualsiasi, come precedentemente detto. L&#8217;anello di congiunzione tra le sorgenti e il mixer stesso è detto connettore, e <a href="http://www.fabriziomondo.com/blog/2009/07/29/hardware-i-connettori/">ne abbiamo già parlato</a>.</p>
<p>Tra i tre connettori di cui abbiamo parlato è sempre meglio optare per <a href="http://it.wikipedia.org/wiki/Connettore_XLR">XLR </a>in quanto bilanciato, ma il bilanciamento non è esattamente argomento di questo articolo, e la sua trattazione è rinviata ai commenti, o ad un altro articolo.</p>
<p>Approfondiamo allora il processo di percorso di un segnale (che in generale è una qualsiasi funzione dipendente dal tempo) all&#8217;interno di un mixer, e per farlo, approfitto a piene mani di <a href="http://it.yamaha.com/">chi ne sa qualcosina meglio di me, in fatto di mixer e attrezzature audio</a>.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/schema_mixer2.JPG" alt="Schema mixer" width="392" height="256" /></p>
<p>Tra gli stadi di ingresso abbiamo:</p>
<p>Il primo stadio, chiamato (1) in figura, è un <a href="http://it.wikipedia.org/wiki/Amplificatore_operazionale">amplificatore operazionale </a>e rappresenta il primo stato in assoluto di qualsiasi mixer, generalmente il primo con guadagno o amplificazione significativi.</p>
<p>Il secondo stadio, chiamato (2) in figura, è un <a href="http://it.wikipedia.org/wiki/Equalizzazione">equalizzatore </a>e per questo si rimanda alla pagina di wikipedia apposita, io posso anticiparvi che è principalmente uno strumento che consente di incrementare o decrementare l&#8217;ampiezza di componenti in frequenza desiderata di un segnale.</p>
<p>Il terzo stadio, chiamato (3) in figura, è un <a href="http://it.wikipedia.org/wiki/Cross-fader">fader</a>, collegato ad un <a href="http://it.wikipedia.org/wiki/LED">LED</a> picco di canale, rappresentanti uno dei migliori strumenti per il controllo di guadagno di un canale.</p>
<p>Tra gli stadi della sezione master abbiamo:</p>
<p>Il primo stadio, chiamato (4) in figura, è il mixaggio vero e proprio, composto da un sommatore di segnale, che mixa, appunto, tutti i segnali dei vari canali, qualunque cosa essi rappresentino.</p>
<p>Il secondo stadio, chiamato (5) in figura, è invece un altro fader, chiamato fader master, antecedente l&#8217;output del mixer.</p>
<p>Per tutto quello che riguarda l&#8217;ottimizzazione dell&#8217;audio e il miglioramento dell&#8217;output del mixer, consiglio la lettura del manuale da cui questo articolo è nato, ovvero <a href="http://www.fabriziomondo.com/storatge/74/mg16_6fx_it.pdf">questo</a>.</p>
<p>Continuiamo invece trattando un caso specifico, ovvero vediamo cosa sono i vari componenti e le varie parti di un mixer, il mixer <a href="http://www.yamahaproaudio.com/products/mixers/mg16_12/index.html">MG16/6FX</a>.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/100_0408.JPG" alt="" width="492" height="369" /></p>
<p>Esaminiamolo parte per parte:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/canale2.JPG" alt="" /></p>
<p>La prima manopola rappresenta il cosiddetto <a href="http://it.wikipedia.org/wiki/Guadagno_(elettronica)">GAIN</a>, o guadagno e regola il livello del segnale di ingresso.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/gain.JPG" alt="" /></p>
<p>Il rilevatore PEAK si accende quando il livello del segnale sale fino ad essere 3dB inferiore al livello di saturazione del segnale. E&#8217; un potenziale campanello d&#8217;allarme.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/peak.JPG" alt="" width="78" height="34" /></p>
<p>Il pulsante 80 attiva il <a href="http://it.wikipedia.org/wiki/Filtro_passa_alto">filtro passa alto </a>con <a href="http://it.wikipedia.org/wiki/Frequenza_di_taglio">frequenza di taglio </a>pari ad 80 <a href="http://it.wikipedia.org/wiki/Hertz">hertz</a>.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/80.JPG" alt="" width="54" height="62" /></p>
<p>Questa fila di manopole rappresenta invece l&#8217;equalizzatore. Consentono di regolare l&#8217;ampiezza della porzione di frequenze interessate dalla manopola. Sono divise in alti (frequenza base 10 Khz), medi (frequenza base regolabile da 250 a 5000 Hz) e bassi (sotto i 250 Hz).</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/equalizer.JPG" alt="" /></p>
<p>Le due manopole AUX regolano il segnale che viene inviato ai canali ausiliari. Il tasto PRE permette di scegliere se inviare al canale ausiliare 2 il segnale in pre o post fading.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/Auxiliar.JPG" alt="" /></p>
<p>La manopola EFFECT regola il livello del segnale inviato al bus effetti.</p>
<p>La manopola PAN|PAN/BAL|BAL regola il posizionamento del canale sui canali gruppo o bilancia il segnale nel caso in cui ci si occupasse di un ingresso stereo in un canale stereo.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/effects.JPG" alt="" /></p>
<p>Abilita il canale al missaggio.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/st.JPG" alt="" /></p>
<p>Il PreFader Listen button serve ad abilitare il monitoraggio (effettuato tramite output ai jack phones e c-r out). Il segnale viene trasmesso pre-fading.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/pfl.JPG" alt="" /></p>
<p>I pulsantini 1-2 e 3-4 abilitano il canale alla trasmissione ai bus group corrispondenti, che avviene <strong>A PRESCINDERE</strong> dallo stato del tasto ST.<br />
Il fader invece serve per regolare il livello generale di segnale del canale.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://www.fabriziomondo.com/storage/74/fader.JPG" alt="" /></p>
<p><center><strong>&#8230;In costruzione&#8230;</strong></center></p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/10/02/studio-di-un-mixer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8230;Ricapitoliamo&#8230;</title>
		<link>http://www.fabriziomondo.com/blog/2009/09/27/ricapitoliamo/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/09/27/ricapitoliamo/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 12:58:20 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Web TV]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[codec]]></category>
		<category><![CDATA[embedding]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Grafico]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[mixer]]></category>
		<category><![CDATA[Streaming]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=488</guid>
		<description><![CDATA[Settantatreesimo articolo dedicato alle web radio, quarto articolo dedicato alle web tv. Questo è un articolo che ricapitola un pò tutto quello che abbiamo fatto, per mezzo di un immagine. Sono graditi consigli su argomenti da trattare, inerenti comunque il campo dello streaming. Visto che vorrei fosse argomento della mia tesi di laurea, qualche aiuto, [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Settantatreesimo articolo dedicato alle web radio, quarto articolo dedicato alle web tv.</p>
<p>Questo è un articolo che ricapitola un pò tutto quello che abbiamo fatto, per mezzo di un immagine. Sono graditi consigli su argomenti da trattare, inerenti comunque il campo dello streaming. Visto che vorrei fosse argomento della mia tesi di laurea, qualche aiuto, non fa certo male&#8230;</p>
<p><a href="http://www.fabriziomondo.com/storage/73/grafico.jpg"><img class="alignleft" src="http://www.fabriziomondo.com/storage/73/grafico.jpg" alt="Grafico argomenti" width="436" height="280" /></a></p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/09/27/ricapitoliamo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hardware &#8211; I connettori</title>
		<link>http://www.fabriziomondo.com/blog/2009/07/29/hardware-i-connettori/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/07/29/hardware-i-connettori/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 12:07:51 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[connettori]]></category>
		<category><![CDATA[informatica]]></category>
		<category><![CDATA[Jack]]></category>
		<category><![CDATA[mixer]]></category>
		<category><![CDATA[Radio]]></category>
		<category><![CDATA[RCA]]></category>
		<category><![CDATA[Streaming]]></category>
		<category><![CDATA[XLR]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=448</guid>
		<description><![CDATA[Settantaduesimo articolo dedicato alle web radio Una delle tantissime critiche che gli amici che mi seguono nella creazione dei miei articoli mi fanno, è quella di dedicarmi ed essermi dedicato pochissimo all&#8217;hardware. Nel cercare di colmare questa lacuna, cominciamo parlando della cosidetta &#8220;cavetteria&#8221; ossia i connettori. I connettori più usati in ambito audio, e che [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Settantaduesimo articolo dedicato alle web radio</p>
<p>Una delle tantissime critiche che gli amici che mi seguono nella creazione dei miei articoli mi fanno, è quella di dedicarmi ed essermi dedicato pochissimo all&#8217;hardware.</p>
<p>Nel cercare di colmare questa lacuna, cominciamo parlando della cosidetta &#8220;cavetteria&#8221; ossia i connettori.</p>
<p>I connettori più usati in ambito audio, e che troviamo praticamente sempre in qualsiasi web radio più complessa di un semplice winamp + dsp + server shoutcast, sono questi:</p>
<ul>
<li>Connettore RCA</li>
<li>Connettore JACK</li>
<li>Connetore XLR</li>
</ul>
<p><img class="alignleft" src="http://www.zpluscable.com/images/products/stereo-rca-end.jpg" alt="RCA" width="104" height="76" />Il <strong>connettore RCA</strong> è uno dei connettori più usati per audio semiprofessionale. Il connettore RCA è mono, viene cablato su cavo coassiale e può trasportare un solo canale alla volta.</p>
<p>Nel caso più comune, il cavo è di tipo maschio/maschio, con una spina a ogni estremità. Un eventuale cavo di prolunga è di tipo maschio/femmina, con presa volante su un&#8217;estremità del cavo.</p>
<p>Il connettore è composto da una protuberanza centrale (maschio) o da un foro (femmina), circondati da un anello, separati da un isolante di plastica o ceramica. Il bloccaggio della connessione non è meccanico, ma avviene a pressione, sfruttando la piccola differenza di diametro dell&#8217;anello esterno.</p>
<p>Da notare che, a differenza di connettori professionali come il tipo XLR, il polo centrale viene in contatto con l&#8217;altro connettore prima della massa, per cui accade spesso che durante la connessione si verifichino ronzii o soffi se questa avviene ad apparecchiature accese.<br />
Connettori audio RCA.</p>
<p>Nel cablaggio di apparati audio, questo connettore si trova frequentemente in configurazioni a Jack-Doppio RCA, che permette di collegare un lettore <acronym title="Compact Disc">CD</acronym> o un PC ad un Mixer; in questo caso i connettori RCA sono colorati in modo diverso, per distinguere il canale destro dal sinistro, il destro è solitamente rosso, mentre il sinistro può essere sia bianco che nero.</p>
<p>(Fonte: Wikipedia)</p>
<p><img class="alignleft" src="http://www.smap.it/files/audioproject_Files/Foto/3737_37212.JPG" alt="JACK" width="108" height="95" /><br />
Il connettore <strong>jack </strong>è senza alcun dubbio il connettore più usato per la connettività delle piccole apparecchiature audio. Si distinguono abitualmente tre tipi di connettori jack secondo il diametro :</p>
<p>* Jack 2.5 mm: il più piccolo jack,<br />
* Jack 3.5 mm: il jack classico, corrispondente alla presa cuffia,<br />
* Jack 6.35 mm: il jack usato per la sonorizzazione semi-professionale per collegare gli altoparlanti, gli amplificatori o i microfoni.</p>
<p>Ognuno di questi jack si declina in due versioni :</p>
<p>* jack mono, per le trasmissioni di un suono monofonico. Questo tipo di jack possiede due contatti : una referenza, sul corpo della fiche, e il segnale sulla punta.<br />
* jack stereo, per la trasmissione di un suono stereofonico. Questo tipo di jack possiede tre contatti, cioè gli stessi contatti che il connettore jack nonché un anello supplementare che permette la trasmissione di un altro canale audio.</p>
<p>Questo connettore dispone di tre contatti e quindi può realizzare connessioni audio sbilanciate con 2 canali (sinistro e destro) e connessioni audio bilanciate ad 1 canale.</p>
<p>Il connettore JACK offre un buon contatto elettrico, una buona resistenza meccanica e una pessima resistenza alla trazione.</p>
<p>(Fonti: Dreamvideo, kioskea)</p>
<p><img class="alignleft" src="http://upload.wikimedia.org/wikipedia/commons/1/15/Xlr-connectors.jpg" alt="XLR" width="166" height="98" />Il connettore <strong>XLR</strong> fu prodotto per la prima volta negli Stati Uniti dalla Cannon Electric, la sigla XLR deriva dal nome originale Cannon X , a cui furono aggiunte prima un blocco (Latch) di sicurezza, e poi un isolante di gomma (Rubber) attorno ai poli. La sigla XLR è a volte interpretata come &#8220;eXtra Long Run&#8221;. Un connettore XLR può avere diversi schemi di piedinatura, i tipi più comuni sono a tre, quattro e cinque poli.</p>
<p>Nella sua versione a tre poli, il connettore XLR viene usato normalmente per la terminazione di linee audio bilanciate, ma spesso viene usato anche per segnali sbilanciati creando un corto circuito tra il polo di massa e quello freddo. È praticamente l&#8217;unico tipo di connettore impiegato per il collegamento di microfoni, mentre per i segnali a livello di linea è più comunemente usato il jack stereo.</p>
<p>Bisogna fare attenzione alle apparecchiature che usano il polo 3 come caldo, perché può capitare facilmente di invertire la polarità del segnale audio.</p>
<p>Sempre la versione tripolare viene usata per le connessioni audio di tipo digitale: in questo caso il sistema di modulazione usato non pone problemi nel caso di connessioni in controfase.</p>
<p>(Fonte: Wikipedia)</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/07/29/hardware-i-connettori/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Modalità di fault tolerance, studio di Pira CZ Silence Detector</title>
		<link>http://www.fabriziomondo.com/blog/2009/06/28/modalita-di-fault-tolerance-studio-di-pira-cz-silence-detector/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/06/28/modalita-di-fault-tolerance-studio-di-pira-cz-silence-detector/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 12:20:30 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[automazione radiofonica]]></category>
		<category><![CDATA[Silence Detector]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=401</guid>
		<description><![CDATA[Settantunesimo articolo dedicato alle web radio. Uno dei problemi più comuni nella creazione di stazioni web radiofoniche ma anche che trasmettono in modulazione di frequenza, è la cosidetta fault tolerance. La tolleranza ai guasti è un parametro che permette di quantificare in modo molto preciso la professionalità di una radio, in quanto permette di capire [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><strong>Settantunesimo </strong>articolo dedicato alle web radio.</p>
<p>Uno dei problemi più comuni nella creazione di stazioni web radiofoniche ma anche che trasmettono in modulazione di frequenza, è la cosidetta <em>fault tolerance</em>.</p>
<p>La tolleranza ai guasti è un parametro che permette di quantificare in modo molto preciso la professionalità di una radio, in quanto permette di capire quanto il servizio è affidabile, nelle ventiquattro ore della giornata.</p>
<p>Esaminiamo uno schema possibile di web radio, in cui il controllo è dato ad una regia e che lavora con UN SINGOLO computer, partendo dalla periferia e arrivando al centro.</p>
<p><img src="http://www.fabriziomondo.com/storage/71/radio.JPG"></p>
<p>A sinistra troveremo le apprecchiature di INPUT, che sono microfoni e lettori.</p>
<p>Nel caso in cui essi si guastassero, è sufficiente la loro riparazione o, ancora meglio, la loro sostituzione, e cosi per tutte le periferiche di input.</p>
<p>A destra troviamo le periferiche di OUTPUT audio, ovvero l&#8217;amplificatore per cuffia e le cuffie. Anche in questo caso, nel caso in cui si guastasse qualcosa è sufficiente la sua sostituzione, perchè tutti componenti NON VITALI per la trasmissione, e che possono essere cambiati anche a run time e piuttosto facilmente.</p>
<p>I problemi più seri, si verificano in altri casi, ovvero quando si hanno:</p>
<p>1) Problemi hardware al computer di regia<br />
2) Problemi software al computer di regia<br />
3) Problemi di connettività<br />
4) Problemi di corrente elettrica<br />
5) Problemi generici ai server esterni</p>
<p>Cominciamo considerando i vari punti, concentrandoci in questo momento però più sul secondo.</p>
<li>Problemi hardware:</li>
<p>I problemi hardware possono succedere in qualsiasi momento e hanno cause più varie. Possono coinvolgere schede madri, ram, alimentatori e quanto altro e possono essere dannosi. Sicuramente un guasto hardware non può essere curato se non tramite la sostituzione del o dei componenti danneggiati, ma nella maggior parte dei casi questo comporta un interruzione del servizio, dovuto appunto allo spegnimento del pc.</p>
<p>In tal caso si deve procedere al <strong>MIRRORING</strong>.</p>
<p>E&#8217; necessario un computer che funzioni in situazioni di emergenza, che possa trasmettere quando il pc PRINCIPALE è fuori uso. Purtroppo la disconnessione avviene necessariamente, ma è chiaramente più breve se si ha un immediato intervento umano. Del resto, è molto semplice modificare la sorgente di un server di streaming esterno, in modo che l&#8217;interruzione sia limitata nel tempo, senza per questo dovere cambiare NESSUN dato sul sito internet.</p>
<p>Il mirroring dovrebbe essere praticamente totale, sia nei files che nella regia, che dovrebbe essere la stessa chiaramente del computer principale.</p>
<p>Un modo per evitare totalmente la disconnessione è quello di cambiare l&#8217;impostazione generale e fare veicolare tutto l&#8217;audio non più dal computer di regia, ma dal mixer, che poi invierà il flusso audio ad uno (o ad N) computer che si occuperanno della messa in onda, ma questo è argomento di un secondo articolo.</p>
<p>I problemi software possono essere circoscritti a problemi d&#8217;applicazione, nel caso in cui l&#8217;applicazione della regia si blocca, spesso si finisce di trasmettere, stoppando anche il suono. Il silenzio si può verificare a maggior ragione in controllo mixer, anzi, è ancora più utile effettuare tale tipo di controllo, in quanto in quel caso, potrebbe anche capitare che qualche regista dimentichi abbassati i volumi del canale dedicato alla regia.</p>
<p>Ragion per cui, studieremo adesso un programma, chiamato <strong><a href="www.pira.cz/eng/silence.htm">Pira CZ Silence Detector</a> </strong>che svolge proprio la funzione di fare notare quando c&#8217;è un pò troppo silenzio.</p>
<p>Scarichiamo il programma da qui: <a href="http://www.pira.cz/eng/piraside.zip">http://www.pira.cz/eng/piraside.zip</a> e scompattiamolo in una qualsiasi cartella del vostro pc. Trovermo alcuni files, tra cui un file htm contenente la guida in linea e l&#8217;applicazione, piraside.exe</p>
<p>Apriamola, ci comparirà questa schermata:</p>
<p><img src="http://www.fabriziomondo.com/storage/71/pira1.JPG"></p>
<p>Tale schermata ha un level meter a sinistra e dei pulsanti a destra.</p>
<p>Il level meter misura il livello audio, e questo era abbastanza scontato. Vediamo a cosa servono i pulsanti a destra partendo da mixer.</p>
<p>Mixer visualizza il controllo registrazione della vostra scheda audio, dove potrete settare quale sia la periferica del quale input è importante valutare la presenza costante.</p>
<p>Setup invece fa apparire una finestra con delle impostazioni settabili. Il primo tab è Alarm Activation che consente di settare le condizioni per il quale dovrebbero scattare gli allarmi.</p>
<p><img src="http://www.fabriziomondo.com/storage/71/setup1.JPG"></p>
<p>L&#8217;allarme può scattare se ci sono N secondi di silenzio (settabili) nel canale sinistro, destro, entrambi, o uno dei due. Tale vincolo è settabile, ma non rimovibile. In più, si può aggiungere un controllo sull&#8217;orario (dentro o fuori un settabile intervallo) e/o sul giorno.</p>
<p>Inoltre, è possibile fare un controllo opzionale sulla presenza o non presenza di un particolare applicativo aperto. Per fare ciò clicchiamo sul tasto FIND (dopo avere spuntato il flag a sinistra)</p>
<p>e comparirà la seguente schermata:</p>
<p><img src="http://www.fabriziomondo.com/storage/71/wind1.JPG"></p>
<p>da qui potremo scegliere la finestra sulla quale ci interessa lavorare.</p>
<p>In basso troviamo invece impostazioni per riportare tutto per com&#8217;era. Le due impostazioni settabili sono il numero di secondi sufficienti a fare staccare l&#8217;allarme e se bloccare o meno la coda di esecuzione tasks in caso di ricomparsa del suono, chiaramente, la scelta è libera.</p>
<p>Passiamo adesso ad ALARM TASKS:</p>
<p><img src="http://www.fabriziomondo.com/storage/71/setup2.JPG"></p>
<p>Questo tab rappresenta l&#8217;elenco delle attività che dovrà svolgere il programma (in esatta sequenza) una volta che si è verificata una condizione di allarme.</p>
<p>Le attività possibili sono:</p>
<p><em>*Send Email</em>: consente di inviare una mail ad un indirizzo qualsiasi a patto di avere i dati di accesso smtp. Consente di inviare anche un file in allegato.</p>
<p><em>*Save Screenshot</em>: Salva un immagine ritraente il desktop e può anche allegarla ad una mail, inoltre può disattivare lo screen saver</p>
<p><em>*Open/play 1</em>: Tre campi per potere avviare un programma in condizioni d&#8217;allarme, sono settabili anche i parametri.</p>
<p><em>*Open/play 2</em>: Altri tre campi per potere avviare un programma in condizioni d&#8217;allarme, sono settabili anche i parametri.</p>
<p><em>*Reboot system:</em> consente di spegnere o riavviare il pc</p>
<p><em>*Kill application:</em> E&#8217; possibile killare una qualsiasi applicazione, compreso il silence detector stesso.</p>
<p><em>*Switch port pin:</em> E&#8217; possibile switchare il pin di una porta com, da negativo a positivo per un numero di secondi o il piu a lungo possibile.</p>
<p><em>*Delay:</em> Applica un ritardo alle operazioni</p>
<p><em>*Send <acronym title="HyperText Transfer Protocol">HTTP</acronym> query: </em>Invia una query http ad un sito internet</p>
<p><em>*Speak: </em>Fa dire una frase ad un bot.</p>
<p>Una volta decise le attività che il programam deve eseguire, basta cliccare su ADD su UP, DOWN e DELETE, per ordinare una coda.</p>
<p>Nel Tab RETURN TASKS il procedimento è molto simile, semplicemente questa coda gestirà gli eventi da eseguire una volta che tutto sarà ritornato alla normalità.</p>
<p><img src="http://www.fabriziomondo.com/storage/71/setup3.JPG"></p>
<p>Le operazioni fattibili sono un sottoinsieme di quelle del tab precedente.</p>
<p>L&#8217;ultimo tab riguarda impostazioni generali, si può settare la priorità dell&#8217;applicazione, la possibilità di bloccare il level meter (che permette di settare il punto minimo di allarme, la cosidetta soglia), scegliere se usare i font di sistema, usare filtri, loggare gli eventi e utilizzare o meno un programma interno al silence detector per suonare mp3.</p>
<p><img src="http://www.fabriziomondo.com/storage/71/setup4.JPG"></p>
<p>Si può infine anche settare la periferica di acquisizione dell&#8217;audio, rinominare il programma e i canali e scegliere le modalità di start-up del programma stesso.</p>
<p>Gli altri tipi di problemi possibili per una stazione web radiofonica, sono risolvibili in altro modo.</p>
<p>Gli scatti di tensione elettrica e di connettività si risolvono utilizzando un gruppo di continuità e una connessione a banda garantita, che ha come caratteristica quella della continuità del servizio.</p>
<p>I server di streaming vanno gestiti tramite le interfacce web dei cosidetti applicativi di cast control, ai quali presto dedicherò un articolo.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/06/28/modalita-di-fault-tolerance-studio-di-pira-cz-silence-detector/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Come inserire un player per la vostra Web Radio su Facebook</title>
		<link>http://www.fabriziomondo.com/blog/2009/04/26/come-inserire-un-player-per-la-vostra-web-radio-su-facebook/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/04/26/come-inserire-un-player-per-la-vostra-web-radio-su-facebook/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 15:16:23 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Berlusconi]]></category>
		<category><![CDATA[brambilla]]></category>
		<category><![CDATA[confcommercio]]></category>
		<category><![CDATA[crescita]]></category>
		<category><![CDATA[destra]]></category>
		<category><![CDATA[economica]]></category>
		<category><![CDATA[economico]]></category>
		<category><![CDATA[giovani]]></category>
		<category><![CDATA[hard]]></category>
		<category><![CDATA[imprenditori]]></category>
		<category><![CDATA[interesse]]></category>
		<category><![CDATA[italia]]></category>
		<category><![CDATA[michela]]></category>
		<category><![CDATA[ministro]]></category>
		<category><![CDATA[nazionale]]></category>
		<category><![CDATA[nazionali]]></category>
		<category><![CDATA[politiche]]></category>
		<category><![CDATA[presidente]]></category>
		<category><![CDATA[prostitute]]></category>
		<category><![CDATA[puttane]]></category>
		<category><![CDATA[sesso]]></category>
		<category><![CDATA[silvio]]></category>
		<category><![CDATA[sviluppo]]></category>
		<category><![CDATA[turismo]]></category>
		<category><![CDATA[turistiche]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vittoria]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=381</guid>
		<description><![CDATA[Settantesimo articolo dedicato alle web radio Uno dei fenomeni che in Italia ha preso maggiormente piede, si chiama Facebook. Non c&#8217;è bisogno che sia io a dirvi cosa sia e cosa rappresenti, anche se una minima discussione me la permetterete. Facebook è un social network creato da Mark Zuckerberg, che presto è diventato il social [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft" src="http://www.mediabistro.com/fishbowlLA/original/facebook.gif" alt="" width="230" height="109" align="left" /></p>
<p><strong>Settantesimo </strong>articolo dedicato alle web radio</p>
<p>Uno dei fenomeni che in Italia ha preso maggiormente piede, si chiama <a href="http://it.facebook.com">Facebook</a>. Non c&#8217;è bisogno che sia io a dirvi cosa sia e cosa rappresenti, anche se una minima discussione me la permetterete.</p>
<p>Facebook è un social network creato da Mark Zuckerberg, che presto è diventato il social network per eccellenza, con iscritti nell&#8217;ordine dei milioni. Facebook consente di contattare amici e parenti che magari non si sentivano da molto tempo e crearsi una rete più o meno virtuale di rapporti, di gruppi accomunati da interessi comuni e manie condivise.</p>
<p>Tecnicamente, ogni utente di facebook ha una sua pagina divisa in tab. I principali sono <strong>info </strong>e <strong>bacheca</strong>.</p>
<p>Nel tab info compaiono le informazioni personali del contatto, che possono essere, a scelta, più o meno complete. Nel tab bacheca compaiono pensieri, attività, foto e movimenti del profilo dell&#8217;usuario, mentre, a lato, compaiono i widget.</p>
<p>I widget sono delle parti, delle porzioni modulari di facebook, che possono essere inserite e tolte a scelta. E&#8217; proprio l&#8217;inserimento di un widget in bacheca, l&#8217;oggetto del settantesimo articolo.</p>
<p>Facciamo login su facebook e dirigiamoci verso la nostra bacheca.</p>
<p>Cerchiamo, tramite il campo ricerca che si trova in alto a destra, l&#8217;applicazione <em>MP3 PLAYER</em>.</p>
<p>Compariranno una serie di opzioni, noi sceglieremo la prima, l&#8217;applicazione che ha nel logo, un cane.</p>
<p><a href="http://www.fabriziomondo.com/storage/facebook/FB01.JPG"><img src="http://www.fabriziomondo.com/storage/facebook/FB01.JPG" alt="Immagine 1" /></a></p>
<p>Per sceglierla, è sufficiente cliccare su <strong>MOSTRA APPLICAZIONE</strong>.</p>
<p>Siamo arrivati alla schermata di presentazione dell&#8217;applicazione. Clicchiamo su <strong>VAI ALL&#8217;APPLICAZIONE</strong> e potremo così operare concretamente sulle configurazioni del player, affinché ci possa permettere di ascoltare la nostra radiolina.</p>
<p>Consentiamo l&#8217;accesso ai nostri dati e procediamo.</p>
<p>La prima schermata che comparirà sarà una schermata con 4 opzioni:</p>
<p>Choice 1:<br />
Single-Song Player (Upload)<br />
<strong>Choice 2:<br />
Single-Song Player (Link)</strong><br />
Choice 3:<br />
Multiple-Songs Player (Link)<br />
Choice 4:<br />
Single-Songs Multiple-Players (Link)</p>
<p>Il player può fare molto, streammare canzoni, uploadarne limitatamente altre e, che poi è il nostro campo di interesse, fare ascoltare web radio, o meglio, detto tecnicamente, shoutcast&#8217;s streams.</p>
<p>Scegliamo di conseguenza la <strong>SECONDA </strong>opzione e andiamo avanti con submit.</p>
<p>A questo punto comparirà quest&#8217;altra schermata:</p>
<p><a href="http://www.fabriziomondo.com/storage/facebook/FB02.JPG"><img src="http://www.fabriziomondo.com/storage/facebook/FB02.JPG" alt="Immagine 2" /></a></p>
<p>In Url inseriamo l&#8217;indirizzo della nostra web radio in questa forma:</p>
<p><strong>http://ipserver:porta/;stream.nsv</strong></p>
<p>Si utilizza il link fittizio ;stream.nsv anche se <strong>NON </strong>si tratta ovviamente di un flusso Nullsoft Shoutcast Video. <em><strong>Ricordatevelo bene</strong></em>.</p>
<p>Settate anche Artist e Title come meglio preferite. Una volta fatto tutto questo, cliccate su <strong>UPDATE YOUR PROFILE</strong> e vi troverete con il player in bacheca.</p>
<p>Qualora il player non si trovasse in bacheca, potete controllare se non sia finito nei <strong>RIQUADRI</strong>, in quanto potete scegliere di piazzarlo in entrambi i posti.</p>
<p>Sarà sufficiente a questo punto, cliccare sul tasto play per fare partire il flusso, che <strong>NON </strong>può partire in automatico e che si interrompe ogni volta che si cambia pagina su facebook.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/04/26/come-inserire-un-player-per-la-vostra-web-radio-su-facebook/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Shoutcast.class.php – Creiamo una pagina demo</title>
		<link>http://www.fabriziomondo.com/blog/2009/02/24/shoutcastclassphp-creiamo-una-pagina-demo/</link>
		<comments>http://www.fabriziomondo.com/blog/2009/02/24/shoutcastclassphp-creiamo-una-pagina-demo/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 23:48:54 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Berlusconi]]></category>
		<category><![CDATA[brambilla]]></category>
		<category><![CDATA[confcommercio]]></category>
		<category><![CDATA[crescita]]></category>
		<category><![CDATA[destra]]></category>
		<category><![CDATA[economica]]></category>
		<category><![CDATA[economico]]></category>
		<category><![CDATA[giovani]]></category>
		<category><![CDATA[hard]]></category>
		<category><![CDATA[imprenditori]]></category>
		<category><![CDATA[interesse]]></category>
		<category><![CDATA[italia]]></category>
		<category><![CDATA[michela]]></category>
		<category><![CDATA[ministro]]></category>
		<category><![CDATA[nazionale]]></category>
		<category><![CDATA[nazionali]]></category>
		<category><![CDATA[politiche]]></category>
		<category><![CDATA[presidente]]></category>
		<category><![CDATA[prostitute]]></category>
		<category><![CDATA[puttane]]></category>
		<category><![CDATA[radio internet]]></category>
		<category><![CDATA[sesso]]></category>
		<category><![CDATA[silvio]]></category>
		<category><![CDATA[sviluppo]]></category>
		<category><![CDATA[turismo]]></category>
		<category><![CDATA[turistiche]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vittoria]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=307</guid>
		<description><![CDATA[Sessantanovesimo articolo dedicato alle web radio. Ci eravamo lasciati con una panoramica delle funzioni della classe shoutcast. Adesso andiamo a vedere con maggiore precisione come realizzare una pagina php che utilizzi tale classe. Esaminiamo il file demo.php, a corredo con il pacchetto shoutcast che stiamo utilizzando e che abbiamo trovato al sito phpclasses.org Il file [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft" src="http://www.pfmb.uni-mb.si/old/didgradiva/2005/uc_php/images/php-logo.gif" alt="Php logo" width="108" height="57" /></p>
<p>Sessantanovesimo articolo dedicato alle web radio.</p>
<p><a href="http://www.fabriziomondo.com/blog/2008/10/17/classshoutcastphp-un-mezzo-per-monitorare-la-vostra-web-radio-su-un-sito-internet-dinamico/">Ci eravamo lasciati con una panoramica delle funzioni della classe shoutcast</a>. Adesso andiamo a vedere con maggiore precisione come realizzare una pagina php che utilizzi tale classe.</p>
<p>Esaminiamo il file demo.php, a corredo con il pacchetto shoutcast che stiamo utilizzando e che abbiamo trovato al sito phpclasses.org</p>
<p>Il file comincia naturalmente in questo modo:</p>
<p><em>include(&#8220;shoutcast.class.php&#8221;);</em></p>
<p>Questi comandi aprono una pagina php e includono all&#8217;interno il file shoutcast.class.php.</p>
<p>Esaminiamo adesso la funzione convertseconds, e vediamo cosa fa:</p>
<p><em>function ConvertSeconds($seconds) {<br />
$tmpseconds = substr(&#8220;00&#8243;.$seconds % 60, -2);<br />
if ($seconds &gt; 59) {<br />
if ($seconds &gt; 3599) {<br />
$tmphours = substr(&#8220;0&#8243;.intval($seconds / 3600), -2);<br />
$tmpminutes = substr(&#8220;0&#8243;.intval($seconds / 60 &#8211; (60 * $tmphours)), -2);</em></p>
<p><em>return ($tmphours.&#8221;:&#8221;.$tmpminutes.&#8221;:&#8221;.$tmpseconds);<br />
} else {<br />
return (&#8220;00:&#8221;.substr(&#8220;0&#8243;.intval($seconds / 60), -2).&#8221;:&#8221;.$tmpseconds);<br />
}<br />
} else {<br />
return (&#8220;00:00:&#8221;.$tmpseconds);<br />
}<br />
}<br />
</em></p>
<p>La funzione ConvertSeconds accetta la variabile seconds come unico parametro.</p>
<p>Pone in un altra variabile, chiamata $tmpseconds, una stringa composta da due zeri iniziali e il modulo 60 dei secondi contati dalla variabile seconds, rimuovendo le ultime due cifre (che sono probabilmente i centesimi di secondo).</p>
<p>Se $seconds é maggiore di 59, e contemporaneamente anche maggiore di 3599, allora va settata una variabile $tmphours che conterrá una stringa con il numero di ore calcolate a partire dai secondi e una variabile $tmpminutes, che conterrá una stringa con il numero dei minuti.</p>
<p>Se $seconds é solo maggiore di 59, allora il procedimento per le ore non é piú necessario e quindi si effettua solo il calcolo dei minuti.</p>
<p>Se $seconds non é magiore di 59, si riporta il numero di secondi esattamente come sono.</p>
<p>Passiamo adesso alle dichiarazioni:</p>
<p><em>$shoutcast = new ShoutCast();<br />
$shoutcast-&gt;host = &#8220;localhost&#8221;;<br />
$shoutcast-&gt;port = 8000;<br />
$shoutcast-&gt;passwd = &#8220;YOURPASSWORDGOESHERE&#8221;;</em></p>
<p>La variabile $shoutcast contiene un nuovo oggetto di tipo shoutcast (poca fantasia, ma meglio non confondere le idee).<br />
Settiamo l&#8217;host, la porta e la password del server, che chiaramente, sono dati che voi DOVETE avere a disposizione.</p>
<p>Esaminiamo adesso l&#8217;ultima funzione della pagina, la piú importante.</p>
<p>La prima operazione é quella di aprire le statistiche dell&#8217;oggetto creato, se l&#8217;apertura ha successo, recuperiamo l&#8217;xml, e quindi, andiamo a fare operazioni di echo (scrittura) dove decidiamo quando e come visualizzare le informazioni a nostra disposizione. Tutti gli echo, ma chiaramente anche gli altri comandi, sono modificabili a vostro piacimento, in base a come vorrete posizionare le informazioni nella pagina. Le variabili history e listeners sono da considerarsi come possibili array, e quindi é necessario un controllo con la funzione is_array</p>
<p><em>if ($shoutcast-&gt;openstats()) {<br />
// We got the <acronym title="eXtensible Markup Language">XML</acronym>, gogogo!..<br />
if ($shoutcast-&gt;GetStreamStatus()) {<br />
echo &#8220;<strong>&#8220;.$shoutcast-&gt;GetServerTitle().&#8221;</strong> (&#8220;.$shoutcast-&gt;GetCurrentListenersCount().&#8221; of &#8220;.$shoutcast-&gt;GetMaxListenersCount().&#8221; listeners, peak: &#8220;.$shoutcast-&gt;GetPeakListenersCount().&#8221;)\n\n&#8221;;</em></p>
<p><em>echo &#8220;&lt;table border=&#8221;0&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;\n&#8221;;<br />
echo &#8221;<br />
&lt;tbody&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;180&#8243;&gt;&lt;strong&gt;Server Genre: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetServerGenre().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;Server URL: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;a href=&#8221;\&#8221;&gt;GetServerURL().&#8221;\&#8221;&gt;&#8221;.$shoutcast-&gt;GetServerURL().&#8221;&lt;/a&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;Server Title: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetServerTitle().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan=&#8221;2&#8243;&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;</p>
<p>echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;Current Song: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetCurrentSongTitle().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;BitRate: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetBitRate().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan=&#8221;2&#8243;&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;</p>
<p>echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;Average listen time: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.ConvertSeconds($shoutcast-&gt;GetAverageListenTime()).&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan=&#8221;2&#8243;&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;</p>
<p>echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;IRC: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetIRC().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;AIM: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetAIM().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;ICQ: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetICQ().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td colspan=&#8221;2&#8243;&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;</p>
<p>echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;WebHits Count: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetWebHitsCount().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8221;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;strong&gt;StreamHits Count: &lt;/strong&gt;&lt;/td&gt;<br />
&lt;td&gt;&#8221;.$shoutcast-&gt;GetStreamHitsCount().&#8221;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
\n&#8221;;<br />
echo &#8220;&lt;/tbody&gt;&lt;/table&gt;<br />
&#8220;;</p>
<p>echo &#8220;&lt;strong&gt;Song history;&lt;/strong&gt;<br />
\n&#8221;;<br />
$history = $shoutcast-&gt;GetSongHistory();<br />
if (is_array($history)) {<br />
for ($i=0;$i echo &#8220;[".$history[$i]["playedat"].&#8221;] &#8211; &#8220;.$history[$i]["title"].&#8221;<br />
\n&#8221;;<br />
}<br />
} else {<br />
echo &#8220;No song history available..&#8221;;<br />
}<br />
echo &#8220;&#8221;;</p>
<p>echo &#8220;&lt;strong&gt;Listeners;&lt;/strong&gt;<br />
\n&#8221;;<br />
$listeners = $shoutcast-&gt;GetListeners();<br />
if (is_array($listeners)) {<br />
for ($i=0;$i echo &#8220;[".$listeners[$i]["uid"].&#8221;] &#8211; &#8220;.$listeners[$i]["hostname"].&#8221; using &#8220;.$listeners[$i]["useragent"].&#8221;, connected for &#8220;.ConvertSeconds($listeners[$i]["connecttime"]).&#8221;<br />
\n&#8221;;<br />
}<br />
} else {<br />
echo &#8220;Noone listens right now..&#8221;;<br />
}<br />
} else {<br />
echo &#8220;Server is up, but no stream available..&#8221;;<br />
}<br />
} else {<br />
// Ohhh, damnit..<br />
echo $shoutcast-&gt;geterror();<br />
}<br />
?&gt;</p>
<p><strong>Per qualsiasi dubbio, commentate.</strong></p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2009/02/24/shoutcastclassphp-creiamo-una-pagina-demo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Class.Shoutcast.php, un mezzo per monitorare la vostra web radio su un sito internet dinamico</title>
		<link>http://www.fabriziomondo.com/blog/2008/10/17/classshoutcastphp-un-mezzo-per-monitorare-la-vostra-web-radio-su-un-sito-internet-dinamico/</link>
		<comments>http://www.fabriziomondo.com/blog/2008/10/17/classshoutcastphp-un-mezzo-per-monitorare-la-vostra-web-radio-su-un-sito-internet-dinamico/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 11:20:23 +0000</pubDate>
		<dc:creator>Fabrizio Mondo</dc:creator>
				<category><![CDATA[Web Radio]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Berlusconi]]></category>
		<category><![CDATA[brambilla]]></category>
		<category><![CDATA[Classi]]></category>
		<category><![CDATA[confcommercio]]></category>
		<category><![CDATA[crescita]]></category>
		<category><![CDATA[destra]]></category>
		<category><![CDATA[economica]]></category>
		<category><![CDATA[economico]]></category>
		<category><![CDATA[giovani]]></category>
		<category><![CDATA[hard]]></category>
		<category><![CDATA[imprenditori]]></category>
		<category><![CDATA[interesse]]></category>
		<category><![CDATA[italia]]></category>
		<category><![CDATA[michela]]></category>
		<category><![CDATA[ministro]]></category>
		<category><![CDATA[nazionale]]></category>
		<category><![CDATA[nazionali]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[politiche]]></category>
		<category><![CDATA[presidente]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[prostitute]]></category>
		<category><![CDATA[puttane]]></category>
		<category><![CDATA[sesso]]></category>
		<category><![CDATA[Shoutcast]]></category>
		<category><![CDATA[silvio]]></category>
		<category><![CDATA[Streaming]]></category>
		<category><![CDATA[sviluppo]]></category>
		<category><![CDATA[turismo]]></category>
		<category><![CDATA[turistiche]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[vittoria]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.fabriziomondo.com/blog/?p=277</guid>
		<description><![CDATA[Sessantottesimo articolo dedicato alle web radio. Carissimi internauti, è passato molto tempo (e circa altri sessanta articoli&#8230;) da quando scrissi di come inserire una web radio all&#8217;interno di una pagina web statica. Tutto quello che è scritto in quell&#8217;articolo, pur essendo ormai abbastanza obsoleto in favore di flash, resta comunque valido, almeno nel principio se [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img src="http://www.pfmb.uni-mb.si/old/didgradiva/2005/uc_php/images/php-logo.gif" alt="" width="180" height="95" align="left" /><br />
Sessantottesimo articolo dedicato alle web radio.</p>
<p>Carissimi internauti, è passato molto tempo (e circa altri sessanta articoli&#8230;) da quando scrissi di <a href="http://www.fabriziomondo.com/blog/2007/01/16/inserire-su-una-pagina-web-statica-la-propria-radio/">come inserire una web radio all&#8217;interno di una pagina web statica</a>.</p>
<p>Tutto quello che è scritto in quell&#8217;articolo, pur essendo ormai abbastanza obsoleto in favore di flash, resta comunque valido, almeno nel principio se non nell&#8217;implementazione e nei codici. Possiamo inserire un player all&#8217;interno di una pagina web con un semplice active X, o con un applicazione java.</p>
<p>Quello di cui cominceremo a parlare oggi, è invece un argomento nuovo (non inteso come nuova tecnologia, ma come nuovo ambito di discussione). Studieremo delle classi <acronym title="Pre-Hypertext Processing">PHP</acronym> che ci permetteranno di manipolare il file <acronym title="eXtensible Markup Language">XML</acronym> che il server shoutcast crea, e di estrarne contenuti e informazioni, o come si suole dire, farne il parsing.<br />
<span id="more-277"></span><br />
All&#8217;interno del sito <a href="http://www.phpclasses.org">phpclasses.org</a>, troviamo un vasto parco di classi php, tra le quali, diverse dedicate proprio a shoutcast, stiamo per studiare una di queste.</p>
<p>Il file class.shoutcast.php è stato strutturato dall&#8217;autore Henrik Malmberg cn 5 variabili e 20 funzioni, visioniamole insieme.</p>
<blockquote><p>
class ShoutCast {<br />
	// Public<br />
	var $host;<br />
	var $port;<br />
	var $passwd;</p>
<p>	//Private<br />
	var $_xml;<br />
	var $_error;
</p></blockquote>
<p>Le cinque variabili sono host, port e password che corrispondono all&#8217;indirizzo ip, alla porta e alla password di utilizzo del server shoutcast, mentre _xml e _error sono delle variabili interne che visioneremo tra poco.</p>
<p><b>Funzione numero 1:</b></p>
<blockquote><p>
	function openstats()<br />
	{<br />
	 		 $fp = fsockopen($this->host, $this->port, $errno, $errstr, 10);</p>
<p>			 If (!$fp)<br />
	     	 {<br />
			  		  	$this->_error = &#8220;$errstr ($errno)&#8221;;<br />
									return(0);<br />
						}		</p>
<p>						else<br />
						{</p>
<p>								    			fputs($fp, &#8220;GET /admin.cgi?</p>
<p>pass=&#8221;.$this->passwd.&#8221;&#038;mode=viewxml <acronym title="HyperText Transfer Protocol">HTTP</acronym>/1.0\r\n&#8221;);<br />
		    									fputs($fp, &#8220;User-Agent: </p>
<p>Mozilla\r\n\r\n&#8221;);</p>
<p>								   while (!feof($fp)) {<br />
     	   		$this->_xml .= fgets($fp, 512);<br />
		    }<br />
		    fclose($fp);</p>
<p>		    if (stristr($this->_xml, &#8220;<acronym title="HyperText Transfer Protocol">HTTP</acronym>/1.0 200 OK&#8221;) == true) {<br />
		    	// <-H> Thanks to Blaster for this fix.. trim();<br />
    			$this->_xml = trim(substr($this->_xml, 42));<br />
			} else {<br />
				$this->_error = &#8220;Bad login&#8221;;<br />
				return(0);<br />
			}</p>
<p>			$xmlparser = xml_parser_create();<br />
			if (!xml_parse_into_struct($xmlparser, $this->_xml, $this->_values, $this->_indexes)) {<br />
				$this->_error = &#8220;Unparsable <acronym title="eXtensible Markup Language">XML</acronym>&#8221;;<br />
				return(0);<br />
			}</p>
<p>			xml_parser_free($xmlparser);</p>
<p>			return(1);<br />
		}<br />
	}
</p></blockquote>
<p>fsockopen inizializza una connessione nel dominio Internet (AF_INET, usando TCP o UDP) o Unix (AF_UNIX). Restituisce un puntatore a file (nel nostro caso $fp) ed ha come parametri l&#8217;hostname, la porta, un numero d&#8217;errore, una stringa d&#8217;errore e un timeout in secondi)</p>
<p>Se fp non è valido (if not $fp, indica il fallimento dell&#8217;apertura della socket) allora si inizia una procedura d&#8217;errore. </p>
<p>Tale procedura d&#8217;errore consiste semplicemente nell&#8217;inserire all&#8217;interno della variabile _error, la stringa e il numero d&#8217;errore generati dalla fsockopen. Nel caso in cui invece la socket si sia aperta correttamente, allora scriviamo tramite </p>
<p>fputs (che molti conosceranno come fwrite, ma è la stessa cosa.. si tratta in soldoni di una funzione che scriverà la stringa all&#8217;interno del flusso del file puntato da $fp), il contenuto scritto.</p>
<p>Una volta fatto questo fintantochè il file non finisce, scriviamo all&#8217;interno della variabile _xml il contenuto del file puntato da $fp, 512 byte alla volta, alchè chiudiamo il flusso del file puntato da $fp.</p>
<p>Possiamo quindi cominciare a fare dei controlli. Il primo, all&#8217;interno di questa funzione, è il controllo di login.</p>
<p>Stristr è una funzione di ricerca di una stringa all&#8217;interno di un altra, e restituisce generalmente il file dalla prima occorrenza della stringa cercata fino alla fine. In questo caso, si usa un booleano, per verificare la presenza o meno della stringa cercata.</p>
<p>Nel caso in cui la stringa sia presente, effettuiamo un taglio tramite substr dei primi 42 caratteri della stringa e alchè la depuriamo da caratteri non necessari con trim.</p>
<p>Se la stringa non è presente, restituiamo un messaggio di BAD LOGIN.</p>
<p>A questo punto possiamo creare un parser xml e piazzarlo in una sua bella variabile. Alchè, se non è possibile fare il parsing dell&#8217;xml che abbiamo dato in pasto alla funzione (la variabile _xml) restituiamo un errore di xml imparsingabile altrimenti liberiamo il parser e ritorniamo all&#8217;ovile.</p>
<p>A questo punto, abbiamo preparato il terreno alle successive operazioni.</p>
<p><b<Funzione numero 2:</b></p>
<blockquote>
<p>function GetCurrentListenersCount() {<br />
		return($this->_values[$this->_indexes["CURRENTLISTENERS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce un counter del numero degli ascoltatori attualmente presenti.</p>
<p><b>Funzione numero 3:</b></p>
<blockquote><p>|</p>
<p>function GetPeakListenersCount() {<br />
		return($this->_values[$this->_indexes["PEAKLISTENERS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>|</p>
<p>Questa funzione restituisce un counter con il picco degli ascolti sinora effettuato.</p>
<p><b>Funzione numero 4:</b></p>
<blockquote>
<p>function GetMaxListenersCount() {<br />
		return($this->_values[$this->_indexes["MAXLISTENERS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce un counter con il massimo numero degli ascoltatori attuali.</p>
<p><b>Funzione numero 5:</b></p>
<blockquote>
<p>function GetReportedListenersCount() {<br />
		return($this->_values[$this->_indexes["REPORTEDLISTENERS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il numero di ascoltatori riportati dal server shoutcast al momento.</p>
<p><b>Funzione numero 6:</b></p>
<blockquote>
<p>function GetAverageListenTime() {<br />
		return($this->_values[$this->_indexes["AVERAGETIME"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il tempo medio di ascolto del flusso streaming del server shoutcast.</p>
<p><b>Funzione numero 7:</b></p>
<blockquote><p>|</p>
<p>function GetServerGenre() {<br />
		return($this->_values[$this->_indexes["SERVERGENRE"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il genere del flusso streaming, che ricordo, è un parametro obbligatorio da settare.</p>
<p><b>Funzione numero 8:</b></p>
<blockquote>
<p>function GetServerURL() {<br />
		return($this->_values[$this->_indexes["SERVERURL"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce l&#8217;indirizzo del server shoutcast.</p>
<p><b>Funzione numero 9:</b></p>
<blockquote><p>|</p>
<p>function GetServerTitle() {<br />
		return($this->_values[$this->_indexes["SERVERTITLE"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il nome della radio.</p>
<p><b>Funzione numero 10:</b></p>
<blockquote>
<p>function GetCurrentSongTitle() {<br />
		return($this->_values[$this->_indexes["SONGTITLE"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il nome del brano correntemente in trasmissione.</p>
<p><b>Funzioni numero 11/12/13:</b></p>
<blockquote>
<p>	function GetIRC() {<br />
		return($this->_values[$this->_indexes["<acronym title="Internet Relay Chat">IRC</acronym>"][0]]["value"]);<br />
	}</p>
<p>	function GetAIM() {<br />
		return($this->_values[$this->_indexes["<acronym title="AOL Instant Messenger">AIM</acronym>"][0]]["value"]);<br />
	}</p>
<p>	function GetICQ() {<br />
		return($this->_values[$this->_indexes["ICQ"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Queste funzioni restituiscono, se ci sono chiaramente, irc, aim e icq impostati per il server.</p>
<p><b>Funzioni numero 14/15:</b></p>
<blockquote>
<p>	function GetWebHitsCount() {<br />
		return($this->_values[$this->_indexes["WEBHITS"][0]]["value"]);<br />
	}</p>
<p>	function GetStreamHitsCount() {<br />
		return($this->_values[$this->_indexes["STREAMHITS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Queste funzioni restituiscono un counter delle visite al sito in cui si trova questo codice e il numero di aperture del flusso audio complessive.</p>
<p><b>Funzione numero 16:</b></p>
<blockquote>
<p>function GetStreamStatus() {<br />
		return($this->_values[$this->_indexes["STREAMSTATUS"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce lo stato dello stream, ovvero se il server è online o meno.</p>
<p><b>Funzione numero 17:</b></p>
<blockquote>
<p>function GetBitRate() {<br />
		return($this->_values[$this->_indexes["BITRATE"][0]]["value"]);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce il bitrate della radio.</p>
<p><b>Funzione numero 18:</b></p>
<blockquote>
<p>	function GetSongHistory() {<br />
		for($i=1;$i<sizeof($this->_indexes['TITLE']);$i++) {<br />
			$arrhistory[$i-1] = array(<br />
									&#8220;playedat&#8221;=>$this->_values[$this->_indexes</p>
<p>['PLAYEDAT'][$i]]['value'],<br />
									&#8220;title&#8221;=>$this->_values[$this->_indexes['TITLE']</p>
<p>[$i]]['value']<br />
								);<br />
		}</p>
<p>		return($arrhistory);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce un array, contenente autore, titolo e altri dati delle N canzoni precedentemente trasmesse dal server shoutcast. Per fare questo, si utilizza un ciclo for che va da 1 alla lunghezza impostata dell&#8217;history e per ciascun indice si estraggono i dati necessari.</p>
<p><b>Funzione numero 19:</b></p>
<blockquote>
<p>	function GetListeners() {<br />
		for($i=0;$i<sizeof($this->_indexes['USERAGENT']);$i++) {<br />
			$arrlisteners[$i] = array(<br />
									&#8220;hostname&#8221;=>$this->_values[$this->_indexes</p>
<p>['HOSTNAME'][$i]]['value'],<br />
									&#8220;useragent&#8221;=>$this->_values[$this->_indexes</p>
<p>['USERAGENT'][$i]]['value'],<br />
									&#8220;underruns&#8221;=>$this->_values[$this->_indexes</p>
<p>['UNDERRUNS'][$i]]['value'],<br />
									&#8220;connecttime&#8221;=>$this->_values[$this->_indexes</p>
<p>['CONNECTTIME'][$i]]['value'],<br />
									&#8220;pointer&#8221;=>$this->_values[$this->_indexes['POINTER']</p>
<p>[$i]]['value'],<br />
									&#8220;uid&#8221;=>$this->_values[$this->_indexes['UID'][$i]]</p>
<p>['value'],<br />
								);<br />
		}</p>
<p>		return($arrlisteners);<br />
	}</p>
</blockquote>
<p>Questa funzione restituisce i dati di connessione di ogni singolo ascoltatore, come avviene nella sezione admin del server shoutcast. Per ogni useragent attualmente in lista, si estrae l&#8217;hostname, l&#8217;useragent, il numero di underruns (&#8220;cadute&#8221; nell&#8217;ascolto), il tempo di connessione, un puntatore e l&#8217;user id.</p>
<p><b>Funzione numero 20:</b></p>
<blockquote>
<p>function geterror() { return($this->_error); }</p>
</blockquote>
<p>Questa funzione restituisce l&#8217;errore riscontrato.</p>
<p>Abbiamo visionato le variabili e le funzioni di questa classe, capendo, almeno sommariamente, come funzionano e cosa fanno. </p>
<p>Il prossimo passaggio è quello di realizzare fisicamente una pagina che ci permetta di utilizzare questi dati. Sarà oggetto di un prossimo articolo.</p><!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.fabriziomondo.com/blog/2008/10/17/classshoutcastphp-un-mezzo-per-monitorare-la-vostra-web-radio-su-un-sito-internet-dinamico/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->