Author: richard
Date: Tue Jan 13 07:15:35 2009
New Revision: 3803
URL: http://svn.slimdevices.com?rev=3803&root=Jive&view=rev
Log:
Bug: 10470, 10603
Added player capabilities in the HELO packets.
Modified:
7.4/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
7.4/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
7.4/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_tones.c
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/audio/Playback.lua Tue Jan
13 07:15:35 2009
@@ -6,7 +6,7 @@
local string = require("string")
-local hasDecode, Decode = pcall(require, "squeezeplay.decode")
+local hasDecode, decode = pcall(require, "squeezeplay.decode")
local hasSprivate, spprivate = pcall(require, "spprivate")
local Stream = require("squeezeplay.stream")
local SlimProto = require("jive.net.SlimProto")
@@ -49,7 +49,7 @@
obj.slimproto = slimproto
obj.slimproto:statusPacketCallback(function(_, event, serverTimestamp)
- local status = Decode:status()
+ local status = decode:status()
status.opcode = "STAT"
status.event = event
@@ -82,8 +82,9 @@
obj.timer:start()
if hasSprivate then
- spprivate.initAudio(slimproto)
- end
+ spprivate:initAudio(slimproto)
+ end
+ decode:initAudio(slimproto)
self.threshold = 0
self.tracksStarted = 0
@@ -101,7 +102,7 @@
function free(self)
- Decode:stop()
+ decode:stop()
self.timer:stop()
end
@@ -117,7 +118,7 @@
function _timerCallback(self)
- local status = Decode:status()
+ local status = decode:status()
-- cpu power saving
local outputFullness = status.outputFull / status.outputSize * 100
@@ -167,7 +168,7 @@
self.sentDecoderUnderrunEvent = true
self.sentDecoderFullEvent = false
- Decode:songEnded()
+ decode:songEnded()
end
else
self.sentDecoderUnderrunEvent = false
@@ -191,7 +192,7 @@
self.sentDecoderUnderrunEvent then
log:info("status AUDIO UNDERRUN")
- Decode:stop() -- XXX need to let last buffer play out
before stop
+ decode:stop() -- XXX need to let last buffer play out
before stop
self:sendStatus(status, "STMu")
self.sentAudioUnderrunEvent = true
@@ -200,7 +201,7 @@
self.stream then
log:info("status OUTPUT UNDERRUN")
- Decode:pauseAudio(0) -- auto-pause to prevent glitches
+ decode:pauseAudio(0) -- auto-pause to prevent glitches
self:sendStatus(status, "STMo")
self.sentOutputUnderrunEvent = true
@@ -227,7 +228,7 @@
status.decodeState & DECODE_RUNNING == 0 then
log:debug("resumeDecoder")
- Decode:resumeDecoder()
+ decode:resumeDecoder()
end
-- Start the audio when enough encoded data is been received
@@ -242,7 +243,7 @@
if self.autostart == '1' and not self.sentResume then
log:info("resume bytesReceivedL=",
status.bytesReceivedL, " outputTime=", status.outputTime, " threshold=",
self.threshold)
- Decode:resumeAudio()
+ decode:resumeAudio()
self.sentResume = true
self.sentDecoderFullEvent = true -- fake it so we don't
send STMl with pause
@@ -262,7 +263,7 @@
end
-- stream metadata
- local metadata = Decode:streamMetadata()
+ local metadata = decode:streamMetadata()
if metadata then
-- XXXX extend META with more data
self.slimproto:send({
@@ -374,7 +375,7 @@
-- over, flush out whatever's left.
self:_streamDisconnect(nil, true)
- Decode:start(string.byte(data.mode),
+ decode:start(string.byte(data.mode),
string.byte(data.transitionType),
data.transitionPeriod,
data.replayGain,
@@ -407,14 +408,14 @@
elseif data.command == 'q' then
-- quit
-- XXXX check against ip3k
- Decode:stop()
+ decode:stop()
self:_streamDisconnect(nil, true)
self.tracksStarted = 0
elseif data.command == 'f' then
-- flush
- Decode:flush()
+ decode:flush()
if self.stream then
self.stream:flush()
end
@@ -423,7 +424,7 @@
-- pause
local interval_ms = data.replayGain
- Decode:pauseAudio(interval_ms)
+ decode:pauseAudio(interval_ms)
if interval_ms == 0 then
self.slimproto:sendStatus('STMp')
end
@@ -432,13 +433,13 @@
-- skip ahead
local interval_ms = data.replayGain
- Decode:skipAhead(interval_ms)
+ decode:skipAhead(interval_ms)
elseif data.command == 'u' then
-- unpause
local interval_ms = data.replayGain
- Decode:resumeAudio(interval_ms)
+ decode:resumeAudio(interval_ms)
self.slimproto:sendStatus('STMr')
elseif data.command == 't' then
@@ -472,12 +473,12 @@
function _aude(self, data)
- Decode:audioEnable(data.enable)
+ decode:audioEnable(data.enable)
end
function _audg(self, data)
- Decode:audioGain(data.gainL, data.gainR)
+ decode:audioGain(data.gainL, data.gainR)
end
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/net/SlimProto.lua Tue Jan
13 07:15:35 2009
@@ -151,6 +151,7 @@
packNumber(wlanList, 2),
packNumber(0, 8), -- XXXX bytes received
"EN", -- XXXX language
+ table.concat(self.capabilities, ",")
}
end,
@@ -314,15 +315,21 @@
assert(heloPacket.revision)
assert(heloPacket.mac)
assert(heloPacket.uuid)
+ assert(heloPacket.model)
+ assert(heloPacket.modelName)
local obj = oo.rawnew(self, {})
-- connection state UNCONNECTED / CONNECTED
obj.state = UNCONNECTED
+ obj.capabilities = {}
-- helo packet sent on connection
obj.heloPacket = heloPacket
obj.heloPacket.mac = string.lower(obj.heloPacket.mac)
+
+ obj:capability("model", obj.heloPacket.model)
+ obj:capability("modelName", obj.heloPacket.modelName)
obj.statusCallback = _defaultStatusCallback
@@ -491,6 +498,15 @@
end
+-- Register capability
+function capability(self, key, value)
+ if value then
+ key = key .. "=" .. value
+ end
+ table.insert(self.capabilities, key)
+end
+
+
-- Subscribe subscription function to a slimproto opocde.
function subscribe(self, opcode, subscription)
if not self.subscriptions[opcode] then
@@ -535,7 +551,7 @@
body
})
- --_hexDump("STAT", data)
+ --_hexDump(packet.opcode, data)
local pump = function(NetworkThreadErr)
if (NetworkThreadErr) then
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/share/jive/slim/LocalPlayer.lua Tue
Jan 13 07:15:35 2009
@@ -54,6 +54,8 @@
revision = 0,
mac = obj.id,
uuid = uuid,
+ model = DEVICE_MODEL,
+ modelName = DEVICE_NAME,
})
obj.playback = Playback(jnt, obj.slimproto)
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c (original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode.c Tue Jan 13
07:15:35 2009
@@ -64,14 +64,15 @@
/* installed decoders */
static struct decode_module *all_decoders[] = {
- &decode_tones,
- &decode_pcm,
- &decode_flac,
- &decode_mad,
- &decode_vorbis,
+ /* in order of perference */
#ifdef _WIN32
&decode_wma_win,
#endif
+ &decode_vorbis,
+ &decode_flac,
+ &decode_pcm,
+ &decode_mad,
+ &decode_tones,
};
@@ -645,6 +646,39 @@
}
+static int decode_init_audio(lua_State *L) {
+ size_t i;
+
+ /* stack is:
+ * 1: decode
+ * 2: slimproto
+ */
+
+ /* register codecs */
+ for (i=0; i<(sizeof(all_decoders)/sizeof(struct decode_module *)); i++)
{
+ lua_getfield(L, 2, "capability");
+ lua_pushvalue(L, 2);
+ lua_pushstring(L, all_decoders[i]->name);
+ lua_call(L, 2, 0);
+ }
+
+ /* max sample rate */
+ if (decode_audio) {
+ unsigned int rate_max;
+
+ decode_audio->info(&rate_max);
+
+ lua_getfield(L, 2, "capability");
+ lua_pushvalue(L, 2);
+ lua_pushstring(L, "MaxSampleRate");
+ lua_pushinteger(L, rate_max);
+ lua_call(L, 3, 0);
+ }
+
+ return 0;
+}
+
+
static int decode_audio_open(lua_State *L) {
/* initialise audio output */
#ifdef HAVE_LIBASOUND
@@ -683,6 +717,7 @@
static const struct luaL_Reg decode_f[] = {
{ "open", decode_audio_open },
+ { "initAudio", decode_init_audio },
{ "resumeDecoder", decode_resume_decoder },
{ "resumeAudio", decode_resume_audio },
{ "pauseAudio", decode_pause_audio },
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_alsa.c Tue
Jan 13 07:15:35 2009
@@ -31,6 +31,7 @@
u32_t flags;
unsigned int buffer_time;
unsigned int period_count;
+ unsigned int rate_max;
/* alsa state */
snd_pcm_t *pcm;
@@ -248,6 +249,18 @@
return err;
}
+ /* Find maximum supported hardware rate */
+ if ((err = snd_pcm_hw_params_set_rate_resample(state->pcm,
state->hw_params, 0)) < 0) {
+ DEBUG_ERROR("Resampling setup failed: %s\n", snd_strerror(err));
+ return err;
+ }
+
+ if ((err = snd_pcm_hw_params_get_rate_max(state->hw_params, &val,
&dir)) < 0) {
+ DEBUG_ERROR("hwparam rate max error: %s", snd_strerror(err));
+ return err;
+ }
+ state->rate_max = val;
+
/* set hardware resampling */
if ((err = snd_pcm_hw_params_set_rate_resample(state->pcm,
state->hw_params, 1)) < 0) {
DEBUG_ERROR("Resampling setup failed: %s\n", snd_strerror(err));
@@ -326,6 +339,7 @@
if ((err = pcm_open(&tmp_state)) < 0) {
return err;
}
+
pcm_close(&tmp_state);
return 0;
@@ -604,6 +618,11 @@
}
+static void decode_alsa_info(unsigned int *rate_max) {
+ *rate_max = playback_state->rate_max;
+}
+
+
static int decode_alsa_init(lua_State *L) {
int err;
const char *playback_device;
@@ -679,6 +698,7 @@
decode_alsa_stop,
decode_alsa_delay,
decode_alsa_gain,
+ decode_alsa_info,
};
#endif // HAVE_LIBASOUND
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_flac.c Tue
Jan 13 07:15:35 2009
@@ -247,6 +247,7 @@
struct decode_module decode_flac = {
'f',
+ "flc",
decode_flac_start,
decode_flac_stop,
decode_flac_period,
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_mad.c Tue Jan
13 07:15:35 2009
@@ -490,6 +490,7 @@
struct decode_module decode_mad = {
'm',
+ "mp3",
decode_mad_start,
decode_mad_stop,
decode_mad_period,
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_pcm.c Tue Jan
13 07:15:35 2009
@@ -190,6 +190,7 @@
struct decode_module decode_pcm = {
'p',
+ "pcm",
decode_pcm_start,
decode_pcm_stop,
decode_pcm_period,
Modified:
7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_portaudio.c
Tue Jan 13 07:15:35 2009
@@ -319,6 +319,12 @@
}
+static void decode_portaudio_info(unsigned int *rate_max) {
+ // FIXME
+ *rate_max = 48000;
+}
+
+
struct decode_audio decode_portaudio = {
decode_portaudio_init,
decode_portaudio_start,
@@ -327,6 +333,7 @@
decode_portaudio_stop,
NULL,
decode_portaudio_gain,
+ decode_portaudio_info,
};
#endif // HAVE_PORTAUDIO
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_priv.h Tue
Jan 13 07:15:35 2009
@@ -25,6 +25,7 @@
/* Decode interface */
struct decode_module {
u32_t id;
+ char *name;
void *(*start)(u8_t *params, u32_t num_params);
void (*stop)(void *data);
u32_t (*period)(void *data);
@@ -93,6 +94,7 @@
void (*stop)(void);
u32_t (*delay)(void);
void (*gain)(s32_t lgain, s32_t rgain);
+ void (*info)(unsigned int *rate_max);
};
extern struct decode_audio decode_alsa;
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_tones.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_tones.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_tones.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_tones.c Tue
Jan 13 07:15:35 2009
@@ -239,6 +239,7 @@
struct decode_module decode_tones = {
't',
+ "tone",
decode_tones_start,
decode_tones_stop,
decode_tones_period,
Modified: 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
URL:
http://svn.slimdevices.com/7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c?rev=3803&root=Jive&r1=3802&r2=3803&view=diff
==============================================================================
--- 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c
(original)
+++ 7.4/trunk/squeezeplay/src/squeezeplay/src/audio/decode/decode_vorbis.c Tue
Jan 13 07:15:35 2009
@@ -233,6 +233,7 @@
struct decode_module decode_vorbis = {
'o',
+ "ogg",
decode_vorbis_start,
decode_vorbis_stop,
decode_vorbis_period,
_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins