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
0abee77e
Commit
0abee77e
authored
Nov 22, 2016
by
Max Kellermann
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
decoder/DecoderPlugin: container_scan() returns forward_list<string>
parent
114fcee2
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
55 additions
and
39 deletions
+55
-39
NEWS
NEWS
+2
-0
Container.cxx
src/db/update/Container.cxx
+8
-8
DecoderPlugin.hxx
src/decoder/DecoderPlugin.hxx
+7
-6
GmeDecoderPlugin.cxx
src/decoder/plugins/GmeDecoderPlugin.cxx
+19
-12
SidplayDecoderPlugin.cxx
src/decoder/plugins/SidplayDecoderPlugin.cxx
+19
-13
No files found.
NEWS
View file @
0abee77e
...
...
@@ -21,9 +21,11 @@ ver 0.20 (not yet released)
- ffmpeg: support ReplayGain and MixRamp
- ffmpeg: support stream tags
- gme: add option "accuracy"
- gme: faster scanning
- mad: reduce memory usage while scanning tags
- mpcdec: read the bit rate
- pcm: support audio/L16 (RFC 2586) and audio/x-mpd-float
- sidplay: faster scanning
* playlist
- cue: don't skip pregap
- embcue: fix last track
...
...
src/db/update/Container.cxx
View file @
0abee77e
...
...
@@ -96,10 +96,14 @@ UpdateWalk::UpdateContainerFile(Directory &directory,
return
false
;
}
AllocatedString
<>
vtrack
=
nullptr
;
unsigned
int
tnum
=
0
;
const
auto
v
=
plugin
.
container_scan
(
pathname
);
if
(
v
.
empty
())
{
editor
.
LockDeleteDirectory
(
contdir
);
return
false
;
}
TagBuilder
tag_builder
;
while
((
vtrack
=
plugin
.
container_scan
(
pathname
,
++
tnum
))
!=
nullptr
)
{
for
(
const
auto
&
vtrack
:
v
)
{
Song
*
song
=
Song
::
NewFile
(
vtrack
.
c_str
(),
*
contdir
);
// shouldn't be necessary but it's there..
...
...
@@ -126,9 +130,5 @@ UpdateWalk::UpdateContainerFile(Directory &directory,
directory
.
GetPath
(),
vtrack
.
c_str
());
}
if
(
tnum
==
1
)
{
editor
.
LockDeleteDirectory
(
contdir
);
return
false
;
}
else
return
true
;
return
true
;
}
src/decoder/DecoderPlugin.hxx
View file @
0abee77e
...
...
@@ -22,11 +22,13 @@
#include "Compiler.h"
#include <forward_list>
#include <string>
struct
ConfigBlock
;
class
InputStream
;
struct
TagHandler
;
class
Path
;
template
<
typename
T
>
class
AllocatedString
;
class
DecoderClient
;
struct
DecoderPlugin
{
...
...
@@ -85,14 +87,13 @@ struct DecoderPlugin {
/**
* @brief Return a "virtual" filename for subtracks in
* container formats like flac
* @param const char* pathname full pathname for the file on fs
* @param const unsigned int tnum track number
* @param path_fs full pathname for the file on fs
*
* @return
nullptr
if there are no multiple files
* a filename for every single track
according to tnum (param 2)
* @return
an empty list
if there are no multiple files
* a filename for every single track
;
* do not include full pathname here, just the "virtual" file
*/
AllocatedString
<
char
>
(
*
container_scan
)(
Path
path_fs
,
unsigned
tnum
);
std
::
forward_list
<
std
::
string
>
(
*
container_scan
)(
Path
path_fs
);
/* last element in these arrays must always be a nullptr: */
const
char
*
const
*
suffixes
;
...
...
src/decoder/plugins/GmeDecoderPlugin.cxx
View file @
0abee77e
...
...
@@ -27,16 +27,16 @@
#include "fs/AllocatedPath.hxx"
#include "util/ScopeExit.hxx"
#include "util/FormatString.hxx"
#include "util/AllocatedString.hxx"
#include "util/UriUtil.hxx"
#include "util/Domain.hxx"
#include "Log.hxx"
#include <gme/gme.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <gme/gme.h>
#include <stdio.h>
#define SUBTUNE_PREFIX "tune_"
...
...
@@ -103,29 +103,36 @@ ParseContainerPath(Path path_fs)
return
{
path_fs
.
GetDirectoryName
(),
track
-
1
};
}
static
AllocatedString
<
>
gme_container_scan
(
Path
path_fs
,
const
unsigned
int
tnum
)
static
std
::
forward_list
<
std
::
string
>
gme_container_scan
(
Path
path_fs
)
{
std
::
forward_list
<
std
::
string
>
list
;
Music_Emu
*
emu
;
const
char
*
gme_err
=
gme_open_file
(
path_fs
.
c_str
(),
&
emu
,
GME_SAMPLE_RATE
);
if
(
gme_err
!=
nullptr
)
{
LogWarning
(
gme_domain
,
gme_err
);
return
nullptr
;
return
list
;
}
const
unsigned
num_songs
=
gme_track_count
(
emu
);
gme_delete
(
emu
);
/* if it only contains a single tune, don't treat as container */
if
(
num_songs
<
2
)
return
nullptr
;
return
list
;
const
char
*
subtune_suffix
=
uri_get_suffix
(
path_fs
.
c_str
());
if
(
tnum
<=
num_songs
){
return
FormatString
(
SUBTUNE_PREFIX
"%03u.%s"
,
tnum
,
subtune_suffix
);
}
else
return
nullptr
;
auto
tail
=
list
.
before_begin
();
for
(
unsigned
i
=
1
;
i
<
num_songs
;
++
i
)
{
char
track_name
[
64
];
snprintf
(
track_name
,
sizeof
(
track_name
),
"%03u.%s"
,
i
,
subtune_suffix
);
tail
=
list
.
emplace_after
(
tail
,
track_name
);
}
return
list
;
}
static
void
...
...
src/decoder/plugins/SidplayDecoderPlugin.cxx
View file @
0abee77e
...
...
@@ -25,14 +25,11 @@
#include "fs/AllocatedPath.hxx"
#include "util/Macros.hxx"
#include "util/FormatString.hxx"
#include "util/AllocatedString.hxx"
#include "util/Domain.hxx"
#include "system/ByteOrder.hxx"
#include "system/FatalError.hxx"
#include "Log.hxx"
#include <string.h>
#ifdef HAVE_SIDPLAYFP
#include <sidplayfp/sidplayfp.h>
#include <sidplayfp/SidInfo.h>
...
...
@@ -49,6 +46,9 @@
#include <sidplay/utils/SidDatabase.h>
#endif
#include <string.h>
#include <stdio.h>
#define SUBTUNE_PREFIX "tune_"
static
constexpr
Domain
sidplay_domain
(
"sidplay"
);
...
...
@@ -476,12 +476,14 @@ sidplay_scan_file(Path path_fs,
return
true
;
}
static
AllocatedString
<
>
sidplay_container_scan
(
Path
path_fs
,
const
unsigned
int
tnum
)
static
std
::
forward_list
<
std
::
string
>
sidplay_container_scan
(
Path
path_fs
)
{
std
::
forward_list
<
std
::
string
>
list
;
SidTune
tune
(
path_fs
.
c_str
(),
nullptr
,
true
);
if
(
!
tune
.
getStatus
())
return
nullptr
;
return
list
;
#ifdef HAVE_SIDPLAYFP
const
SidTuneInfo
&
info
=
*
tune
.
getInfo
();
...
...
@@ -494,14 +496,18 @@ sidplay_container_scan(Path path_fs, const unsigned int tnum)
/* Don't treat sids containing a single tune
as containers */
if
(
!
all_files_are_containers
&&
n_tracks
<
2
)
return
nullptr
;
return
list
;
auto
tail
=
list
.
before_begin
();
for
(
unsigned
i
=
1
;
i
<
n_tracks
;
++
i
)
{
char
track_name
[
32
];
/* Construct container/tune path names, eg.
Delta.sid/tune_001.sid */
sprintf
(
track_name
,
SUBTUNE_PREFIX
"%03u.sid"
,
i
);
tail
=
list
.
emplace_after
(
tail
,
track_name
);
}
/* Construct container/tune path names, eg.
Delta.sid/tune_001.sid */
if
(
tnum
<=
n_tracks
)
{
return
FormatString
(
SUBTUNE_PREFIX
"%03u.sid"
,
tnum
);
}
else
return
nullptr
;
return
list
;
}
static
const
char
*
const
sidplay_suffixes
[]
=
{
...
...
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