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
9761abf3
Commit
9761abf3
authored
Jan 03, 2013
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
cue_parser: fix CUE files with only one track
Track whether _finish() has been called, and deliver all partial results then. Fixes Mantis ticket 0003621.
parent
599a5621
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
48 additions
and
7 deletions
+48
-7
NEWS
NEWS
+1
-0
cue_parser.c
src/cue/cue_parser.c
+47
-7
No files found.
NEWS
View file @
9761abf3
...
@@ -9,6 +9,7 @@ ver 0.17.3 (2012/??/??)
...
@@ -9,6 +9,7 @@ ver 0.17.3 (2012/??/??)
- ffmpeg: support planar audio
- ffmpeg: support planar audio
* playlist:
* playlist:
- cue: fix memory leak
- cue: fix memory leak
- cue: fix CUE files with only one track
ver 0.17.2 (2012/09/30)
ver 0.17.2 (2012/09/30)
* protocol:
* protocol:
...
...
src/cue/cue_parser.c
View file @
9761abf3
...
@@ -80,6 +80,13 @@ struct cue_parser {
...
@@ -80,6 +80,13 @@ struct cue_parser {
* start time of the current song.
* start time of the current song.
*/
*/
bool
last_updated
;
bool
last_updated
;
/**
* Tracks whether cue_parser_finish() has been called. If
* true, then all remaining (partial) results will be
* delivered by cue_parser_get().
*/
bool
end
;
};
};
struct
cue_parser
*
struct
cue_parser
*
...
@@ -92,6 +99,7 @@ cue_parser_new(void)
...
@@ -92,6 +99,7 @@ cue_parser_new(void)
parser
->
current
=
NULL
;
parser
->
current
=
NULL
;
parser
->
previous
=
NULL
;
parser
->
previous
=
NULL
;
parser
->
finished
=
NULL
;
parser
->
finished
=
NULL
;
parser
->
end
=
false
;
return
parser
;
return
parser
;
}
}
...
@@ -223,10 +231,32 @@ cue_parse_position(const char *p)
...
@@ -223,10 +231,32 @@ cue_parse_position(const char *p)
return
minutes
*
60000
+
seconds
*
1000
+
frames
*
1000
/
75
;
return
minutes
*
60000
+
seconds
*
1000
+
frames
*
1000
/
75
;
}
}
/**
* Commit the current song. It will be moved to "previous", so the
* next song may soon edit its end time (using the next song's start
* time).
*/
static
void
cue_parser_commit
(
struct
cue_parser
*
parser
)
{
/* the caller of this library must call cue_parser_get() often
enough */
assert
(
parser
->
finished
==
NULL
);
assert
(
!
parser
->
end
);
if
(
parser
->
current
==
NULL
)
return
;
parser
->
finished
=
parser
->
previous
;
parser
->
previous
=
parser
->
current
;
parser
->
current
=
NULL
;
}
static
void
static
void
cue_parser_feed2
(
struct
cue_parser
*
parser
,
char
*
p
)
cue_parser_feed2
(
struct
cue_parser
*
parser
,
char
*
p
)
{
{
assert
(
parser
!=
NULL
);
assert
(
parser
!=
NULL
);
assert
(
!
parser
->
end
);
assert
(
p
!=
NULL
);
assert
(
p
!=
NULL
);
const
char
*
command
=
cue_next_token
(
&
p
);
const
char
*
command
=
cue_next_token
(
&
p
);
...
@@ -257,7 +287,7 @@ cue_parser_feed2(struct cue_parser *parser, char *p)
...
@@ -257,7 +287,7 @@ cue_parser_feed2(struct cue_parser *parser, char *p)
else
if
(
parser
->
state
==
TRACK
)
else
if
(
parser
->
state
==
TRACK
)
cue_add_tag
(
parser
->
current
->
tag
,
TAG_TITLE
,
p
);
cue_add_tag
(
parser
->
current
->
tag
,
TAG_TITLE
,
p
);
}
else
if
(
strcmp
(
command
,
"FILE"
)
==
0
)
{
}
else
if
(
strcmp
(
command
,
"FILE"
)
==
0
)
{
cue_parser_
finish
(
parser
);
cue_parser_
commit
(
parser
);
const
char
*
filename
=
cue_next_value
(
&
p
);
const
char
*
filename
=
cue_next_value
(
&
p
);
if
(
filename
==
NULL
)
if
(
filename
==
NULL
)
...
@@ -280,7 +310,7 @@ cue_parser_feed2(struct cue_parser *parser, char *p)
...
@@ -280,7 +310,7 @@ cue_parser_feed2(struct cue_parser *parser, char *p)
}
else
if
(
parser
->
state
==
IGNORE_FILE
)
{
}
else
if
(
parser
->
state
==
IGNORE_FILE
)
{
return
;
return
;
}
else
if
(
strcmp
(
command
,
"TRACK"
)
==
0
)
{
}
else
if
(
strcmp
(
command
,
"TRACK"
)
==
0
)
{
cue_parser_
finish
(
parser
);
cue_parser_
commit
(
parser
);
const
char
*
nr
=
cue_next_token
(
&
p
);
const
char
*
nr
=
cue_next_token
(
&
p
);
if
(
nr
==
NULL
)
if
(
nr
==
NULL
)
...
@@ -332,6 +362,7 @@ void
...
@@ -332,6 +362,7 @@ void
cue_parser_feed
(
struct
cue_parser
*
parser
,
const
char
*
line
)
cue_parser_feed
(
struct
cue_parser
*
parser
,
const
char
*
line
)
{
{
assert
(
parser
!=
NULL
);
assert
(
parser
!=
NULL
);
assert
(
!
parser
->
end
);
assert
(
line
!=
NULL
);
assert
(
line
!=
NULL
);
char
*
allocated
=
g_strdup
(
line
);
char
*
allocated
=
g_strdup
(
line
);
...
@@ -342,12 +373,12 @@ cue_parser_feed(struct cue_parser *parser, const char *line)
...
@@ -342,12 +373,12 @@ cue_parser_feed(struct cue_parser *parser, const char *line)
void
void
cue_parser_finish
(
struct
cue_parser
*
parser
)
cue_parser_finish
(
struct
cue_parser
*
parser
)
{
{
if
(
parser
->
finished
!=
NULL
)
if
(
parser
->
end
)
song_free
(
parser
->
finished
);
/* has already been called, ignore */
return
;
parser
->
finished
=
parser
->
previous
;
cue_parser_commit
(
parser
);
parser
->
previous
=
parser
->
current
;
parser
->
end
=
true
;
parser
->
current
=
NULL
;
}
}
struct
song
*
struct
song
*
...
@@ -355,6 +386,15 @@ cue_parser_get(struct cue_parser *parser)
...
@@ -355,6 +386,15 @@ cue_parser_get(struct cue_parser *parser)
{
{
assert
(
parser
!=
NULL
);
assert
(
parser
!=
NULL
);
if
(
parser
->
finished
==
NULL
&&
parser
->
end
)
{
/* cue_parser_finish() has been called already:
deliver all remaining (partial) results */
assert
(
parser
->
current
==
NULL
);
parser
->
finished
=
parser
->
previous
;
parser
->
previous
=
NULL
;
}
struct
song
*
song
=
parser
->
finished
;
struct
song
*
song
=
parser
->
finished
;
parser
->
finished
=
NULL
;
parser
->
finished
=
NULL
;
return
song
;
return
song
;
...
...
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