SlideShare a Scribd company logo
Nerd sniping myself into a rabbit hole...
Streaming online audio to a Sonos
speaker
Maarten Balliauw
@maartenballiauw
Disclaimer
I will share bits of source code where they matter, but will
not be sharing the full application.
I have built this application for personal and learning use,
and I do not intend to share it.
Don’t ask, the answer is no.
Living room speakers
January 2020
“Let’s replace our old speakers with new and shiny!”
Requirements:
“Smart” speakers that can stream from the Internet
2 for living room, 1-2 for home office

Recommended for you

Ig2task1worksheet
Ig2task1worksheetIg2task1worksheet
Ig2task1worksheet

The document provides definitions for various audio and sound design terms. It includes a glossary with over 20 terms defined, along with the relevance of each term to the author's own production practice. Some of the key terms defined include foley artistry, sound libraries, audio file formats like .wav and .aiff, lossy compression, digital sound processors, mono vs stereo audio, MIDI, software sequencers, and MIDI keyboard instruments. For each term, the author provides a short internet definition and describes how the concept relates to their own work in games design sound production.

IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for terms like Foley artistry, sound libraries, file formats like .wav and .aiff, compression types, audio hardware like sound cards, and sampling concepts. For each term, the student provided a short definition from an online source as well as how the term relates to their own production work for the course.

Ig2 task 1
Ig2 task 1Ig2 task 1
Ig2 task 1

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for over 20 key terms with URLs linking to where the definitions were obtained. For each term, the student also provides a short explanation of how the term relates to their own production practice, such as using sound libraries to add pre-made sounds to their work in GTA. Common file formats, limitations of audio hardware, recording systems, MIDI, sampling, and other core concepts are defined and linked to the student's projects.

Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker

Recommended for you

Ig2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisitedIg2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisited

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for over 20 key terms, sourced from online references. For each term, the student also provides a brief description of how the term relates to their own production practice, such as formats and file types used, software and hardware employed, and recording and editing techniques.

Ig2 task 1 work sheet
Ig2 task 1 work sheetIg2 task 1 work sheet
Ig2 task 1 work sheet

This document contains a glossary of terms related to sound design and production. It defines terms like foley artistry, sound libraries, file formats like .wav and .mp3, audio limitations involving sound processor units and digital sound processors, audio recording systems, audio sampling concepts, and how they relate to the student's own production practice of manipulating sounds to create new sounds. The student researched definitions for each term and explained how some of the concepts, like using MIDI keyboards and sound sequencers, directly applied to their work, while other terms they were unfamiliar with or did not use in their projects.

combined_document
combined_documentcombined_document
combined_document

The document summarizes the Propellerhead Thor app for iPad. It states that the app is an exact remake of the desktop version of Thor synthesizer with the same sound engine and basic functionality. It includes 6 wavetypes, 3 filters, 3 envelopes, and 2 LFOs, providing scope for sound design. It also has a routing screen to create signal chains and a 16 step sequencer for arpeggios and loops.

Now what…
Searched online for solutions…
…all I found was excuses.
Legal, patents, … Don’t really care as a consumer!
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
https://support.sonos.com/s/article/79?language=en_US
Nerd Sniping
1. The act of presenting someone, often
a mathematician/physicist with a time consuming problem or
challenge (often impossible to solve or complete) in the hopes
of it appealing to a person's obsessive tendencies.
Urban Dictionary
And https://xkcd.com/356

Recommended for you

Sound recording glossary improved version
Sound recording glossary improved versionSound recording glossary improved version
Sound recording glossary improved version

Nathan Mather has produced a glossary of terms related to sound design and production. The glossary contains definitions for terms such as foley artistry, sound libraries, uncompressed audio files, .wav files, .aiff files, .au files, .smp files, lossy compression, .mp3 files, sound processor units, digital sound processors, random access memory, mono audio, stereo audio, and surround sound. For each term, Nathan provides a short definition from an online source as well as his own experience with how the term relates to his production practice.

work
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet

This document contains a glossary of terms related to sound design and production for computer games. It provides definitions for terms like foley artistry, sound libraries, audio file formats like .wav and .mp3, audio limitations such as sound processor units and random access memory, mono/stereo/surround sound, audio recording systems like analog and digital audio tape, MIDI, software sequencers and plugins, and concepts in audio sampling like bit-depth and sample rate. For each term, the student provided an internet definition and described its relevance to their own production practice where possible.

Ig2 task 1 re edit version
Ig2 task 1 re edit versionIg2 task 1 re edit version
Ig2 task 1 re edit version

The document is a glossary created by a student for a sound design course. It contains definitions for over 20 audio and sound design terms, sourced from online references. For each term, the student provides a short definition along with a discussion of how the term relates to their own production work. The glossary covers areas such as file formats, recording and playback systems, sampling, and audio software. The student's production practice involves using software like Reaper to create sound effects, jingles and other audio for a games design project.

Research
What would I need?
1. Connect to speakers
2. Get MP4 URL of online video
3. Send URL to speakers
4. Enjoy music!
https://python-soco.com/
Connect to speakers
Connect to one speaker
Play an MP3 from webserver
This seems very, very promising!
#!/usr/bin/env python
from soco import SoCo
if __name__ == '__main__’:
sonos = SoCo('192.168.1.102’)
sonos.play_uri('http://host/file.mp3')
https://python-soco.com/

Recommended for you

Ig2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblinIg2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblin

1) The document is a glossary of terms related to sound design and production for computer games. It provides definitions for various terms gathered from online research and describes how each term relates to the author's own production practice. 2) Key terms defined and discussed include file formats like .wav and .mp3, audio hardware like sound cards and MIDI keyboards, recording techniques like sampling and bit depth, and software tools like plug-ins and sequencers. 3) The author explains which terms are relevant to their own work creating sound effects, such as using uncompressed .wav files and stereo/surround sound, and which terms do not apply to their process, like formats for CDs/DVDs.

Otto AI
Otto AIOtto AI
Otto AI

This document provides an overview of the architecture and components used in an AI assistant called Otto. It describes the base software including Docker, Node.js, and MongoDB. It also outlines the natural language processing, speech recognition, text-to-speech and other modules. It details the client and messaging bot architectures and includes information on I/O drivers, actions, fulfillments and the overall workflow. Finally, it lists some example intents and provides guidance on developing new actions and the hardware used including the Raspberry Pi, Re-Speaker mic HAT and power components.

aibototto
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...

In this tech-light Slideshare you'll have the chance to find out what you need to get a podcast started for your business. From web hosting to recording, editing to uploading.

podcastingpodcastb2b marketing
Get MP4 URL of online video
Video metadata endpoint, used by web player
Returns urlencoded data about video (with JSON sprinkled in)
https://www.youtube.com/watch?v=-zJoP2qPgTg
 https://www.youtube.com/get_video_info?video_id=-zJoP2qPgTg
Get MP4 URL of online video
{
"responseContext":{ },
"playabilityStatus":{ },
"streamingData":{
"expiresInSeconds":"21540",
"formats":[
{
"itag":18,
"url":"https://r3---sn-uxaxoxu-cg0k.googlevideo.com/videoplayback?expire=1599574779u0026ei=mz5XX6-fKdOIgQeBp6PgDwu0026
"mimeType":"video/mp4;+codecs="avc1.42001E,+mp4a.40.2"",
"bitrate":234221,
"width":640,
"height":360,
"lastModified":"1586173729658545",
"contentLength":"92057863",
"quality":"medium",
Get MP4 URL of online video
More reading by Alexey Golub
https://tyrrrz.me/blog/reverse-engineering-youtube
Signed videos
Video player JS code contains decryption routine as JavaScript
Need to evaluate that to be able to access video (or Regex the cipher)
Too much hassle to write manually!
There exist scripts & libraries in many programing languages
In summary: we have the MP4 URL now.
Send URL to speakers
#!/usr/bin/env python
from soco import SoCo
if __name__ == '__main__’:
sonos = SoCo('192.168.1.102’)
sonos.play_uri('http://host/file.mp4')
https://python-soco.com/
Expected:
Actual:

Recommended for you

Programming the Raspberry Pi element14
Programming the Raspberry Pi element14Programming the Raspberry Pi element14
Programming the Raspberry Pi element14

This document provides an overview of programming the Raspberry Pi by walking through setting it up, flashing an SD card, logging in, using the text editor JOE to write "hello world" programs in Python and C, downloading more complex examples, and configuring display settings. Key steps include downloading an OS image, flashing the image to an SD card, logging in with the username "pi" and password "raspberry", using JOE to write and run simple programs, and editing the configuration file to control settings like screen resolution. The goal is to demonstrate the basic workflow for getting started with programming on the Raspberry Pi.

element14raspberry piprogramming
Java Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending MachineJava Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending Machine

Learn about DK 8 and Device I/O Library Also, see the lab how to install from scratch Rasbian, JDK 8, Device I/O on a RaspberryPi. See the code from github and build your own machine

javaraspbianraspberry pi
Bl ig2 url
Bl ig2 urlBl ig2 url
Bl ig2 url

This document is a glossary produced by a student at Salford City College for a BTEC Extended Diploma in Games Design unit on sound for computer games. It contains definitions of over 20 key terms related to sound design and production that were researched from online sources. For each term, the student provided a short definition from their research along with a URL source, and also described how the term relates to their own production practice.

Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Side track: speaker webserver
Anything useful to find?
http://192.168.1.123:1400/status
http://192.168.1.123:1400/support/review
http://192.168.1.123:1400/tools.htm
https://bsteiner.info/articles/hidden-sonos-interface
Troubleshooting
💡 Maybe it’s that SoCo library!
“Because maybe 65 contributors have it wrong!”
The official application can send a stream to the speakers...
...can I listen on the network and see what the request looks like?

Recommended for you

Brienna hick sound recording glossary
Brienna hick sound recording glossaryBrienna hick sound recording glossary
Brienna hick sound recording glossary

This document contains a glossary of terms related to sound design and production for computer games. It provides researched definitions from online sources for terms like Foley artistry, sound libraries, file formats like .wav and .aiff, compression types, audio hardware limitations, recording systems, MIDI, sampling, and more. For each term, it also describes the relevance to the author's own production practice, such as how sound libraries are used to store sound effects for use in projects.

Sound recording glossary
Sound recording glossarySound recording glossary
Sound recording glossary

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for terms like Foley artistry, sound libraries, uncompressed audio, WAV and AIFF file formats, lossy compression, MP3 files, sound cards, digital sound processors, RAM, mono audio, stereo audio, surround sound, PCM, analog audio, digital mini discs, and compact discs. For each term, it provides a short internet-sourced definition and links, as well as describing the relevance of the term to the author's own production practice where possible.

Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3

The document is a glossary created by Robert Hillard-Linney for a unit on sound design and production. It contains definitions for over 20 key terms related to sound design methodology, file formats, audio limitations, audio recording systems, audio sampling, and MIDI instruments. Each definition includes a short researched definition from an online source and Robert's description of how the term relates to his own production practice.

Sniffing the network
WireShark https://www.wireshark.org/
Sniff traffic that passes your computer’s network adapter
Traffic does not pass my computer :-/
Phone on wifi, speaker on wifi, computer on wifi – huh?
Turns out access point does just send all traffic to all devices
💡💡 Unifi access point is *nix
tcpdump there?
Sniffing the network
🤓 On my Windows box, connected to wired network
Run Ubuntu
SSH into access point and run tcpdump
Pipe data back to Windows
Access point IP Capture ethernet side From/to my phone IP
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Your fancy wifi speaker uses SOAP

Recommended for you

Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2

The document provides definitions for terms related to sound design and production. It includes a glossary with terms like Foley artistry, sound libraries, sound file formats (.wav, .aiff, .au, .smp), and lossy compression. For each term, it provides a short definition from an online source and describes how the term relates to the author's own production practice.

Sound recording glossary tom crook
Sound recording glossary tom crookSound recording glossary tom crook
Sound recording glossary tom crook

Tom Crook produced a glossary of terms related to sound design and production for a games design course. The glossary defined 15 key terms and described how each term relates to Tom's own production practice. The terms included definitions for Foley artistry, sound libraries, uncompressed files, .wav and .aiff file formats, lossy compression, MP3 files, sound processor units, digital signal processors, RAM, mono and stereo audio, surround sound, pulse code modulation, analogue and digital audio recording, and compact discs.

gegerageSound recording glossary tom crook
gegerageSound recording glossary tom crookgegerageSound recording glossary tom crook
gegerageSound recording glossary tom crook

The document is a glossary assignment for a games design course requiring the student to research and define terms related to sound design and production. It contains definitions for over 20 terms with URLs citing the sources. The student provides brief explanations of how each term relates to their own production practice, such as using Foley artistry for sound effects, sound libraries for accessibility, uncompressed files for sharing audio, and mp3 for portability. Overall the document covers terminology for sound file formats, limitations, recording systems, sampling, and software.

SOAP payload
<?xml version="1.0" encoding="UTF-8"?>
<s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingstyle="http://schema
<s:body>
<u:setavtransporturi xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<instanceid>0</instanceid>
<currenturi>x-rincon-mp3radio://host/media.mp3</currenturi>
<currenturimetadata>
<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http
<item id="R:0/0/6" parentID="R:0/0" restricted="true">
<dc:title>Title here</dc:title>
<upnp:class>object.item.audioItem.audioBroadcast</upnp:class>
<upnp:albumArtURI>https://host/art.jpg</upnp:albumArtURI>
<r:description>Description here</r:description>
<desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1-
</item>
</DIDL-Lite>
</currenturimetadata>
</u:setavtransporturi>
</s:body>
</s:envelope>
Replaying SOAP payload
Tried MP3 URLs and MP4 URLs
MP3 worked, MP4 did not
The SoCo library did not have any issues...
Searched around for DIDL-Lite in payload
Seems speakers use good old UPnP
http://www.upnp.org/schemas/av/didl-lite-v2.xsd
💡 Maybe it’s the MP4 format!
https://support.sonos.com/s/article/79?language=en_US
Our (potential) options...
Download MP4, push it to speaker as a local file
or
Proxy MP4 and do on-the-fly transcoding to MP3
Send MP3 URL as “Internet Radio”
or
Investigate MP4 and see if they indeed use AAC
Send AAC URL as “Internet Radio”

Recommended for you

Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2

This document contains a glossary of terms related to sound design and production for a games design course. It provides definitions for terms like Foley artistry, sound libraries, file formats like .wav and .aiff, audio limitations involving sound cards and processors, and other concepts. For each term, it gives a short definition from an online source and asks the student to describe how the term relates to their own production practice.

Lesson 6
Lesson 6Lesson 6
Lesson 6

This document discusses adding multimedia elements like sound and video to HTML webpages. It covers potential issues with multimedia websites, different audio and video file formats, and provides code examples for embedding a sound clip and YouTube video. The lesson objectives are to explain multimedia website issues, embed sound, and embed a YouTube video. Students are assigned a task to add sound and video to an existing webpage.

Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved

The document provides definitions for various audio and sound design terms. It includes a glossary with over 15 terms defined, along with the relevance of each term to the author's own production practice. Some of the key terms defined include foley artistry, sound libraries, .wav and .mp3 file formats, audio limitations like mono vs stereo sound, audio recording systems such as analog and digital, MIDI, software sequencers, and concepts of audio sampling like bit depth and sample rate.

bhfhughfuihgd6j9b6969696969
Containers
MP4
MPEG-4 Part 14 or MP4 is a digital multimedia container
format most commonly used to store video and audio, but
it can also be used to store other data such
as subtitles and still images. (…) allows streaming (…)
Wikipedia
Can we extract this to a separate file?
MP4 file
Header
Video 1
Video N
Audio 1
Audio N
Subtitles
MP4 file (optimized for streaming)
Header
Video 1 (short)
Audio 1 (short)
Video N (short)
Audio N (short)
FFMpeg to the rescue!
“A complete, cross-platform solution to record, convert and stream
audio and video.”
Swiss army knife for video/audio formats.
ffmpeg -i original.mp4 -c:a copy output-aac.m4a
Extracts the audio track from MP4 container
Use SoCo to send file to speakers.
https://ffmpeg.org/
Expected: Actual:
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker

Recommended for you

Podcasting
PodcastingPodcasting
Podcasting

The document discusses the basics of podcasting, including: 1. Podcasts are syndicated audio or video files that can be played on devices like iPods or computers and allow users to subscribe to topics through RSS feeds. 2. Creating podcasts is easy - users record audio files, convert them to MP3 format, create an RSS feed, and host the files on a website. 3. Popular tools for creating podcasts include Gabcast, podOmatic, and Odeo which allow users to record and publish podcasts for free.

IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet

Kyle Fielding produced a glossary of terms related to sound design and production for a games design course. The glossary contains definitions for terms like Foley artistry, sound libraries, audio file formats like .wav and .aiff, lossy compression formats like .mp3, audio hardware limitations such as sound processor units and digital sound processors, and audio techniques including mono, stereo, and surround sound. Kyle explained how each term is relevant to his own production practice, such as using sound libraries to organize sounds and common file formats when saving and opening files.

Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for terms like Foley artistry, sound libraries, audio file formats like .wav and .mp3, limitations like mono audio, recording systems such as analog and digital, MIDI, software sequencers, and considerations for audio sampling like bit depth and sample rate. For each term, the student provided a short definition from an online source as well as how the term relates to their own production practice, such as using sound libraries to try different audio levels or saving files as .wav for flexibility.

deadf00d
“How I hacked Sonos and YouTube in the same day.”
https://www.deadf00d.com/post/how-i-hacked-sonos-and-youtube-the-same-day.html
@deadf0od - https://twitter.com/deadf0od
“HEY, kAn 1 Dm J00?
w0rK1n' 0N 51M1Lar 7h1n' AnD wE M19h7 8E a8le 70 HElP EaCH 07heR.”
...
“It’s AAC, but in ADTS format. Each atom needs a header in every frame!”
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
MP4 to AAC with ADTS
ffmpeg -i original.mp4 -acodec copy 
-f adts -vn output-adts.aac
Extracts the audio track from MP4 container
Adds ADTS headers
Use SoCo to send file to speakers.
Expected: Actual:
Making it an app

Recommended for you

Jordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisitedJordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisited

Jordan Smith has produced a glossary of terms related to sound design and production for computer games. The glossary contains definitions for terms such as Foley artistry, sound libraries, audio file formats like .wav and .mp3, audio limitations including sound processor units and random access memory, audio recording systems like analog and digital, MIDI, software sequencers, and audio sampling concepts like bit depth and sample rate. For each term, Jordan has provided a researched definition from an online source as well as his own comments on the relevance of the term to his production practice where possible.

Audio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docxAudio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docx

Audio Resources Choose one of them or any other of your choice to record your voice with a short discussion of these ideas and how you might use SOUND in your Integrated Thematic Unit and how your ITU is progressing. Conclude by stating which application you are using to record, and save as a sound file to the Discussion Board. Sound Sound Technologies are available for classroom and training use via Windows, Apple, Microsoft Office, software, the WWW, Internet applications, APPs, etc. and can be created in many ways. This important multimedia component often brings new life and excitement into learning and is often neglected. Remember that research shows that the more senses stimulated, the greater the retention. Special Needs students benefit in many ways, as well. FILE FORMATS WAV or waveform .wav A file extension developed by IBM and Microsoft for a standard Microsoft audio file. It is supported by all computers running Windows and by all the most popular web browsers. The WAVE format is one of the most popular sound formats on the Internet for music or speech. Audio Interchange File Format .aif or .aiff A file most commonly used in Macintosh Operating System Musical Instrument Digital Interface .midi A digitally synthesized sound file format for sending music between electronic music devices like synthesizers and PC sound cards. This interface was created in 1982 by the music industry; it is very flexible, ranging from very simple to real professional music making. MIDI files are supported by all the most popular Internet browsers, software systems, and platforms. The downside of MIDI is that it cannot record sounds (only notes), or to put it another way, it cannot store songs, only tunes. MIDI files do not contain sampled sound but a set of digital musical instructions (musical notes) that can be interpreted by your PC's sound card. The upside of the MIDI format is that since it contains only instructions (notes), MIDI files can be extremely small. Via Wikipedia Real Audio Media .rm or .ram These are two file extensions used for Real Audio players. The RealAudio format was developed for the Internet by Real Media. The format also supports video. MP3 .mp3 MPEG-1 Audio Layer 3, more commonly referred to as MP3, is a digital audio encoding format using a form of lossy data compression. It is a common audio format for consumer audio storage, for the transfer and playback of music on digital audio players. MP3 is an audio-specific format that was designed by the Moving Picture Experts Group. Applications (ideas for both PC and MAC) Text to Speech Make a choice under Voice selection. Preview Voice. Click Apply. You will hear this chosen voice when we open an application later. Under the Speech icon, you will find a tab Text to Speech (originally Text to Speech and Sound Recognition). Siri Voice Comments in Word *** cool functionality Click on the sound icon on the right to insert comments for Word 2003. Sound in Excel ...

Sound recording glossary improved
Sound recording glossary   improved Sound recording glossary   improved
Sound recording glossary improved

The document is a glossary of terms related to sound design and production for computer games. It contains definitions for over 20 key terms, sourced from online references. For each term, the student also provides a brief explanation of how the term relates to their own production practice. The glossary covers areas such as sound file formats, audio limitations, recording systems, sampling and more.

Let the app building start!
1. Connect to speakers ✅
2. Get MP4 URL of online video ✅
3. (new) Extract MP4 audio track to ADTS ✅
4. Send URL to speakers ✅
5. Enjoy music!
Architecture
YouTube app
Share
https://youtube.com/watch?
v=-zJoP2qPgTg
YouTube.com
Sonos
speaker
Main
MP4 to ADTS
MP4 audio
Reverse proxy
https://<ip>/audio.adts
Technology choices
Native app?
Xamarin?
Flutter?
Jetpack Compose?
🤓♂️ Installed Android Studio as it’s similar to JetBrains Rider, IntelliJ IDEA, ...
Getting started…
Template
Start with empty and add things?
Start with <any> and remove things?
Language
Java?
Kotlin?

Recommended for you

IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1

1. The document is a glossary of terms related to sound design and production for computer games created by Joshua Crooke. It contains definitions of terms researched from various websites and describes how some of the terms relate to Joshua's own production practice. 2. The glossary includes terms like foley artistry, sound libraries, audio file formats (wav, aiff), audio limitations (sound processor unit, digital sound processor, RAM), mono/stereo audio, surround sound, audio recording systems (analogue, MIDI), software plug-ins, and constraints on audio sampling like bit-depth and sample rate. 3. Joshua recorded sound effects using an analogue recording system and edited sounds using software plug-ins in

Podcasting in VET
Podcasting in VETPodcasting in VET
Podcasting in VET

Podcasting involves recording audio or video files and making them available for digital distribution over the Internet. Listeners can subscribe to podcasts using an RSS feed and download files to computers or mobile devices like MP3 players to listen to anytime. The document provides tips on how to create podcasts, including using free or low-cost audio and video recording and editing software on computers, planning content that is 10-20 minutes long, and considering audio quality and background noise when recording.

Porting your favourite cmdline tool to Android
Porting your favourite cmdline tool to AndroidPorting your favourite cmdline tool to Android
Porting your favourite cmdline tool to Android

Porting a command line tool to Android involves cross-compiling the code using the Android NDK toolchain, which may require patching the code to address issues like different file paths, endianness, and library dependencies. While compiling and running static binaries is straightforward, dynamic binaries require position-independent executable (PIE) support added in Android 5. Calling native executables from Android code requires using Runtime.exec() or ProcessBuilder and parsing output streams. Special care needs to be taken to avoid security issues like command injection when passing untrusted inputs to native programs run as root on Android.

android porting ndk cross-compile native binary bi
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Research…
Android-specific
Activity (main screen to handle everything)
Intent (ACTION_SEND to receive data from others)
Libraries (or code)
YouTube metadata extractor (get audio URL)
Sonos communication library (discover speakers, send URL to speakers)
Webserver (reverse proxy)
Something to do the MP4 to AAC (ADTS) conversion
It all starts with a manifest!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="be.maartenballiauw.android.sonostube">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:usesCleartextTraffic="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https" android:host="youtu.be" android:mimeType="text/*"/>
<data android:scheme="https" android:host="youtube.com" android:mimeType="text/*"/>
<data android:scheme="https" android:host="www.youtube.com" android:mimeType="text/*"/>
</intent-filter>
</activity>
</application>
</manifest>

Recommended for you

Thingy editedd
Thingy editeddThingy editedd
Thingy editedd

This document is a glossary of terms related to sound design and production for computer games. It contains definitions for terms like Foley artistry, sound libraries, audio file formats like .wav and .mp3, audio limitations regarding mono/stereo sound, audio recording systems, MIDI, software sequencers, and considerations for audio sampling like bit-depth and sample rate. Each term's definition includes a short description and a citation of the source. Accompanying each definition is a brief explanation from the student of how the term relates to their own production work.

Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)

Brandon McNamara produced a glossary of 15 terms related to sound design and production for computer games. For each term, he provided a short definition from an online source along with details about how the term relates to his own production practice. Some of the key terms he defined and related to his work included Foley artistry, which he will use to add most sounds to his game, sound libraries which will be used to create most of his sounds, and software sequencers and plug-ins which he uses to edit most of the sounds.

Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02

The document is a glossary assignment for a games design course requiring the student to research terms related to sound design and production. It includes definitions for over 20 terms sourced from online references. For each term, the student provides a short definition and URL source, and describes how the term relates to their own production practice, such as using uncompressed audio formats, lossy compression to reduce file sizes, and mono/stereo audio.

new one
And checking the intent…
class MainActivity : CoroutineScope, AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url = intent?.extras?.getString(Intent.EXTRA_TEXT)
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
SSDP Simple Device Discovery Protocol
Used to discover printers, routers, Sonos, ...
Send UDP datagram as multicast/broadcast
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:schemas-upnp-org:device:ZonePlayer:1
Devices send back HTTP response as UDP
Supported services, endpoint URL, ...
https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol
https://github.com/vmichalak/ssdp-client
Android – Running webserver
Prevent server stop when application is closed or device goes to sleep
<service
android:name=".RunEmbeddedWebServerService"
android:enabled="true"
android:exported="true" /> class RunEmbeddedWebServerService : CoroutineScope, Service() {
private val server = embeddedServer(Netty, 36362) {
routing {
get("/{videoId}.mp4") { /* ... */ }
}
}
override fun onStartCommand(...): Int {
server.start(wait = false)
return START_NOT_STICKY
}
override fun onDestroy() {
server.stop(0, 1000)
super.onDestroy()
}
https://developer.android.com/guide/components/services#Types-of-services

Recommended for you

Ig2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martinIg2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martin

This document contains a glossary of terms related to sound design and production. It includes definitions for terms like foley artistry, sound libraries, file formats like .wav and .aiff, audio limitations like mono and stereo audio, audio recording systems like analog and digital, MIDI, software sequencers, software plugins, and audio sampling concepts like bit-depth and sample rate. The student has researched definitions for each term and provided details on how some of the terms relate to their own production practice, such as using foley artistry to record task sounds and creating sound libraries for sound effects.

Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxBringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx

The C# nullability features help you minimize the likelihood of encountering that dreaded System.NullReferenceException. Nullability syntax and annotations give hints as to whether a type can be nullable or not, and better static analysis is available to catch unhandled nulls while developing your code. What's not to like? Introducing explicit nullability into an existing code bases is a Herculean effort. There's much more to it than just sprinkling some `?` and `!` throughout your code. It's not a silver bullet either: you'll still need to check non-nullable variables for null. In this talk, we'll see some techniques and approaches that worked for me, and explore how you can migrate an existing code base to use the full potential of C# nullability.

dotnetcsharpnullability
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space

Space is a team tool that integrates chats, meetings, git hosting, automation, and more. It has an HTTP API to integrate third party apps and workflows, but it's massive! And slightly opinionated. In this session, we will see how we built the .NET SDK for Space, and how we make that massive API more digestible. We will see how we used code generation, and incrementally made the API feel more like a real .NET SDK.

dotnetdotnetcorespace
MP4 to ADTS – FFMpeg?
MP4, ADTS, Atoms, Boxes
https://www.deadf00d.com/post/how-i-hacked-sonos-and-youtube-the-same-day.html
MP4, ADTS, Atoms, Boxes
MP4 with AAC Audio (simplified)
ADTS with AAC Audio (simplified)
moof
“Hey, 25 samples coming.
128kbps, 2 channel audio!”
mdat
Raw, binary data for 25
samples.
moof
“Hey, 12 samples coming.
128kbps, 2 channel audio!”
mdat
Raw, binary data for 12
samples.
Header
“40 bytes coming, 2 ch”
+ 40 bytes for 1 sample
Header
“36 bytes coming, 2 ch”
+ 36 bytes for 1 sample
Header
“42 bytes coming, 2 ch”
+ 42 bytes for 1 sample
Header
“40 bytes coming, 2 ch”
+ 40 bytes for 1 sample
MP4, ADTS, Atoms, Boxes
Had to manually write conversion logic...
Open MP4 stream (https://github.com/sannies/mp4parser)
Foreach moof, read metadata
Foreach sample, write ADTS header, write sample

Recommended for you

Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...

Ever wondered how IDE’s are built? In this talk, we’ll skip the marketing bit and dive into the architecture and implementation of JetBrains Rider. We’ll look at how and why we have built (and open sourced) a reactive protocol, and how the IDE uses a “microservices” architecture to communicate with the debugger, Roslyn, a WPF renderer and even other tools like Unity3D. We’ll explore how things are wired together, both in-process and across those microservices.

riderjetbrains riderndc oslo
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...

Which NuGet package was that type in again? In this session, let's build a "reverse package search" that helps finding the correct NuGet package based on a public type. Together, we will create a highly-scalable serverless search engine using Azure Functions and Azure Search that performs 3 tasks: listening for new packages on NuGet.org (using a custom binding), indexing packages in a distributed way, and exposing an API that accepts queries and gives our clients the best result.

azure functionsazureserverless
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...

Ever wondered how IDE’s are built? In this talk, we’ll skip the marketing bit and dive into the architecture and implementation of JetBrains Rider. We’ll look at how and why we have built (and open sourced) a reactive protocol, and how the IDE uses a “microservices” architecture to communicate with the debugger, Roslyn, a WPF renderer and even other tools like Unity3D. We’ll explore how things are wired together, both in-process and across those microservices. Let’s geek out!

ndc sydneyjetbrainsjetbrains rider
Exploring the code
demo
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker
In summary…

Recommended for you

JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...

This document discusses .NET memory management and the garbage collector. It explains that the CLR manages memory in a heap and the garbage collector reclaims unused memory. It describes how objects are allocated in generations and discusses how to help the garbage collector perform better by reducing allocations, using value types when possible, and properly disposing of objects. The document also provides examples of hidden allocations and demonstrates tools for analyzing memory usage like ClrMD and dotMemory Unit.

.netmemory managementjetbrains
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se....NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...

Which NuGet package was that type in again? In this session, let's build a "reverse package search" that helps finding the correct NuGet package based on a public type. Together, we will create a highly-scalable serverless search engine using Azure Functions and Azure Search that performs 3 tasks: listening for new packages on NuGet.org (using a custom binding), indexing packages in a distributed way, and exposing an API that accepts queries and gives our clients the best result. https://blog.maartenballiauw.be/post/2019/07/30/indexing-searching-nuget-with-azure-functions-and-search.html

.net conf 2019.net conf.net
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...

Which NuGet package was that type in again? In this session, let's build a "reverse package search" that helps finding the correct NuGet package based on a public type. Together, we will create a highly-scalable serverless search engine using Azure Functions and Azure Search that performs 3 tasks: listening for new packages on NuGet.org (using a custom binding), indexing packages in a distributed way, and exposing an API that accepts queries and gives our clients the best result.

azurefunctionsserverless
In summary…
Enjoy music with an app ✅
Connect to speakers ✅
Get MP4 URL of online video ✅
Extract MP4 audio track to ADTS ✅
Send URL to speakers ✅
“Do you use it often?”
In summary…
Learned a lot of random things along the way ✅
There is so much knowledge out there!
Talk to people (thanks, deadF00d!)
You can build anything!
Even if it seems impossible at first!
Thank you!
https://blog.maartenballiauw.be
@maartenballiauw

Recommended for you

NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and SearchNDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search

Which NuGet package was that type in again? In this session, let's build a "reverse package search" that helps finding the correct NuGet package based on a public type. Together, we will create a highly-scalable serverless search engine using Azure Functions and Azure Search that performs 3 tasks: listening for new packages on NuGet.org (using a custom binding), indexing packages in a distributed way, and exposing an API that accepts queries and gives our clients the best result.

azurendc oslonuget
Approaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days PolandApproaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days Poland

Speaking from experience building a SaaS: users are insane. If you are lucky, they use your service, but in reality, they probably abuse. Crazy usage patterns resulting in more requests than expected, request bursts when users come back to the office after the weekend, and more! These all pose a potential threat to the health of our web application and may impact other users or the service as a whole. Ideally, we can apply some filtering at the front door: limit the number of requests over a given timespan, limiting bandwidth, ... In this talk, we’ll explore the simple yet complex realm of rate limiting. We’ll go over how to decide on which resources to limit, what the limits should be and where to enforce these limits – in our app, on the server, using a reverse proxy like Nginx or even an external service like CloudFlare or Azure API management. The takeaway? Know when and where to enforce rate limits so you can have both a happy application as well as happy customers.

azurecloudweb
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...

This document discusses indexing NuGet packages using Azure Functions and Azure Search to power search capabilities in ReSharper and Rider. It proposes using Functions triggered by changes to the NuGet.org catalog to download packages, index them using reflection metadata, and upload the results to an Azure Search index. Each step would be a separate function to allow independent scaling. The final system would watch the catalog, index new/updated packages, and provide APIs for searching packages by type or namespace.

azurecloudazure functions

More Related Content

What's hot

Ig2 task 1 work sheet - JS
Ig2 task 1 work sheet - JSIg2 task 1 work sheet - JS
Ig2 task 1 work sheet - JS
JamieShepherd
 
Ig2 task 1 work sheet
Ig2 task 1 work sheetIg2 task 1 work sheet
Ig2 task 1 work sheet
gordonpj96
 
Deep dive into Android’s audio latency problem
Deep dive into Android’s audio latency problemDeep dive into Android’s audio latency problem
Deep dive into Android’s audio latency problem
Sirawat Pitaksarit
 
Ig2task1worksheet
Ig2task1worksheetIg2task1worksheet
Ig2task1worksheet
Alexballantyne
 
IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1
Alexballantyne
 
Ig2 task 1
Ig2 task 1Ig2 task 1
Ig2 task 1
Kenyon101
 
Ig2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisitedIg2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisited
stephlizahawkins123
 
Ig2 task 1 work sheet
Ig2 task 1 work sheetIg2 task 1 work sheet
Ig2 task 1 work sheet
Luke Summers
 
combined_document
combined_documentcombined_document
combined_document
Thomas Wellburn
 
Sound recording glossary improved version
Sound recording glossary improved versionSound recording glossary improved version
Sound recording glossary improved version
nazaryth98
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet
Nathan_West
 
Ig2 task 1 re edit version
Ig2 task 1 re edit versionIg2 task 1 re edit version
Ig2 task 1 re edit version
cameronbailey1996
 
Ig2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblinIg2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblin
Thomas_Giblin_16
 
Otto AI
Otto AIOtto AI
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Radix Communications
 
Programming the Raspberry Pi element14
Programming the Raspberry Pi element14Programming the Raspberry Pi element14
Programming the Raspberry Pi element14
Imad Rhali
 
Java Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending MachineJava Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending Machine
Jeff Prestes
 
Bl ig2 url
Bl ig2 urlBl ig2 url
Bl ig2 url
benloynd
 
Brienna hick sound recording glossary
Brienna hick sound recording glossaryBrienna hick sound recording glossary
Brienna hick sound recording glossary
soulsama
 
Sound recording glossary
Sound recording glossarySound recording glossary
Sound recording glossary
amybrockbank
 

What's hot (20)

Ig2 task 1 work sheet - JS
Ig2 task 1 work sheet - JSIg2 task 1 work sheet - JS
Ig2 task 1 work sheet - JS
 
Ig2 task 1 work sheet
Ig2 task 1 work sheetIg2 task 1 work sheet
Ig2 task 1 work sheet
 
Deep dive into Android’s audio latency problem
Deep dive into Android’s audio latency problemDeep dive into Android’s audio latency problem
Deep dive into Android’s audio latency problem
 
Ig2task1worksheet
Ig2task1worksheetIg2task1worksheet
Ig2task1worksheet
 
IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1
 
Ig2 task 1
Ig2 task 1Ig2 task 1
Ig2 task 1
 
Ig2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisitedIg2 task 1 work sheet (glossary) steph hawkins revisited
Ig2 task 1 work sheet (glossary) steph hawkins revisited
 
Ig2 task 1 work sheet
Ig2 task 1 work sheetIg2 task 1 work sheet
Ig2 task 1 work sheet
 
combined_document
combined_documentcombined_document
combined_document
 
Sound recording glossary improved version
Sound recording glossary improved versionSound recording glossary improved version
Sound recording glossary improved version
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet
 
Ig2 task 1 re edit version
Ig2 task 1 re edit versionIg2 task 1 re edit version
Ig2 task 1 re edit version
 
Ig2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblinIg2 task 1 work sheet thomas giblin
Ig2 task 1 work sheet thomas giblin
 
Otto AI
Otto AIOtto AI
Otto AI
 
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
Getting Started with B2B Podcasting: A not-too-techy guide for first-time pod...
 
Programming the Raspberry Pi element14
Programming the Raspberry Pi element14Programming the Raspberry Pi element14
Programming the Raspberry Pi element14
 
Java Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending MachineJava Device I/O at Raspberry PI to Build a Candy Vending Machine
Java Device I/O at Raspberry PI to Build a Candy Vending Machine
 
Bl ig2 url
Bl ig2 urlBl ig2 url
Bl ig2 url
 
Brienna hick sound recording glossary
Brienna hick sound recording glossaryBrienna hick sound recording glossary
Brienna hick sound recording glossary
 
Sound recording glossary
Sound recording glossarySound recording glossary
Sound recording glossary
 

Similar to Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker

Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3
halo4robo
 
Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2
thomasmcd6
 
Sound recording glossary tom crook
Sound recording glossary tom crookSound recording glossary tom crook
Sound recording glossary tom crook
TomCrook
 
gegerageSound recording glossary tom crook
gegerageSound recording glossary tom crookgegerageSound recording glossary tom crook
gegerageSound recording glossary tom crook
TomCrook
 
Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2
thomasmcd6
 
Lesson 6
Lesson 6Lesson 6
Lesson 6
Slides4Victor
 
Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved
ItsLiamOven
 
Podcasting
PodcastingPodcasting
Podcasting
kepitcher
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet
KyleFielding
 
Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved
jakehyatt
 
Jordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisitedJordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisited
JordanSmith96
 
Audio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docxAudio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docx
ikirkton
 
Sound recording glossary improved
Sound recording glossary   improved Sound recording glossary   improved
Sound recording glossary improved
Christopher Lucas
 
IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1
crookedpug
 
Podcasting in VET
Podcasting in VETPodcasting in VET
Podcasting in VET
Sue Waters
 
Porting your favourite cmdline tool to Android
Porting your favourite cmdline tool to AndroidPorting your favourite cmdline tool to Android
Porting your favourite cmdline tool to Android
Vlatko Kosturjak
 
Thingy editedd
Thingy editeddThingy editedd
Thingy editedd
ElliotBlack
 
Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)
Collegeemailbrandon
 
Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02
ElliotBlack
 
Ig2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martinIg2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martin
Kalen612
 

Similar to Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker (20)

Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3Robert h l ig2 task 1 work sheet v3
Robert h l ig2 task 1 work sheet v3
 
Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2
 
Sound recording glossary tom crook
Sound recording glossary tom crookSound recording glossary tom crook
Sound recording glossary tom crook
 
gegerageSound recording glossary tom crook
gegerageSound recording glossary tom crookgegerageSound recording glossary tom crook
gegerageSound recording glossary tom crook
 
Ian definitions 3rd try 2
Ian definitions 3rd try 2Ian definitions 3rd try 2
Ian definitions 3rd try 2
 
Lesson 6
Lesson 6Lesson 6
Lesson 6
 
Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved
 
Podcasting
PodcastingPodcasting
Podcasting
 
IG2 Task 1 Work Sheet
IG2 Task 1 Work SheetIG2 Task 1 Work Sheet
IG2 Task 1 Work Sheet
 
Sound recording glossary improved
Sound recording glossary improvedSound recording glossary improved
Sound recording glossary improved
 
Jordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisitedJordan smith ig2 task 1 revisited
Jordan smith ig2 task 1 revisited
 
Audio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docxAudio ResourcesChoose one of them or any other of your c.docx
Audio ResourcesChoose one of them or any other of your c.docx
 
Sound recording glossary improved
Sound recording glossary   improved Sound recording glossary   improved
Sound recording glossary improved
 
IG2 Task 1
IG2 Task 1 IG2 Task 1
IG2 Task 1
 
Podcasting in VET
Podcasting in VETPodcasting in VET
Podcasting in VET
 
Porting your favourite cmdline tool to Android
Porting your favourite cmdline tool to AndroidPorting your favourite cmdline tool to Android
Porting your favourite cmdline tool to Android
 
Thingy editedd
Thingy editeddThingy editedd
Thingy editedd
 
Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)Ig2 task 1 work sheet (1)
Ig2 task 1 work sheet (1)
 
Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02Ig2task1worksheetelliot 140511141816-phpapp02
Ig2task1worksheetelliot 140511141816-phpapp02
 
Ig2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martinIg2 task 1 work sheet connor martin
Ig2 task 1 work sheet connor martin
 

More from Maarten Balliauw

Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxBringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx
Maarten Balliauw
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
Maarten Balliauw
 
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Maarten Balliauw
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
Maarten Balliauw
 
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
Maarten Balliauw
 
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se....NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
Maarten Balliauw
 
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
Maarten Balliauw
 
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and SearchNDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
Maarten Balliauw
 
Approaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days PolandApproaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days Poland
Maarten Balliauw
 
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Maarten Balliauw
 
Approaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologneApproaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologne
Maarten Balliauw
 
CodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory laneCodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory lane
Maarten Balliauw
 
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
Maarten Balliauw
 
ConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttlingConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttling
Maarten Balliauw
 
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Maarten Balliauw
 
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
Maarten Balliauw
 
DotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NETDotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NET
Maarten Balliauw
 
VISUG - Approaches for application request throttling
VISUG - Approaches for application request throttlingVISUG - Approaches for application request throttling
VISUG - Approaches for application request throttling
Maarten Balliauw
 
What is going on - Application diagnostics on Azure - TechDays Finland
What is going on - Application diagnostics on Azure - TechDays FinlandWhat is going on - Application diagnostics on Azure - TechDays Finland
What is going on - Application diagnostics on Azure - TechDays Finland
Maarten Balliauw
 

More from Maarten Balliauw (20)

Bringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptxBringing nullability into existing code - dammit is not the answer.pptx
Bringing nullability into existing code - dammit is not the answer.pptx
 
Building a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to SpaceBuilding a friendly .NET SDK to connect to Space
Building a friendly .NET SDK to connect to Space
 
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
Microservices for building an IDE - The innards of JetBrains Rider - NDC Oslo...
 
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
Indexing and searching NuGet.org with Azure Functions and Search - .NET fwday...
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
 
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
JetBrains Australia 2019 - Exploring .NET’s memory management – a trip down m...
 
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se....NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
.NET Conf 2019 - Indexing and searching NuGet.org with Azure Functions and Se...
 
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
CloudBurst 2019 - Indexing and searching NuGet.org with Azure Functions and S...
 
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and SearchNDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
NDC Oslo 2019 - Indexing and searching NuGet.org with Azure Functions and Search
 
Approaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days PolandApproaches for application request throttling - Cloud Developer Days Poland
Approaches for application request throttling - Cloud Developer Days Poland
 
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
Indexing and searching NuGet.org with Azure Functions and Search - Cloud Deve...
 
Approaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologneApproaches for application request throttling - dotNetCologne
Approaches for application request throttling - dotNetCologne
 
CodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory laneCodeStock - Exploring .NET memory management - a trip down memory lane
CodeStock - Exploring .NET memory management - a trip down memory lane
 
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
ConFoo Montreal - Microservices for building an IDE - The innards of JetBrain...
 
ConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttlingConFoo Montreal - Approaches for application request throttling
ConFoo Montreal - Approaches for application request throttling
 
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
Microservices for building an IDE – The innards of JetBrains Rider - TechDays...
 
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
JetBrains Day Seoul - Exploring .NET’s memory management – a trip down memory...
 
DotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NETDotNetFest - Let’s refresh our memory! Memory management in .NET
DotNetFest - Let’s refresh our memory! Memory management in .NET
 
VISUG - Approaches for application request throttling
VISUG - Approaches for application request throttlingVISUG - Approaches for application request throttling
VISUG - Approaches for application request throttling
 
What is going on - Application diagnostics on Azure - TechDays Finland
What is going on - Application diagnostics on Azure - TechDays FinlandWhat is going on - Application diagnostics on Azure - TechDays Finland
What is going on - Application diagnostics on Azure - TechDays Finland
 

Recently uploaded

What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
Stephanie Beckett
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Erasmo Purificato
 
The Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive ComputingThe Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive Computing
Larry Smarr
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
Awais Yaseen
 
How RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptxHow RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptx
SynapseIndia
 
UiPath Community Day Kraków: Devs4Devs Conference
UiPath Community Day Kraków: Devs4Devs ConferenceUiPath Community Day Kraków: Devs4Devs Conference
UiPath Community Day Kraków: Devs4Devs Conference
UiPathCommunity
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
HackersList
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Mydbops
 
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
Kief Morris
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
Larry Smarr
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
BookNet Canada
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
ScyllaDB
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
Neo4j
 
Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
KAMAL CHOUDHARY
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Bert Blevins
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
RaminGhanbari2
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
Bert Blevins
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
Lidia A.
 
What’s New in Teams Calling, Meetings and Devices May 2024
What’s New in Teams Calling, Meetings and Devices May 2024What’s New in Teams Calling, Meetings and Devices May 2024
What’s New in Teams Calling, Meetings and Devices May 2024
Stephanie Beckett
 

Recently uploaded (20)

What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
 
The Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive ComputingThe Rise of Supernetwork Data Intensive Computing
The Rise of Supernetwork Data Intensive Computing
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
 
How RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptxHow RPA Help in the Transportation and Logistics Industry.pptx
How RPA Help in the Transportation and Logistics Industry.pptx
 
UiPath Community Day Kraków: Devs4Devs Conference
UiPath Community Day Kraków: Devs4Devs ConferenceUiPath Community Day Kraków: Devs4Devs Conference
UiPath Community Day Kraków: Devs4Devs Conference
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
 
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - MydbopsScaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
Scaling Connections in PostgreSQL Postgres Bangalore(PGBLR) Meetup-2 - Mydbops
 
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
[Talk] Moving Beyond Spaghetti Infrastructure [AOTB] 2024-07-04.pdf
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
 
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdfBT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
BT & Neo4j: Knowledge Graphs for Critical Enterprise Systems.pptx.pdf
 
Recent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS InfrastructureRecent Advancements in the NIST-JARVIS Infrastructure
Recent Advancements in the NIST-JARVIS Infrastructure
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
 
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyyActive Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
Active Inference is a veryyyyyyyyyyyyyyyyyyyyyyyy
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
 
What’s New in Teams Calling, Meetings and Devices May 2024
What’s New in Teams Calling, Meetings and Devices May 2024What’s New in Teams Calling, Meetings and Devices May 2024
What’s New in Teams Calling, Meetings and Devices May 2024
 

Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker

  • 1. Nerd sniping myself into a rabbit hole... Streaming online audio to a Sonos speaker Maarten Balliauw @maartenballiauw
  • 2. Disclaimer I will share bits of source code where they matter, but will not be sharing the full application. I have built this application for personal and learning use, and I do not intend to share it. Don’t ask, the answer is no.
  • 4. January 2020 “Let’s replace our old speakers with new and shiny!” Requirements: “Smart” speakers that can stream from the Internet 2 for living room, 1-2 for home office
  • 9. Now what… Searched online for solutions… …all I found was excuses. Legal, patents, … Don’t really care as a consumer!
  • 12. Nerd Sniping 1. The act of presenting someone, often a mathematician/physicist with a time consuming problem or challenge (often impossible to solve or complete) in the hopes of it appealing to a person's obsessive tendencies. Urban Dictionary And https://xkcd.com/356
  • 14. What would I need? 1. Connect to speakers 2. Get MP4 URL of online video 3. Send URL to speakers 4. Enjoy music!
  • 16. Connect to speakers Connect to one speaker Play an MP3 from webserver This seems very, very promising! #!/usr/bin/env python from soco import SoCo if __name__ == '__main__’: sonos = SoCo('192.168.1.102’) sonos.play_uri('http://host/file.mp3') https://python-soco.com/
  • 17. Get MP4 URL of online video Video metadata endpoint, used by web player Returns urlencoded data about video (with JSON sprinkled in) https://www.youtube.com/watch?v=-zJoP2qPgTg  https://www.youtube.com/get_video_info?video_id=-zJoP2qPgTg
  • 18. Get MP4 URL of online video { "responseContext":{ }, "playabilityStatus":{ }, "streamingData":{ "expiresInSeconds":"21540", "formats":[ { "itag":18, "url":"https://r3---sn-uxaxoxu-cg0k.googlevideo.com/videoplayback?expire=1599574779u0026ei=mz5XX6-fKdOIgQeBp6PgDwu0026 "mimeType":"video/mp4;+codecs="avc1.42001E,+mp4a.40.2"", "bitrate":234221, "width":640, "height":360, "lastModified":"1586173729658545", "contentLength":"92057863", "quality":"medium",
  • 19. Get MP4 URL of online video More reading by Alexey Golub https://tyrrrz.me/blog/reverse-engineering-youtube Signed videos Video player JS code contains decryption routine as JavaScript Need to evaluate that to be able to access video (or Regex the cipher) Too much hassle to write manually! There exist scripts & libraries in many programing languages In summary: we have the MP4 URL now.
  • 20. Send URL to speakers #!/usr/bin/env python from soco import SoCo if __name__ == '__main__’: sonos = SoCo('192.168.1.102’) sonos.play_uri('http://host/file.mp4') https://python-soco.com/ Expected: Actual:
  • 22. Side track: speaker webserver Anything useful to find? http://192.168.1.123:1400/status http://192.168.1.123:1400/support/review http://192.168.1.123:1400/tools.htm https://bsteiner.info/articles/hidden-sonos-interface
  • 24. 💡 Maybe it’s that SoCo library! “Because maybe 65 contributors have it wrong!” The official application can send a stream to the speakers... ...can I listen on the network and see what the request looks like?
  • 25. Sniffing the network WireShark https://www.wireshark.org/ Sniff traffic that passes your computer’s network adapter Traffic does not pass my computer :-/ Phone on wifi, speaker on wifi, computer on wifi – huh? Turns out access point does just send all traffic to all devices 💡💡 Unifi access point is *nix tcpdump there?
  • 26. Sniffing the network 🤓 On my Windows box, connected to wired network Run Ubuntu SSH into access point and run tcpdump Pipe data back to Windows Access point IP Capture ethernet side From/to my phone IP
  • 28. Your fancy wifi speaker uses SOAP
  • 29. SOAP payload <?xml version="1.0" encoding="UTF-8"?> <s:envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingstyle="http://schema <s:body> <u:setavtransporturi xmlns:u="urn:schemas-upnp-org:service:AVTransport:1"> <instanceid>0</instanceid> <currenturi>x-rincon-mp3radio://host/media.mp3</currenturi> <currenturimetadata> <DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http <item id="R:0/0/6" parentID="R:0/0" restricted="true"> <dc:title>Title here</dc:title> <upnp:class>object.item.audioItem.audioBroadcast</upnp:class> <upnp:albumArtURI>https://host/art.jpg</upnp:albumArtURI> <r:description>Description here</r:description> <desc id="cdudn" nameSpace="urn:schemas-rinconnetworks-com:metadata-1- </item> </DIDL-Lite> </currenturimetadata> </u:setavtransporturi> </s:body> </s:envelope>
  • 30. Replaying SOAP payload Tried MP3 URLs and MP4 URLs MP3 worked, MP4 did not The SoCo library did not have any issues... Searched around for DIDL-Lite in payload Seems speakers use good old UPnP http://www.upnp.org/schemas/av/didl-lite-v2.xsd
  • 31. 💡 Maybe it’s the MP4 format! https://support.sonos.com/s/article/79?language=en_US
  • 32. Our (potential) options... Download MP4, push it to speaker as a local file or Proxy MP4 and do on-the-fly transcoding to MP3 Send MP3 URL as “Internet Radio” or Investigate MP4 and see if they indeed use AAC Send AAC URL as “Internet Radio”
  • 34. MP4 MPEG-4 Part 14 or MP4 is a digital multimedia container format most commonly used to store video and audio, but it can also be used to store other data such as subtitles and still images. (…) allows streaming (…) Wikipedia Can we extract this to a separate file? MP4 file Header Video 1 Video N Audio 1 Audio N Subtitles MP4 file (optimized for streaming) Header Video 1 (short) Audio 1 (short) Video N (short) Audio N (short)
  • 35. FFMpeg to the rescue! “A complete, cross-platform solution to record, convert and stream audio and video.” Swiss army knife for video/audio formats. ffmpeg -i original.mp4 -c:a copy output-aac.m4a Extracts the audio track from MP4 container Use SoCo to send file to speakers. https://ffmpeg.org/ Expected: Actual:
  • 37. deadf00d “How I hacked Sonos and YouTube in the same day.” https://www.deadf00d.com/post/how-i-hacked-sonos-and-youtube-the-same-day.html @deadf0od - https://twitter.com/deadf0od “HEY, kAn 1 Dm J00? w0rK1n' 0N 51M1Lar 7h1n' AnD wE M19h7 8E a8le 70 HElP EaCH 07heR.” ... “It’s AAC, but in ADTS format. Each atom needs a header in every frame!”
  • 39. MP4 to AAC with ADTS ffmpeg -i original.mp4 -acodec copy -f adts -vn output-adts.aac Extracts the audio track from MP4 container Adds ADTS headers Use SoCo to send file to speakers. Expected: Actual:
  • 41. Let the app building start! 1. Connect to speakers ✅ 2. Get MP4 URL of online video ✅ 3. (new) Extract MP4 audio track to ADTS ✅ 4. Send URL to speakers ✅ 5. Enjoy music!
  • 43. Technology choices Native app? Xamarin? Flutter? Jetpack Compose? 🤓♂️ Installed Android Studio as it’s similar to JetBrains Rider, IntelliJ IDEA, ...
  • 44. Getting started… Template Start with empty and add things? Start with <any> and remove things? Language Java? Kotlin?
  • 47. Research… Android-specific Activity (main screen to handle everything) Intent (ACTION_SEND to receive data from others) Libraries (or code) YouTube metadata extractor (get audio URL) Sonos communication library (discover speakers, send URL to speakers) Webserver (reverse proxy) Something to do the MP4 to AAC (ADTS) conversion
  • 48. It all starts with a manifest! <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="be.maartenballiauw.android.sonostube"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:usesCleartextTraffic="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="youtu.be" android:mimeType="text/*"/> <data android:scheme="https" android:host="youtube.com" android:mimeType="text/*"/> <data android:scheme="https" android:host="www.youtube.com" android:mimeType="text/*"/> </intent-filter> </activity> </application> </manifest>
  • 49. And checking the intent… class MainActivity : CoroutineScope, AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val url = intent?.extras?.getString(Intent.EXTRA_TEXT)
  • 51. SSDP Simple Device Discovery Protocol Used to discover printers, routers, Sonos, ... Send UDP datagram as multicast/broadcast M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" MX: 1 ST: urn:schemas-upnp-org:device:ZonePlayer:1 Devices send back HTTP response as UDP Supported services, endpoint URL, ... https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol https://github.com/vmichalak/ssdp-client
  • 52. Android – Running webserver Prevent server stop when application is closed or device goes to sleep <service android:name=".RunEmbeddedWebServerService" android:enabled="true" android:exported="true" /> class RunEmbeddedWebServerService : CoroutineScope, Service() { private val server = embeddedServer(Netty, 36362) { routing { get("/{videoId}.mp4") { /* ... */ } } } override fun onStartCommand(...): Int { server.start(wait = false) return START_NOT_STICKY } override fun onDestroy() { server.stop(0, 1000) super.onDestroy() } https://developer.android.com/guide/components/services#Types-of-services
  • 53. MP4 to ADTS – FFMpeg?
  • 54. MP4, ADTS, Atoms, Boxes https://www.deadf00d.com/post/how-i-hacked-sonos-and-youtube-the-same-day.html
  • 55. MP4, ADTS, Atoms, Boxes MP4 with AAC Audio (simplified) ADTS with AAC Audio (simplified) moof “Hey, 25 samples coming. 128kbps, 2 channel audio!” mdat Raw, binary data for 25 samples. moof “Hey, 12 samples coming. 128kbps, 2 channel audio!” mdat Raw, binary data for 12 samples. Header “40 bytes coming, 2 ch” + 40 bytes for 1 sample Header “36 bytes coming, 2 ch” + 36 bytes for 1 sample Header “42 bytes coming, 2 ch” + 42 bytes for 1 sample Header “40 bytes coming, 2 ch” + 40 bytes for 1 sample
  • 56. MP4, ADTS, Atoms, Boxes Had to manually write conversion logic... Open MP4 stream (https://github.com/sannies/mp4parser) Foreach moof, read metadata Foreach sample, write ADTS header, write sample
  • 61. In summary… Enjoy music with an app ✅ Connect to speakers ✅ Get MP4 URL of online video ✅ Extract MP4 audio track to ADTS ✅ Send URL to speakers ✅
  • 62. “Do you use it often?”
  • 63. In summary… Learned a lot of random things along the way ✅ There is so much knowledge out there! Talk to people (thanks, deadF00d!) You can build anything! Even if it seems impossible at first!

Editor's Notes

  1. https://pixabay.com
  2. Wife and I built house, set of old PC speakers. Time for a replacement! Mostly play streaming music, Spoify, TuneIn, SoundCloud, YouTube, ... Requirements: smart, so that works 2 for living room, 1 or 2 for home office, and multiroom would be even better! Unfortunately, it being January, everything out there was full-price. Not that we are cheap, but in terms of value proposition we do find 2k for some speakers a bit skewed.
  3. But then, we passed an IKEA store, and saw... Symfonisk. They are a colaboration with Sonos. Essentially, Sonos speakers, rumour has that it’s the same hardware as that Sonos from earlier, at 1/5 the price. Same software, 100% compatible with that Sonos stuff. And as you can see on the picture, I can even put my glasses on top of it. Listened to it in the store, and seemed fine. DEAL! We walked out with those speakers.
  4. So we took them home (click) Read the manual (click) Followed all instructions, so we took a seat (click) And installed, the app!
  5. It was brilliant. We were able to tune a local radio station on TuneIn, push a playlist from Spotify to those speakers, and listen downstairs and upstairs. We were almost in love with this new setup. SO GOOD.
  6. There’s this video streaming site that lets me cast videos to my TV, and very often there is good music to be found as well. This is where the honeymoon phase with our new speakers ended. There is no support to cast video, or at least the audio of a video, to our smart speakers. NOT VERY SMART!
  7. Now what? And yes this slide looks bad. But this was our feeling! Searched online, but all I could fine were excuses. These two companies are fighting patents, and generally not playing nice together. I don’t care as a consumer! But no way around it, this is what it was going to be.
  8. In one of my searches, I did find an app which seemed to sort of do what I was after. Except, yet another party to give permissions to. Why can’t I just use the “Share” button in that other app?
  9. But then I found this page on the Sonos website. Supported audio formats: MP4. And that streaming website is MP4. How hard can it be to push the video/audio URL to the device and be done with it?
  10. Mention colleague usually snipes, although I have become proficient at sniping myself. Whih is not ideal.
  11. Puting those steps in an app should be easy once the individual steps work.
  12. So a few Google searches later, I found this Python library, SoCo. It supports writing Python, or use command line to do things like discover speakers, change volume, play music, ... This seemed great! So I went of and installed a Python environment.
  13. That did not work... Actual is wrong, it did say “pop” about a second after a send.
  14. HUH? Now what?
  15. Check some Sonos web UI, do some pinging/traceroute/...
  16. Irony: finding a license free picture of a rabbit hole was quite the rabbit hole in itself.
  17. Narrator: They don’t have it wrong.
  18. Narrator: They don’t have it wrong.
  19. ssh admin@192.168.1.216 "tcpdump -s0 -U -n -w - -i eth0 host 192.168.1.195" > /mnt/c/Users/maart/Desktop/capture
  20. Find from/to that matches
  21. Follow TCP stream, and see payload!
  22. Nice! Pass URL, title, description and album art!
  23. The SoCo library did not have any issues, it seems. Who would have thought. UPnP! Not sure what that knowledge brings, but does mean there migh be more documentation out there.
  24. MP4 does not support streaming... Only local library. Should I sniff payloads to se what is sent if I play MP4 from my phone library? Seems like good fallbak in case needed, but ideally don’t want to download the full video first, then upload to the speaker. I want close to instant! Maybe I could transcode MP4 to MP3 on the fly? Rabbit hole is deep enough as it is... AAC does seem to work for Internet radio. And AAC is the audio compression format used in many MP4 files... Could this be an option?
  25. Let’s talk a bit about containers.
  26. Explain container format. Analogy: a ZIP file (but it’s not a ZIP file).
  27. Frustration. But, we’re now so deep in the rabbit hole, this SHOULD work, right? RIGHT???? What do developers do when something does not work? Google! All sites I found had “visited” color, damned! But on page 25 of some search I did, I found somthing...
  28. I found a hacker! Who was investigating the same stuff... Since then, he did elaborate on the entire process, but back then he was around the same stage as I was in this investigation. “hey, can i dm you? working on similar thing and we might be able to help each other.” We startd chatting, and at some point he says to me: “It’s AAC, but in ADTS format. Each atom needs a header in every frame!”
  29. WAT?
  30. All we need now is an app!
  31. Also, I know NOTHING about Android development Went wth Android Studio, at least I know the general workings of the IDE, as it’s the same base IDE as IntelliJ and Rider.
  32. Started with empty activity. It’s debatable, but I prefer clean templates that I can add incremental things to, as opposed to full-blown templates that I have no idea what they are doing. Could have picked Java, but chose Kotlin. It’s the de-facto Android language nowadays, and it’s very similar to C# - my “mother tongue” in programming languages, so to speak. Also fully compatible with Java, so can use any libraries out there and whn needed, even mix languages in one project.
  33. NOW WHAT? Decided to start with the most important thing...
  34. Behold, the UI design! This is also the final design of the app.
  35. Activity already present, added the intent filter to accept URL data with https and something that looks like YouTube.
  36. Based on a null check, we can do other things. So with that out of the way, we can start building! Explain coroutine scope, it’s to enable async/await like features in Kotlin for this class.
  37. Went to packages tab (package search plugin), and started adding random things that matched what I was after. Ktor I knew from my colleague, who is building it out, and is a webserver/client framework.
  38. Turns out there are many packages that can help run FFMpeg, even on android! They are wrappers, and “sort of” run command line. Which means we would have to download MP4 first, convert to ADTS, then stream to device. Workable for 2-3 minute songs, but for a 1h30 DJ set that is 250 MB, it’s not ideal. We’re also messing up temporary storage on the device and all. I want close to zero delay between playing and the stream starting!
  39. Explain MP4 is a set of boxes, lots of pointers. But we will try to better visualize on the next slide.
  40. Explain logic of injecting ADTS header for each frame
  41. Start with AndroidManifest.xml, mention more than we saw on slides. For example, permissions. Trial and error, based on what I was doing Android would throw an exception telling me which permission I was missing. MainActivity - onCreate Extract YouTube URL If found, discover Sonos devices - discoverSonosDevices() Explain withContext(Dispatchers.IO) { - run this on IO thread Discover using multicast Discover using broadcast Look at code for those If devices found, prompt using AlertDialog builder When device selected, trySetupStreamingFor Get YouTube metadata Generate video URL on local IP address (wifi only) Extract album art and all device.playUri(....) using that SOAP request from earlier onCreate also started a webserver, which runs as a foreground service Needed to make sure our server keeps running even if we’re doing other stuff on our phone RunEmbeddedWebServerService get("/{videoId}.mp4") Extract metadata again, get MP4 audio URL Run MP4AacToAdtsAacConverter on the MP4 URL stream, using AacAdtsWriter MP4AacToAdtsAacConverter is something I had to cook up. Lots of trial and error, and deadF00d helped with insights Parse boxes, read header, then skip to samples and push those out with ADTS header each time AacAdtsWriter - go through the byteshifting...
  42. I recorded a demo back in january, but I think I look a bit tired there. So lt’s do that aga
  43. All we need now is an app!
  44. All we need now is an app!
  45. All we need now is an app!