0item(s)

Uw winkelwagen bevat geen artikelen.

Product was successfully added to your shopping cart.
Swipe to the left

UniRadio - Radio Automatiseringssysteem geschreven door Patrick Sterk

By Margreet van Muyden 23 maart 2018 638 Views No comments

Wie

Mijn naam is Patrick Sterk, 29 jaar en software ontwikkelaar in de taal object pascal of te wel: Delphi. In dit artikel zal ik dieper in gaan in het ontstaan van het radio automatiseringssysteem genaamd UniRadio en de achterliggende techniek.

Jaren 90

Met de introductie van het Dalet systeem halverwege de jaren 90 en het automatiseren van radiostations, is er (in Nederland) als het ware een standaard geïntroduceerd destijds waarbij getracht is om de radiostudio waar mogelijk te visualiseren. Het systeem werd uiteindelijk een dermate succes dat vrijwel elk nationaal en regionaal radiostation gebruik maakte van dit systeem. Dalet(5.x) was gebaseerd op een Sybase database server, vereiste(zeker in de 4.xx versies) een dure digigram audio kaart en is ontwikkelt in Visual C . Het had ook een aantal nadelen: Het was duur, het vergt veel onderhoud en niet altijd stabiel. Naar mate de tijd vorderde en de techniek vooruit ging raakte het systeem steeds sneller verouderd en kon het niet meer mee met de huidige tijd, waardoor er een aantal alternatieve systemen zijn ontwikkelt, waaronder UniRadio.

Project
Het UniRadio project dat wordt ontwikkelt in de meest recente Delphi versie en is een combinatie van een radio hobby, software development en behoefte aan een goedkoper systeem. Met dit project probeer ik een middenweg te vinden tussen de grootte automatiseringssystemen en de ‘kleine’ gebruiker. Met ‘de kleine gebruiker’ doel ik op thuis gebruik, op een locatie set en of internet radio stations, zodat het voor iedereen toegankelijk kan zijn. Uiteraard is het zo dat er op internet een lijst aan software te vinden is welke gratis zijn te downloaden en in te zetten zijn als automatiseringssysteem. In dergelijke systemen ontbreken(naar mijn inziens) een aantal punten waardoor het in mijn ogen niet aan mijn eisen voldoet. Met een eigen ontwikkeling heb je uiteraard de touwtjes letterlijk in handen en geeft het de vrijheid om te ontwikkelen waarvan ik denk dat, dat een goede toevoeging is aan het systeem zonder afhankelijk te zijn van derde en of andere software ontwikkelaars en de daarmee bijkomende kosten. De enigste beperking is mijn eigen kennis en kunde waar ik overigens tot op heden nog niet tegen aan gelopen ben.

Visualiseren
Een onderdeel wat o.a. een succes maakte van het oude Dalet systeem en tevens is ontwikkelt in UniRadio, is het visualiseren van de mengtafel in de studio. Hiervoor had men een grafische module ontwikkeld waarbij er twee audio sporen werden weergegeven, welke je kunt vergelijken met twee faders op je mengtafel. Met de module was het mogelijk om visueel overgangen te maken en voor te beluisteren eer deze ook daadwerkelijk on-air te horen zou zijn. Een bijkomende mogelijk was om jingles of ingesproken teksten(z.g. voicetracks) tussen de overgangen visueel te plaatsen en deze precies te positioneren tussen de muziek. Met deze grafische optie is tevens ook makkelijker om audio effecten toe te passen, zoals het aanpassen van het tempo, pitch, knippen, volume en / of VST effecten.



On-air!

Alle modules binnen het systeem werken samen; dit zowel buiten of tijdens de uitzending, maar zijn niet

LPlaylistManager := Core.CreatePlaylistManager(Owner);

afhankelijk van elkaar om te kunnen opereren. Zo is het mogelijk audio en of tekst items vanuit bijvoorbeeld USB stick rechtstreeks in de playlist te droppen zonder tussenkomt van de database. Overigens is het desgewenst mogelijk om te audio bestanden tijdens het droppen toe te voegen aan de onderliggende database waardoor de items hergebruikt kunnen worden. De navigator is een van de hoofd modules binnen het systeem. Hier wordt de uiteindelijke uur planning ingeladen inclusief de eventueel ingeplande reclameblokken, nieuws, weer & verkeer of andere eventueel op tijd geplande events. Op technisch vlak heb ik er voor gekozen om elke module welke voorzien is van een lijst(playlist) te voorzien van een PlaylistManager.



Deze PlaylistManager bevat alle items in de playlist inclusief de benodigde functionaliteit om bijvoorbeeld te bepalen welk item als eerst volgende afgespeeld dient te worden. Zodoende is elk zichtbaar item in de playlist van het type TPlaylistItem. Op basis van de ingevulde properties kan worden bepaald met wat voor item ik te maken heb. Zo kan een playlist item een blokheader, jingle, blokitem of we te maken hebben met een variabel duration item, zoals bijvoorbeeld nieuws, weer & verkeer. Diezelfde playlistmanager kan worden koppelt aan de grafische mix editor, waardoor het eenvoudig wordt om de bijhorende playlistitems te bewerken.


Scheduling

De hele programmering van muziek tot reclame/event blokken komen in zijn geheel samen in de Log Editor. Vanuit deze module worden de navigator en/of singleplayers gevoed met voor hun op dat moment geldende playlist. In Log Editor kunnen uiteraard ook wijzigingen worden aangebracht in de playlist. De playlist kan zowel handmatig in elkaar worden gezet alsmede worden ingelezen vanuit een externe playlist scheduler(zoals stationplaylist).

Hardware & Techniek

TCore
Zoals eerder vermeld ontwikkel ik het systeem in de meest recente Delphi professional versie. Op het moment van schrijven is dat Delphi 10.2.1. Als data opslag heb ik gekozen voor Microsoft SQL Server 2016 in combinatie met een ORM framework van Devart, genaamd: Entity framework. Als audio engine heb ik gekozen voor de engine van Un4seen(bass.dll). Het hele systeem bouw ik rondom een singleton core object welke de toegang verleend aan de diverse systeem objecten, zoals bijvoorbeeld:

  • Core.AudioEngine.Play(TPlaylistItem);
  • Core.AudioEngine.Stop(TPlaylistItem);
  • Core.AudioEngine.Seek(TPlaylistItem, aScrollValue: integer);
  • Core.AudioEngine.MuteDevice(TOutputDevice);
  • Core.AudioEngine.UpdateStopPosition(TPlaylistItem);
  • Core.SettingsManager.PropertyName(Read/Write);
  • Core.SettingsManager.Init;
  • Core.SettingsManager.Save;
  • Core.Utils.functions;
GDI


‘Alleen tekenen van je ziet’

for LCounter := 0 to Fragmenten.count -1 do
PaintAudioFragment(Fragmenten[LCounter]);

waarbij Fragmenten een TObjectList<TAudioFragment> is.

  • Threading
    Naast de core opbouw maak ik tevens veelvuldig gebruik van threads(OnniThreadLibrary). De meeste hiervan zijn parallel threads in de vorm van Async(procedure).AWait(procedure), zodat de software overweg kan met meerdere cores in de onderliggende CPU. Deze methode gebruik ik onder andere voor het inlezen van data, audio bestanden, checks en polling.

GUI
Omdat de logica geschieden is van de User interface, kan ik de user interface zonder problemen aanpassen. Voor het opbouwen van de user interface heb ik gekozen om gebruik te maken van DevExpress VCL componenten. Het TcxGrid is een component dat veelvuldig terug komt in de applicatie waaronder in de Navigator, Singleplayers, LogEditor e.t.c. Daarnaast is het toepassen van skins een stuk eenvoudiger geworden evenals het aanpassen van de GUI kleuren. In de toekomst zal het mogelijk worden om je eigen GUI indeling te maken, zodat software naar persoonlijke smaak kan worden ingedeeld.

Hardware
Muziek starten met de functietoetsen of met de muis, dat kan. Nog makkelijker wordt het als de software kan communiceren met diverse broadcast consoles. Het systeem heeft momenteel ondersteuning voor WheatNET, D&R, Velleman USB en de LabJack. Momenteel werk ik aan ondersteuning voor DHD, IO Warrior en de D&R Airmate. Om dit eenvoudig te bewerkstelligen ben ik bezig om een HAL(Hardware access layer) te implementeren waarbij het mogelijk wordt om eenvoudig nieuwe hardware aan het systeem te kunnen koppelen.

Verbinden en gebeurtenissen
In tijden van socialmedia, API’s en koppelingen, is UniRadio een open systeem. Het bevat mogelijkheden om data te exporteren naar XML en weer in te lezen in het systeem, koppelen met overige playout systemen en complete playlisten(inclusief audio bestanden) uit te wisselen tussen UniRadio gebruikers. Momenteel ben ik eveneens met een webportaal bezig om vanaf afstand inzicht te krijgen in playlisten en aan te passen. Buiten de communicatie met de buitenwereld heb ik er voor gekozen om gebeurtenissen te implementeren in het systeem. Om een voorbeeld te noemen: Indien een audio bestand fysiek wordt gewist en het betreffende item staat gepland, dan zal dit item rood kleuren en de status zal worden gewijzigd in ‘niet beschikbaar’.


​Delphi Meetup in The Netherlands

By Margreet van Muyden 14 februari 2018 197 Views No comments

Last Tuesday we kicked off with our first Delphi Meetup.

The Meetup was organized in conjunction with customer Ultraware and we were invited in their office in Assen in the north of The Netherlands. About 25 Delphi developers joined this Meetup.

After the warm welcome in the meeting area of the building we went up to the presentation room where one of their developers - André Mussche - showed us how to use the new protocol gRPC (protobuffer) where data minimalisation and realtime communication are key. The communication is realized on the basis of fixed defined contract and are bi-directional. gRPC is based on a contract with cross platform libraries and therefore universal. We learned about the use of this protocol with the strong combination of Golang and Delphi! Google for example is using this protocol themselves in Google Speech. We see more and more how important speech recognition is in software applicationsand it was great to see how you can add this extra dimension to your existing or new Delphi applications.

Techniques he used were gRPC: realtime bidirectional streaming (http2 with websockets as fallback, compact data with protobuffer, streaming Google Speech demo: intermediate results during talking, incl. an Android app demo, Delphi server + client implementation, etc. and that was fun!

After his presentation it was time for coffee and tea again and we went to the meeting room where Serge de Mul - owner of Ultraware - told us more about the one overarching control system they developed for their building. This system works together with all existing systems like ventilation, heating, lighting and security systems. When the office is not used or even when a room is empty all power is switched off by this system. A energy saving of 90% as a result.

Jeroen Pluimers was the second presenter and his subject was Security.
Security is a hot item, privacy laws are changing and becoming stricter. Jeroen told us how to use software and protocols in a secure way. How important the setup of your servers and data is.Every protocol has his own specific pitfalls in terms of safety and it is important to be aware of this during your application development. He showed a library of a SFTP-protocol he wrapped himself to use within Delphi. Because we all know - data leaks are fatal.

After this presentation it was Pizza time! And a great moment for everyone to talk to each other, share ideas and have fun.

With special thanks to Ultraware for their hospitality.