Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
1a5b04e4
Commit
1a5b04e4
authored
May 31, 2004
by
Warren Dukes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
some stream metadata fixes
git-svn-id:
https://svn.musicpd.org/mpd/trunk@1266
09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent
5f2c19bf
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
57 additions
and
15 deletions
+57
-15
TODO
TODO
+1
-5
decode.c
src/decode.c
+14
-1
audiofile_plugin.c
src/inputPlugins/audiofile_plugin.c
+4
-0
player.c
src/player.c
+23
-8
player.h
src/player.h
+8
-0
playerData.c
src/playerData.c
+7
-1
No files found.
TODO
View file @
1a5b04e4
1) play streams
a) put some sort of error reporting for streaming/inputStream!
b) fetch metadata and store in DecoderControl and pass to
PlayerControl! (need todo this to ensure craziness doesn't
happen)
1) eventually deal with icy-metadata
2) parse metadata on the fly in decoders
b) parse metadata on the fly in decoders
c) command for dealing with the changing metadata, currentsonginfo
or something
d) in songinfo add a metadata tag item for indicating stream
...
...
src/decode.c
View file @
1a5b04e4
...
...
@@ -71,6 +71,7 @@ void stopDecode(DecoderControl * dc) {
void
quitDecode
(
PlayerControl
*
pc
,
DecoderControl
*
dc
)
{
stopDecode
(
dc
);
pc
->
metadataState
=
PLAYER_METADATA_STATE_READ
;
pc
->
state
=
PLAYER_STATE_STOP
;
dc
->
seek
=
0
;
pc
->
play
=
0
;
...
...
@@ -110,6 +111,15 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
quitDecode(pc,dc); \
return; \
} \
if(pc->metadataState == PLAYER_METADATA_STATE_WRITE && \
dc->metadataSet) \
{ \
memcpy(pc->metadata, dc->metadata, \
DECODE_METADATA_LENGTH); \
pc->metadata[DECODE_METADATA_LENGTH-1] = '\0'; \
pc->title = dc->title; \
} \
pc->metadataState = PLAYER_METADATA_STATE_READ; \
pc->totalTime = dc->totalTime; \
pc->sampleRate = dc->audioFormat.sampleRate; \
pc->bits = dc->audioFormat.bits; \
...
...
@@ -131,6 +141,9 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
int
waitOnDecode
(
PlayerControl
*
pc
,
DecoderControl
*
dc
,
OutputBuffer
*
cb
,
int
*
decodeWaitedOn
)
{
strncpy
(
pc
->
currentUrl
,
pc
->
utf8url
,
MAXPATHLEN
);
pc
->
currentUrl
[
MAXPATHLEN
]
=
'\0'
;
while
(
decode_pid
&&
*
decode_pid
>
0
&&
dc
->
start
)
my_usleep
(
10000
);
if
(
dc
->
start
||
dc
->
error
!=
DECODE_ERROR_NOERROR
)
{
...
...
@@ -570,7 +583,7 @@ void decode() {
dc
->
seek
=
0
;
dc
->
stop
=
0
;
dc
->
start
=
1
;
if
(
decode_pid
==
NULL
||
*
decode_pid
<=
0
)
{
if
(
decoderInit
(
pc
,
cb
,
dc
)
<
0
)
return
;
}
...
...
src/inputPlugins/audiofile_plugin.c
View file @
1a5b04e4
...
...
@@ -157,6 +157,8 @@ InputPlugin audiofilePlugin =
{
"audiofile"
,
NULL
,
NULL
,
NULL
,
audiofile_decode
,
audiofileTagDup
,
INPUT_PLUGIN_STREAM_FILE
,
...
...
@@ -172,6 +174,8 @@ InputPlugin audiofilePlugin =
NULL
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
NULL
,
NULL
...
...
src/player.c
View file @
1a5b04e4
...
...
@@ -50,6 +50,15 @@ void clearPlayerPid() {
player_pid
=
0
;
}
static
void
resetPlayerMetadata
()
{
PlayerControl
*
pc
=
&
(
getPlayerData
()
->
playerControl
);
if
(
pc
->
metadataState
==
PLAYER_METADATA_STATE_READ
)
{
pc
->
metadataState
=
PLAYER_METADATA_STATE_WRITE
;
pc
->
title
=
-
1
;
}
}
void
resetPlayer
()
{
int
pid
;
...
...
@@ -62,6 +71,9 @@ void resetPlayer() {
getPlayerData
()
->
playerControl
.
state
=
PLAYER_STATE_STOP
;
getPlayerData
()
->
playerControl
.
queueState
=
PLAYER_QUEUE_UNLOCKED
;
getPlayerData
()
->
playerControl
.
seek
=
0
;
getPlayerData
()
->
playerControl
.
metadataState
=
PLAYER_METADATA_STATE_WRITE
;
getPlayerData
()
->
playerControl
.
title
=
-
1
;
/* kill decode process if it got left running */
pid
=
getPlayerData
()
->
playerControl
.
decode_pid
;
if
(
pid
>
0
)
kill
(
pid
,
SIGTERM
);
...
...
@@ -187,6 +199,7 @@ int playerPlay(FILE * fp, Song * song) {
return
-
1
;
}
resetPlayerMetadata
();
while
(
player_pid
>
0
&&
pc
->
play
)
my_usleep
(
1000
);
return
0
;
...
...
@@ -385,6 +398,7 @@ int playerSeek(FILE * fp, Song * song, float time) {
}
if
(
pc
->
error
==
PLAYER_ERROR_NOERROR
)
{
resetPlayerMetadata
();
pc
->
seekWhere
=
time
;
pc
->
seek
=
1
;
while
(
player_pid
>
0
&&
pc
->
seek
)
my_usleep
(
1000
);
...
...
@@ -461,20 +475,21 @@ void playerCycleLogFiles() {
/* this actually creates a dupe of the current metadata */
Song
*
playerCurrentDecodeSong
()
{
static
Song
*
song
;
DecoderControl
*
dc
=
&
(
getPlayerData
()
->
decod
erControl
);
static
Song
*
song
=
NULL
;
PlayerControl
*
pc
=
&
(
getPlayerData
()
->
play
erControl
);
if
(
dc
->
metadataSet
&&
(
!
song
||
strcmp
(
song
->
utf8url
,
dc
->
utf8url
)))
{
if
(
pc
->
metadataState
==
PLAYER_METADATA_STATE_READ
&&
(
!
song
||
strcmp
(
song
->
utf8url
,
pc
->
currentUrl
)))
{
if
(
song
)
freeJustSong
(
song
);
song
=
newNullSong
();
song
->
tag
=
newMpdTag
();
if
(
song
->
utf8url
)
free
(
song
->
utf8url
);
song
->
utf8url
=
strdup
(
dc
->
utf8u
rl
);
if
(
d
c
->
title
>=
0
)
{
song
->
tag
->
title
=
dc
->
title
+
dc
->
metadata
;
song
->
utf8url
=
strdup
(
pc
->
currentU
rl
);
if
(
p
c
->
title
>=
0
)
{
song
->
tag
->
title
=
strdup
(
pc
->
title
+
pc
->
metadata
)
;
}
else
song
->
tag
->
title
=
NULL
;
resetPlayerMetadata
();
return
song
;
}
...
...
src/player.h
View file @
1a5b04e4
...
...
@@ -21,6 +21,7 @@
#include "../config.h"
#include "decode.h"
#include "mpd_types.h"
#include "song.h"
...
...
@@ -51,6 +52,9 @@
#define PLAYER_QUEUE_UNLOCKED 0
#define PLAYER_QUEUE_LOCKED 1
#define PLAYER_METADATA_STATE_READ 1
#define PLAYER_METADATA_STATE_WRITE 2
typedef
struct
_PlayerControl
{
volatile
mpd_sint8
stop
;
volatile
mpd_sint8
play
;
...
...
@@ -67,6 +71,7 @@ typedef struct _PlayerControl {
volatile
float
elapsedTime
;
volatile
float
fileTime
;
char
utf8url
[
MAXPATHLEN
+
1
];
char
currentUrl
[
MAXPATHLEN
+
1
];
char
erroredUrl
[
MAXPATHLEN
+
1
];
volatile
mpd_sint8
queueState
;
volatile
mpd_sint8
queueLockState
;
...
...
@@ -79,6 +84,9 @@ typedef struct _PlayerControl {
volatile
double
totalPlayTime
;
volatile
int
decode_pid
;
volatile
mpd_sint8
cycleLogFiles
;
volatile
mpd_sint8
metadataState
;
char
metadata
[
DECODE_METADATA_LENGTH
];
volatile
mpd_sint16
title
;
}
PlayerControl
;
void
clearPlayerPid
();
...
...
src/playerData.c
View file @
1a5b04e4
...
...
@@ -110,10 +110,16 @@ void initPlayerData() {
playerData_pd
->
playerControl
.
seek
=
0
;
memset
(
playerData_pd
->
playerControl
.
utf8url
,
0
,
MAXPATHLEN
+
1
);
memset
(
playerData_pd
->
playerControl
.
erroredUrl
,
0
,
MAXPATHLEN
+
1
);
memset
(
playerData_pd
->
playerControl
.
currentUrl
,
0
,
MAXPATHLEN
+
1
);
memset
(
playerData_pd
->
playerControl
.
metadata
,
0
,
DECODE_METADATA_LENGTH
);
playerData_pd
->
playerControl
.
crossFade
=
crossfade
;
playerData_pd
->
playerControl
.
softwareVolume
=
1000
;
playerData_pd
->
playerControl
.
totalPlayTime
=
0
;
playerData_pd
->
playerControl
.
decode_pid
=
0
;
playerData_pd
->
playerControl
.
title
=
-
1
;
playerData_pd
->
playerControl
.
metadataState
=
PLAYER_METADATA_STATE_WRITE
;
playerData_pd
->
decoderControl
.
stop
=
0
;
playerData_pd
->
decoderControl
.
start
=
0
;
...
...
@@ -122,7 +128,7 @@ void initPlayerData() {
playerData_pd
->
decoderControl
.
error
=
DECODE_ERROR_NOERROR
;
memset
(
playerData_pd
->
decoderControl
.
utf8url
,
0
,
MAXPATHLEN
+
1
);
memset
(
playerData_pd
->
decoderControl
.
metadata
,
0
,
DECODE_METADATA_LENGTH
);
DECODE_METADATA_LENGTH
);
playerData_pd
->
decoderControl
.
title
=
-
1
;
playerData_pd
->
decoderControl
.
metadataSet
=
0
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment