Skip to content

Commit

Permalink
0.2.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
philippe44 committed Aug 15, 2015
1 parent b6b76ae commit a1c0ab1
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 21 deletions.
9 changes: 6 additions & 3 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
0.2.4.dev.1
- Some players (moode) open the URL on SETURI, then close and re-open it on PLAY. But re-open might be received before close (threading), causing confusion with a double-open request. So use a mutex with timeout in sq_open
0.2.4.0
- add ARMv5 binary
- When creating a UPnP renderer, set state(s) to STOP
- Some players (moode) open the URL on SETURI, then close and re-open it on PLAY. But re-open might be received before close (due to threading), causing confusion with a double-open request. So use a mutex with timeout in sq_open
- create a fake pthread_mutex_timedlock for OSX
- Send SetPlayMode to NORMAL at each play (some players by default are in auto_repeat mode)
- DLNA.ORG_OP set to 00 (limited random availability)
Expand All @@ -9,7 +11,8 @@
- Add <null_volume> when set (default) allow 0 to be set as volume
- (P) increase web UI log line to 200
- (P) manual now available to view in a web browser tab
- (p) add option to delete a player
- (P) add option to delete a player
- (P) enable/disable from the list did not work if selected player was 'default'

0.2.3.0 (plugin)
- when log is disable, no log shall be generated eveen if extra debug options are set
Expand Down
2 changes: 2 additions & 0 deletions application/squeeze2upnp/squeeze2upnp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1210,6 +1210,8 @@ static bool AddMRDevice(struct sMR *Device, char *UDN, IXML_Document *DescDoc, c
Device->ErrorCount = 0;
Device->Running = true;
Device->InUse = true;
Device->sqState = SQ_STOP;
Device->State = STOPPED;
strcpy(Device->UDN, UDN);
strcpy(Device->DescDocURL, location);
strcpy(Device->FriendlyName, friendlyName);
Expand Down
2 changes: 1 addition & 1 deletion application/squeezetiny/squeezedefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

//#define __EARLY_STMd__

#define VERSION "v0.2.4.dev.1"
#define VERSION "v0.2.4.0"

#if defined(linux)
#define LINUX 1
Expand Down
171 changes: 171 additions & 0 deletions plugin/CHANGELOG
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
0.2.4.0
- add ARMv5 binary
- When creating a UPnP renderer, set state(s) to STOP
- Some players (moode) open the URL on SETURI, then close and re-open it on PLAY. But re-open might be received before close (due to threading), causing confusion with a double-open request. So use a mutex with timeout in sq_open
- create a fake pthread_mutex_timedlock for OSX
- Send SetPlayMode to NORMAL at each play (some players by default are in auto_repeat mode)
- DLNA.ORG_OP set to 00 (limited random availability)
- cli_send_cmd must return NULL only if command is not responded, otherwise allow respond with an empty string
- sq_set_time: double format shoudl be %.1f not %.1lf
- Do not send self-generated volume command on unpause, wait for the real volume request
- Add <null_volume> when set (default) allow 0 to be set as volume
- (P) increase web UI log line to 200
- (P) manual now available to view in a web browser tab
- (P) add option to delete a player
- (P) enable/disable from the list did not work if selected player was 'default'

0.2.3.0 (plugin)
- when log is disable, no log shall be generated eveen if extra debug options are set
- space char instead of thab on line 186

0.2.3.0
- changing naming
- cleaning LOG
- AIFF problem is for all versions before 7.9
- AIFF partial header' in not sent in LMS < 7.9 when transcoding happens, so try to detect source file format
- aif removed from default codec list, too troublesome
- fwrite for 24 bits pcm was not using adjusted buffer size
- Support fully AIFF => build header on the fly
- Use TrackURI from GetPositionInfo and not from GetMediaInfo - this is more reliable and saves one polling UPnP request
- by default, only use pcm in <raw_audio_format> because wav and aiff require a filesize and some players are stuck on the current URI when the whole size has not been received
- Some players do not fill "TrackURI" so get it from "TrackMetaData"
- add <log_limit> to limit the size of logfile
- by default, codecs are <pcm,aif,flc,mp3>
- Send a STOP to playing renderers at exit - critical otherwise libupnp does not stop (deadlock)
- when checking codecs list, 'aif' was not in the matching list for 'aif' (only audio/L and wav)
- In LMS 7.7, when sending pcm in AIFF format, there is an 8 bytes header to skip if the data is forwarded as PCM or WAV. Does not exist in 7.9 (don't know for 7.8)
- Query LMS version at discovery do differentiate between different AIFF option
- add option 2 to L24_format to truncate 24 bits in 16 bits for players that do only 16 bits (only for pm/aiff, not flac)
- MainThread only sleeps 1 sec to speed up exit
- optimize endianness changes

0.2.2.2 (not published)
- XML special char were not properly handled in DIDL header ==> moved to a full XML constructor, not a sprintf patch
- using autosave, only <device> sections are written unless there is no existing config file
- removed memory leak in SaveConfig (nodelist using wrong free)
- add the full channel and sample rate in DIDL header, not only in content-type
- OSX version is now multi-architecture, named squeeze2upnp-osx-multi
- Some players do not feel "CurrentURI" properly in GetMediaInfo. Use the "CurrentURIMetaData" and parse it instead
- Added partial AIFF support (not sending AIFF to player but accepting AIFF=PCM from LMS) ==> less byte-reordering needed
- Codecs capabilities send to LMS only include codecs supported by UPnP player
- added <raw_audio_format> as a comma-separated, ordered, list of file format sent to UPnP players amongst (pcm, aif, wav)
- added <match_endianness> to try to match (within the priority of <raw_audio_format> byte orders between LMS and player to avoid CPU consuming byte re-ordering


0.2.2.1
- mac_size in AddMR was wrong type causing a stack corruption on WinXP
- version now works for XP and above

0.2.2.0
- <buffer_dir> can be '?' (w/o the '') to enable use of default system "temp" dir (this is the default now instead of '.')
- config parameters with incorrect values (buffer_size) no longer re-written with corrected values in config
- config file generating (-i or 'save' while running )do not erase existing players
- add command line option '-Z' to disable interactive mode, allowing backgrounding using '&' in Linux (no more consumes 100% CPU)
- buffer files are now deleted each time user stops a playback unless new parameter <keep_buffer_file> is set to 1
- add <max_volume> parameter to scale and limit the <volume_curve>. Any value calculated from volume curve is scaled by <max_volume>/100
- Window version is renamed squeeze2upnp-win
- add -I command line option to auto-save config file at each scan
- some players trigger false detectio of URI change by reporting empty nextURI, so check the nextURI contains "-idx-" pattern
- when saving an existing device, the UPnP friendly name was used, even if a different name was set in configuration
- add -k option to force immediate exit on SIGINT, SIGQUIT and SIGTERM
- handle SIGINT, SIGQUIT and SIGTERM properly

0.2.1.0
- <upnp_scan_timeout> at 0 was not disabling scan
- added <upnp_remove_count> parameter to remove a device only N times after failed re-discovery
- add Ralphy's patch (SendARP) to compile for OSX
- reset read pointer in sq_read by calling fseek

0.2.0.1
- Race condition where a upnp poll-response can be interrupted by the update thread that removes that device - locking a non-existing mutex happens then
- Handle 24 bits mono tracks with PACKED format
- when <send_metadata> was disabled, some default metadata were not initialized (was missing backport from 0.1.4.0)
- very quick pause/unpause created an infinite loop (created by fixing dealock issue between upnp notification and LMS playback in 0.2.0.0)
- on quick unpause/pause, the pause command was ignored - can be irritating if unpause was pressed by mistake

0.2.0.0
- each player uses own timer thread to poll position, track and related info instead of a single thread for all players
- upnp rescan dedicated thread created at each scan interval to avoid blocking libupnp caller thread in callback
- continue re-organizing LOG
- metadata using "songinfo" CLI command to allow access to more information, includign albumart (still fallback to use "playlist" info if "songinfo" fails)
- on <accept_next_uri> = 0, metadat was not properly handled, leading to random filesize being sent
- add <upnp_scan_timeout> to configure how long a network player *rescan* lasts (initial scan is still 15)
- <upnp_scan_interval> is 30 seconds minimum
- When skipping track very quickly, a "playing" state of previous skip could be received before the "stopped" state or last skip, causing player to stall (confused with an unsollicited play)
- force_volume was used, even when volume_on_play was set to -1 in SyncNotifyState
- option -i was broken before a5 release
- context index toggle shall be done after stream mutex lock (slimproto)
- remove deadlock between upnp notification and LMS playback request (sq_notify call in SyncNotifyState)
- global Mutex for renderer list un-necessary now that list is a table
- change some string definition to allow VC2008 compilation
- add the option to set a socket for upnp operations


0.1.4.0
- <volume_on_play> can be set to -1 so that *all* LMS volume commands are ignored (use the player's volume control)
- When pause/play directly on the player, action is feedback to LMS that should stay in sycn (still early phase ...). This does NOT work when "stop" is being used - such "stop" will be interpreted by LMS as an error and will move to next track
- if uPnP player cannot play a format, send the proper error code to LMS (also send STMc everytime) == > that's to avoid being stuck in a middle of a playlist - LMS will gently move to the next song and a squeeze2upnp will just log the problem
- add <flac_header> parameter
- add <send_metadata> parameter
- add <upnp_scan_interval> paramater (O to disable regular scan)
- building a Linux statically linked version as well (-static)
- <seek_after_pause> now 0,1 or 2 (2 restarts stream from that last sent byte - will stay undocumented as it does not seem to work)
- add -4 for <stream_length> to allow usage of unkown file size to be sent *but* not using chunked-encoding (need updated libupnp webserver.c and httpreadwrite.c), responding to open-ended request (xxx-) by HTTP 206 and range xxx-yyy/*
- add -1 for <stream_length> to allow usage of unkown file size to be sent *but* not using chunked-encoding (need updated libupnp webserver.c and httpreadwrite.c), responding to open-ended requests (xxx-) by HTTP 200 instead of 206
- add -2 for <stream_length> to allow usage of chunked-encoding (need updated libupnp webserver.c and httpreadwrite.c), and responding to open-ended requests (xxx-) by HTTP 200 instead of 206
- update DIDL-lite header to add DLNA namespace, <upnp:artist>, trackNumber and tweak other parameters
- <mac> added to each device. As pointed by ralphy, current logic was not working properly. Now, if mac predecence is 1/ mac from <device>, then mac from ARP network request, then mac from <base_mac> + n (Nth player). when "save <filename> is called, the <mac> is re-written for every device.
- add command line "-i <config file>" to discover upnp players, save config file, then exit
- add command line "-p <pidfile>" to store the pid
- "unexpected" stops managed from squeelite side instead of uPnP (NB: a "stop" from the player"s remote will cause LMS to move to next track, NOT to stop
- if <buffer_limit> is smaller than max(<streambuf_size>, <outputbuf_size>) * 4, set it to that max
- <can_pause> parameter removed
- big fat warning when config file has an error and cannot be loaded
- improve HTTP range request response (might have impact with <buffer_limit> and pause reaction)
- Update COMPATIBILITY file
- remove all warning for Linux compilation
- "cookie" is now a proper pointer, no more integer cast
- configure libupnp with disabled blocking TCP connection and gen GENA timeouts to avoid "disapearing players" to lock the job queue, ending to a "too many jobs" disaster in libupnp
- Stop sending poll request to a player that has generated more than 5 consecutives ACTION_ERROR (has disappeared probably)
- for each player, check that <buffer_dir> is accessible in WRITE mode (and remove device if it is not)
- Improved cleanup on exit() to avoid coredump
- Improved LMS device deletion when upnp device disappears
- When the same uPnP player disappears and re-apppears, re-connect was not working
- Removed all memory leaks found by valgrind
- metadata request can cause a fault if the list has been emptied (modulus 0 call)
- when disabled, metadata gathering was causing fault.
- take into account metadata config as well when accept_nexturi is disable
- sq_get_metadata must fill metadata in all cases, no NULL can be returned
- start to re-organize LOG levels
- prepare metadata gathering for artwork and extended information (like filesize)
- 64 bits int printed with %Ld for arm
- divide by 0 on volume removed (was causing volume command 0 ==> 255)
- volume calculation does not use float anymore (integer arithmetic only)
- <volume_curve> ending pair changed so be (0x7fffffff,0x7f) to work with integer arithmetic
- initialize a string in AddMRDevice


0.1.3.3
- with <seek_after_pause> set to 1, unpause was not restarting at the right time if repositionig was done during pause
- when upnp device capability for pcm does not detail sample rate and channel (ie audio/L16), add the channel and rate details in the mime-type response (ie audio/L16;channels=2;rate=44100) - was need for foobar2000
- add aac in the supported format (does not seem to work with Sonos or foobar yet)
- <volume_on_play> to 1 by default
- <volume_curve> max by default is 65536 instead of 65535
- check that squeezelite instance was created before trying to run it
- L/R inversion corrected in PCM 24 bits, packed type 1
- buffer write file opening done as soon as LMS play command is received (quick GET)
- in flac metadata (for repositionning) vorbis header is needed to NamUniti
- flac header in re-positioning was not set as "last block = 0x80" (happened after vorbis_comment was removed)
- handle case where no playlist index is returned in metadata (crash)
- metadata track and time request were doubling the '?'
- add metadata
- change incorrect upnp:artist to dc:creator in DIDL string
- change back flac header re-insertion default max block size to 0xfff
- remove a few compiler warning
- improve the "synchronous start" (continuous synchro does not work)

0.1.2.0
- add a wav header to pcm stream for players that accept audio/wav, audio/x-wav and audio/wave in protocol info by do not accept audio/Lxx (xx = sample size).Was needed for Sonos to receive pcm samples. Endianness pobably need more attention
- re-organize format detection code for wave header addition
- suppress DIRECT mode (was useless)
- correct some coredump on exit (access to invalid file handles)
19 changes: 10 additions & 9 deletions plugin/Settings.pm
Original file line number Diff line number Diff line change
Expand Up @@ -169,17 +169,18 @@ sub handler {
my $profile = loadprofiles()->{ $params->{'selprofile'} };
mergeprofile($device, $profile);
}
}

# get enabled status for all device, except the selected one
foreach my $device (@{$xmlconfig->{'device'}}) {
if ($device->{'udn'} ne $params->{'seldevice'}) {
my $enabled = $params->{ 'enabled.'.$device->{ 'udn' } };
$device->{'enabled'} = defined $enabled ? $enabled : 0;
}
}
}
}

$log->error("get all"});
# get enabled status for all device, except the selected one (if any)
foreach my $device (@{$xmlconfig->{'device'}}) {
if ($device->{'udn'} ne $params->{'seldevice'}) {
my $enabled = $params->{ 'enabled.'.$device->{ 'udn' } };
$device->{'enabled'} = defined $enabled ? $enabled : 0;
}
}

$log->info("writing XML config");
$log->debug(Dumper($xmlconfig));
Plugins::UPnPBridge::Squeeze2upnp->stop;
Expand Down
2 changes: 1 addition & 1 deletion plugin/Squeeze2upnp.pm
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ sub binaries {
return qw(squeeze2upnp-x86 squeeze2upnp-x86-static);
}
if ($os->{'binArch'} =~ /arm/) {
return qw(squeeze2upnp-armv6hf squeeze2upnp-armv6hf-static);
return qw(squeeze2upnp-armv6hf squeeze2upnp-armv6hf-static squeeze2upnp-armv5 squeeze2upnp-armv5-static);
}

# fallback to offering all linux options for case when architecture detection does not work
Expand Down
14 changes: 7 additions & 7 deletions plugin/install.xml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<?xml version='1.0' standalone='yes'?>
<extensions>
<version>0.2.4.0</version>
<description>PLUGIN_UPNPBRIDGE_DESC</description>
<defaultState>enabled</defaultState>
<optionsURL>plugins/UPnPBridge/settings/basic.html</optionsURL>
<name>PLUGIN_UPNPBRIDGE</name>
<creator>Philippe</creator>
<version>0.2.4.dev.1</version>
<profilesURL>http://sourceforge.net/projects/lms-to-upnp/files/profiles.xml/download</profilesURL>
<module>Plugins::UPnPBridge::Plugin</module>
<targetApplication>
<maxVersion>*.*</maxVersion>
<minVersion>7.5</minVersion>
<id>SlimServer</id>
<maxVersion>*.*</maxVersion>
</targetApplication>
<email>[email protected]</email>
<description>PLUGIN_UPNPBRIDGE_DESC</description>
<module>Plugins::UPnPBridge::Plugin</module>
<name>PLUGIN_UPNPBRIDGE</name>
<profilesURL>http://sourceforge.net/projects/lms-to-upnp/files/profiles.xml/download</profilesURL>
<optionsURL>plugins/UPnPBridge/settings/basic.html</optionsURL>
</extensions>

0 comments on commit a1c0ab1

Please sign in to comment.