Jump to content
C4 Forums | Control4

touch screen and "now playing" with CD changers


ziocan

Recommended Posts


I don't think this is about 'ease'

Ha

I thought for all of 10 minutes about getting a DVD/BD changer for the stack of discs. Then I discovered UV and that a couple of 4GB hdds in my synology was quicker and easier and I moved on.

I think I could have ripped these 400 discs to a hdd, tagged them, added artwork and had them in MyMusic before OP gets this displaying in the touch screen.

Link to comment
Share on other sites

Well that was easy enough.

Interesting stuff on the wire... this is an extract from when a touch screen reboots, we can spoil the various SOAP commands used to interact with director... I wonder what SPECIAL AUDIO means?

<c4soap name="SendToDevice" async="False" seq="196"><param name="iddevice" type="number">6</param><param name="data" type="string"><devicecommand><command>GET_MOVIE_DEVICES</command><params><param><name>storage</name><value type="INT"><static>1</static></value></param></params></devicecommand></param></c4soap>
<c4soap name="SendToDevice" seq="196" result="1"><sources><source><id>94</id><type>VIDEO_SELECTION</type></source><source><id>14</id><type>COMPONENT</type></source><source><id>357</id><type>COMPONENT</type></source><source><id>356</id><type>COMPONENT</type></source><source><id>355</id><type>COMPONENT</type></source><source><id>354</id><type>COMPONENT</type></source><source><id>353</id><type>HDMI</type></source><source><id>352</id><type>COMPONENT</type></source><source><id>351</id><type>COMPONENT</type></source><source><id>349</id><type>HDMI</type></source><source><id>328</id><type>HDMI</type></source><source><id>251</id><type>AUDIO_MEDIA_STORAGE</type></source></sources></c4soap>

<c4soap name="SendToDevice" async="False" seq="190"><param name="iddevice" type="number">6</param><param name="data" type="string"><devicecommand><command>GET_MUSIC_DEVICES</command><params><param><name>storage</name><value type="INT"><static>1</static></value></param></params></devicecommand></param></c4soap>
<c4soap name="SendToDevice" seq="190" result="1"><sources><source><id>14</id><type>DIGITAL_COAX</type></source><source><id>357</id><type>HDMI</type></source><source><id>356</id><type>HDMI</type></source><source><id>355</id><type>HDMI</type></source><source><id>354</id><type>STEREO</type></source><source><id>353</id><type>STEREO</type></source><source><id>352</id><type>STEREO</type></source><source><id>351</id><type>HDMI</type></source><source><id>350</id><type>STEREO</type></source><source><id>349</id><type>AUDIO_SELECTION</type></source><source><id>328</id><type>HDMI</type></source><source><id>100002</id><type>DIGITAL_AUDIO_CLIENT</type></source><source><id>402</id><type>DIGITAL_AUDIO_SERVER</type></source><source><id>251</id><type>AUDIO_MEDIA_STORAGE</type></source></sources></c4soap>

<c4soap name="SendToDevice" async="False" seq="188"><param name="iddevice" type="number">6</param><param name="data" type="string"><devicecommand><command>GET_LISTEN_DEVICES</command><params><param><name>storage</name><value type="INT"><static>1</static></value></param></params></devicecommand></param></c4soap>
<c4soap name="SendToDevice" seq="188" result="1"><sources><source><id>4294966298</id><type>SPECIAL_AUDIO</type></source><source><id>4294966299</id><type>SPECIAL_AUDIO</type></source><source><id>14</id><type>DIGITAL_COAX</type></source><source><id>272</id><type>HDMI</type></source><source><id>357</id><type>HDMI</type></source><source><id>356</id><type>HDMI</type></source><source><id>355</id><type>HDMI</type></source><source><id>354</id><type>STEREO</type></source><source><id>353</id><type>STEREO</type></source><source><id>352</id><type>STEREO</type></source><source><id>351</id><type>HDMI</type></source><source><id>350</id><type>STEREO</type></source><source><id>349</id><type>AUDIO_SELECTION</type></source><source><id>328</id><type>HDMI</type></source><source><id>100002</id><type>DIGITAL_AUDIO_CLIENT</type></source><source><id>402</id><type>DIGITAL_AUDIO_SERVER</type></source><source><id>251</id><type>AUDIO_MEDIA_STORAGE</type></source></sources></c4soap>

<c4soap name="SendToDevice" async="False" seq="124"><param name="iddevice" type="number">482</param><param name="data" type="string"><devicecommand><command>NAVSTATE_GET</command><params /></devicecommand></param></c4soap>
<c4soap name="SendToDevice" seq="124" result="1"><NAV_STATE><state><object name="data"><object name="saved_appList"><array name="items"><object name="0"><value val="1" type="number" name="type"/><value val="C4_weatherApp" type="string" name="appId"/><value val="Weather" type="string" name="name"/><value val="1_1" type="string" name="version"/><value val="1-C4_weatherApp-1_1-icon.swf" type="string" name="icon"/><value val="4247" type="number" name="iconSize"/><value val="e13bfdb3560e86f5c0eb564adfc16bd5" type="string" name="iconMd5"/><value val="1-C4_weatherApp-1_1.swf" type="string" name="file"/><value val="370876" type="number" name="fileSize"/><value val="4d3fd98e70b97fd69d539b9184bd75af" type="string" name="fileMd5"/><array name="resolutions"><value val="1" type="string" name="0"/><value val="2" type="string" name="1"/><value val="3" type="string" name="2"/><value val="4" type="string" name="3"/><value val="5" type="string" name="4"/><value val="" type="string" name="5"/></array><value val="false" type="boolean" name="beta"/><value val="true" type="boolean" name="builtIn"/></object><object name="1"><value val="1" type="number" name="type"/><value val="C4_news" type="string" name="appId"/><value val="News" type="string" name="name"/><value val="1_1" type="string" name="version"/><value val="1-C4_news-1_1-icon.swf" type="string" name="icon"/><value val="4403" type="number" name="iconSize"/><value val="0d295abbbf86b5b14293c2d730fa3eb9" type="string" name="iconMd5"/><value val="1-C4_news-1_1.swf" type="string" name="file"/><value val="194576" type="number" name="fileSize"/><value val="147e9d328ff0f462ecb35795fb7f00f6" type="string" name="fileMd5"/><array name="resolutions"><value val="1" type="string" name="0"/><value val="2" type="string" name="1"/><value val="3" type="string" name="2"/><value val="4" type="string" name="3"/><value val="5" type="string" name="4"/><value val="" type="string" name="5"/></array><value val="false" type="boolean" name="beta"/><value val="true" type="boolean" name="builtIn"/></object><object name="2"><value val="1" type="number" name="type"/><value val="C4_appstore" type="string" name="appId"/><value val="4Store" type="string" name="name"/><value val="1_4" type="string" name="version"/><value val="1-C4_appstore-1_4-icon.swf" type="string" name="icon"/><value val="3349" type="number" name="iconSize"/><value val="1ebc72f51ce52f904be0f5ee9c931dcf" type="string" name="iconMd5"/><value val="1-C4_appstore-1_4.swf" type="string" name="file"/><value val="346900" type="number" name="fileSize"/><value val="934941efd976d214e9ec9b87d8583fec" type="string" name="fileMd5"/><array name="resolutions"><value val="1" type="string" name="0"/><value val="2" type="string" name="1"/><value val="3" type="string" name="2"/><value val="4" type="string" name="3"/><value val="5" type="string" name="4"/><value val="" type="string" name="5"/></array><value val="false" type="boolean" name="beta"/><value val="true" type="boolean" name="builtIn"/></object></array><value val="2.1" type="string" name="version"/><value val="********" type="string" name="user"/><value val="1109302822571377012b7ed4.82487795" type="string" name="token"/><value val="*********" type="string" name="password"/></object><value val="E10B03AE-6BCF-EE4D-6CBB-00052FBBEA5B" type="string" name="__SO_ID__"/><array name="arrWirelessNetworks"/><value val="300" type="number" name="ScreenSaverTimeout"/><value val="1461144632899" type="number" name="timestamp"/><value val="1" type="number" name="ScreenSaverMode"/><value val="0" type="number" name="BacklightOffTimeout"/><value val="0" type="number" name="SuspendTimeout"/><value type="xml" name="folderItems"><FolderItems><item translate="true" hidden="false" children="0" canOrganize="false" readOnly="false" type="folder" icon="nav_ddbtnico_favorites.png" name="Favorites" id="1"/><item id="0" type="CustomButtons"/></FolderItems></value><value val="1" type="string" name="favoritesRoot"/><value val="false" type="boolean" name="ScreenSaverShuffle"/><value val="30" type="number" name="ScreenSaverPhotoTimeout"/><array name="arrDirectorEntries"/><value val="0" type="number" name="lightingActiveTab"/><value val="type" type="string" name="MotorsSort"/><value val="true" type="boolean" name="BrowseCDGrid"/><value val="27" type="number" name="ScreenSaverCustomMode"/><object name="customHome"><value val="0" type="number" name="retmode"/><value val="0" type="number" name="viewid"/><value val="413" type="number" name="roomid"/></object></object></state></NAV_STATE></c4soap>

 

There is also license information... :-)

 

<c4soap name="SendToDeviceAsync" async="True"><param type="number" name="iddevice">100117</param><param type="string" name="data"><devicecommand><command>GetState</command><params></params></devicecommand></param></c4soap>
<c4soap name="OnDataToUI" result="0" async="1"><param name="iddevice" type="ulong">100117</param><param name="time" type="ulong">1461147555</param><param name="data" type="xml"><GetState><ServiceConnectionsAllowed>true</ServiceConnectionsAllowed><Status>Disconnected</Status><ClientSideCertExists>true</ClientSideCertExists><GetServiceList><Service>ANDROID:50</Service><Service>AlbumSearch</Service><Service>AllowSupport</Service><Service>BroadcastSearch</Service><Service>DiscChangerScan</Service><Service>DiscSearch</Service><Service>GENERICNAVFULL</Service><Service>GENERICNAVFULL:50</Service><Service>INTERCOM:1</Service><Service>IPADFULL:50</Service><Service>IPFULL:50</Service><Service>IPLIT:0</Service><Service>IPMUS:0</Service><Service>MediaScan</Service><Service>MovieSearch</Service><Service>Rhapsody</Service></GetServiceList></GetState></param></c4soap>

 

I will try to sniff the touch screen session during changer operation, to see what goes on the wire... maybe something useful will turn out, and then hopefully  c4soap can be used to talk to navigator directly without need to go through the proxy.  

 

Link to comment
Share on other sites

Thanks Gogo.

So, it appears that when the disc changer event fires, the navigators fire this request to director:

<c4soap name="SendToDevice" async="False">
	<param name="iddevice" type="number">413</param>
	<param name="data" type="string">
		<devicecommand>
			<command>GET_AUDIO_MEDIA</command>
			<params>
				<param>
					<name>type</name>
					<value type="STRING"><static>ALBUM_MP3</static></value>
				</param>
				<param>
					<name>category</name>
					<value type="STRING"><static>artist</static></value>
				</param>
			</params>
		</devicecommand>
	</param>
</c4soap>


<c4soap name="SendToDevice" seq="236" result="1"><media><artists/></media></c4soap>

They ask the room (413 in this case) what the new current playing media is. Of course, no mp3 here so the answer is just an empty information.

Perhaps I need to find a way to inject this information into the room somehow?

 

 

Link to comment
Share on other sites

Here we go....  a custom button that calls an announcement to show what's playing when pressed,

plus an automatic announcement when the track changes with auto dismissal.

The whole information is taken from a variable exported by my driver.

Now looking to integrate the cover art into the announcement.... :-)

 

IMG_4864.JPG

IMG_4865.JPG

Link to comment
Share on other sites

Here we go....  a custom button that calls an announcement to show what's playing when pressed,

plus an automatic announcement when the track changes with auto dismissal.

The whole information is taken from a variable exported by my driver.

Now looking to integrate the cover art into the announcement.... :-)

Congratulations. It still takes up 6 more RU than a ssd.

Link to comment
Share on other sites

Here we go....  a custom button that calls an announcement to show what's playing when pressed,

plus an automatic announcement when the track changes with auto dismissal.

The whole information is taken from a variable exported by my driver.

Now looking to integrate the cover art into the announcement.... :-)

Congratulations. It still takes up 6 more RU than a ssd.

Link to comment
Share on other sites

I don't have a rack, I have a custom built piece of furniture that holds the 777, my Nakamichi Dragon :-), the amp and an HC-300.

I understand that you prefer to have anything on HDD, but I am an IT guy and see HDDs fail every day. A DVD or CD never fails, and if the changer fails you get a new (used) one for $100 (BTW I have two 777's and they are rock solid).

HDD = need to take care of backups too (thought about that?) not mention that for purists, that is a NO GO.

No I'm not a purist I like old tech and to keep my DVD and CD collection original.

Link to comment
Share on other sites

Cover art problem solved (in 15 minutes... thought I'd have more fun with that!!)

The funny thing is, I have seen many 3rd party drivers building http servers in the LUA code to serve HTML and/or images.

WHY??? the controllers have lighttpd web server running already. Let's use it and not reinvent the wheel!

A 5 line long cgi bash script is enough to fetch the cover art and send it to navigators... see code below.

But first the obligatory screenshot... :-)

 

 

IMG_4866.JPG

Link to comment
Share on other sites

As an owner of a custom integration company I am VERY impressed at what you have done without any C4 programming experience or software. Not just the fact that you got it to work, but your determination to making it work despite others telling you you're wasting your time.

Great job!

Link to comment
Share on other sites

The CGI script that serves the page. The announcement URL points to this script's URL. My driver writes the path to artwork in that file that this script reads.

#!/bin/sh
#
ALBUM_ROOT=/mnt/media/images/album
cover_path=$(cat /control4/drivers/lua/sandbox/*/now_playing_cover.txt)
echo -e "Content-type: image/jpeg\r\n"
cat $ALBUM_ROOT/$cover_path.jpg
exit 0

 

Link to comment
Share on other sites

Quote
5 minutes ago, ziocan said:

The funny thing is, I have seen many 3rd party drivers building http servers in the LUA code to serve HTML and/or images.

WHY???

The answer is that most dealers and programmers do not have the necessary programming skills. I am sure quite a few do not even know how to write a "hello world" cgi script.

Let alone write a

Quote
8 minutes ago, ziocan said:

A 5 line long cgi bash script

 

Again, congrats!

 

Link to comment
Share on other sites

28 minutes ago, GoGo Delicious said:

The answer is that most dealers and programmers do not have the necessary programming skills. I am sure quite a few do not even know how to write a "hello world" cgi script.

Don't think so. Writing an HTTP server in LUA is no joke. I think the skills are there, what's missing is perhaps the curiosity to learn controller's internals, which is what allowed me to solve my problem. 

Thank you for your appreciation. But I am especially happy to have reached my goal :-) And I have learned a lot along the way.

I only wish I had a more decent documentation, the SDK is a joke. Perhaps the driver editor has more info coming with it, I don't know...

 

 

Link to comment
Share on other sites

28 minutes ago, ziocan said:

I think the skills are there, what's missing is perhaps the curiosity to learn controller's internals

For some the skill will be there, though I dare say many, perhaps most, do not (one could say our company has three programmers, yet I would bet only one of us would be able to do what you did) - but more often it's the problem of time, not curiosity - plus weighing time vs need.

And like I said, technically you haven't "solved" the initial issue of this not showing under now playing, the bottom info bar or the media screen saver :ph34r:, though it's a neat way to bypass that, using the pop-up with a url call. Now, on to rewriting the DVD changer driver to the iPod or media player proxy ;).

Link to comment
Share on other sites

As an owner of a custom integration company I am VERY impressed at what you have done without any C4 programming experience or software. Not just the fact that you got it to work, but your determination to making it work despite others telling you you're wasting your time.

Great job!

I'm impressed also but feel this is reinventing wheels. Except that image grab last part.

I don't have a rack, I have a custom built piece of furniture that holds the 777, my Nakamichi Dragon :-), the amp and an HC-300.

I understand that you prefer to have anything on HDD, but I am an IT guy and see HDDs fail every day. A DVD or CD never fails, and if the changer fails you get a new (used) one for $100 (BTW I have two 777's and they are rock solid).

HDD = need to take care of backups too (thought about that?) not mention that for purists, that is a NO GO.

No I'm not a purist I like old tech and to keep my DVD and CD collection original.

So 777s fail juSt like hdds with more moving parts.

Purists can deal with flax or bit perfect copies and a good dac.

I have a raid 1 backup on my synology and an attached my book and a offsite older copy at the in laws.

If all else fails I crack open the cardboard boxes of silver discs.

Oh and silver discs do rot.

I thought about adding the DVD version to my stsyem but in the end backing up the discs and a popbox made more sense.

Link to comment
Share on other sites

12 hours ago, Cyknight said:

Nicely done - though your are essentially bypassing the original goal of having this showing under now playing as well as screensavers media art.

;)

True. But I found that I really like the auto popup every time a new song starts. Don't think you can do that with media proxy, can you?

Actually I tried to look into the Media Proxy thing, but the lack of proper documentation and the added complexity to have to proxy a proxy (assuming that is possible) made me look for alternatives.

 

Link to comment
Share on other sites

12 hours ago, Cyknight said:

 technically you haven't "solved" the initial issue of this not showing under now playing, the bottom info bar or the media screen saver :ph34r:

I haven't investigated the screen saver part in fact, but I can eventually give it a try ;-)  It all depends whether this information is stored in director vs into navigator.

Right now  the auto popup will just wake up the touch screen from whatever screen saver it has, and display the info for 10 seconds. Neat enough :-)

 

Quote

Now, on to rewriting the DVD changer driver to the iPod or media player proxy

 

I wish I could do that. The changer proxy, and all other proxies for that matter, are  binary only. But I can program with C/C++ just send me the source code of the driver .....  :-)

Speaking of the changer driver - if you look on the controller you can actually find a 2-way changer driver written in LUA. It could be that at some point in time, C4 produced/sold a disc changer (maybe a rebranded one), or at least wanted to.  It controls the changer via RS232, but unfortunately the command set is not the 777 command set so it would take a lot of effort to adapt that, plus bugs would be introduced, etc... 

 

    <copyright>Copyright 2008 Control4 Corporation.  All rights reserved.</copyright>
    <manufacturer>Control4</manufacturer>
    <version>2</version>
    <creator>Control4</creator>
    <created>08/12/2008 12:30 PM</created>
    <modified>08/12/2008 12:30 PM</modified>
    <model>Control4 DVD Changer</model>
    <composer_categories>
        <category>Audio/Video</category>
    </composer_categories>
    <front/>
    <back/>
    <top/>
    <bottom/>
    <left/>
    <right/>
    <capabilities>
        <serialsettings>115200 8 none 1 none</serialsettings>
        <can_poll_serial>False</can_poll_serial>
        <can_scan_media>True</can_scan_media>
        <has_direct_disk_access>True</has_direct_disk_access>
        <has_direct_track_access>True</has_direct_track_access>
        <media_count>400</media_count>
        <media_type>5</media_type>
    </capabilities>

 

Link to comment
Share on other sites

2 minutes ago, Cyknight said:

Those are likely just example drivers included in the system, places to work from, and/or learn from. You'll find 'control4' gear in numerous categories for that purpose.

Well why upload them on the controller then?  Don't think that average dealer will go looking on the controller for these.

Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.