You are not logged in.

#1 2018-10-18 18:55:58

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

[SOLVED] MPD, libsmbclient exception

My goal is to use MPD on one user on local machine. I'm using Systemd to start MPD as a user. The problem is that MPC doesn't play anything but there is no error message (terminal output below).
Common MPD solutions which I've ruled out:

  • File system permission (MPC can create a database so it must be able to read my music directory)

  • MPD and also Pulseaudio are running as user

Bad song index error:

user1@m01 ~]$ mpc update
Updating DB (#3) ...
volume: n/a   repeat: off   random: off   single: off   consume: off
[user1@m01 ~]$ mpc ls
Front_Center.wav
[user1@m01 ~]$ mpc play 1
mpd error: Bad song index
[user1@m01 ~]$ mpc play
volume: n/a   repeat: off   random: off   single: off   consume: off

MPD is running as user:

user1@m01 ~]$ systemctl --user status mpd
● mpd.service - Music Player Daemon
   Loaded: loaded (/usr/lib/systemd/user/mpd.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-10-18 20:56:30 EEST; 9s ago
     Docs: man:mpd(1)
           man:mpd.conf(5)
 Main PID: 1879 (mpd)
   CGroup: /user.slice/user-1000.slice/user@1000.service/mpd.service
           └─1879 /usr/bin/mpd --no-daemon

libsmbclient[1879]: exception: OutputThread could not get realtime scheduling, continuing anyway: sched_setscheduler failed: Operation not permitted
libsmbclient[1879]: update: added /Front_Center.wav
systemd[595]: Started Music Player Daemon.

I tried to find information about that exception but the solutions (for example Arch forums thread) were about running MPD as a user which I'm already doing.

[user1@m01 ~]$ ps aux | grep mpd
user1    1879  0.0  0.2 887232 33116 ?        Ssl  20:56   0:00 /usr/bin/mpd --no-daemon
[user1@m01 ~]$ ps aux | grep pulseaudio
user1    1436  0.0  0.0 923884 11916 ?        S<sl 20:24   0:00 /usr/bin/pulseaudio --daemonize=no

Starting MPD without Systemd hangs after the exception:

[user1@m01 ~]$ mpd .config/mpd/mpd.conf --stdout --verbose --no-daemon
config_file: loading file .config/mpd/mpd.conf
libsamplerate: libsamplerate converter 'Fastest Sinc Interpolator'
vorbis: Xiph.Org libVorbis 1.3.6
opus: libopus 1.2.1
sndfile: libsndfile-1.0.28
simple_db: reading DB
curl: version 7.61.1
curl: with OpenSSL/1.1.1
avahi: Initializing interface
avahi: Client changed to state 101
avahi: Client is CONNECTING
exception: OutputThread could not get realtime scheduling, continuing anyway: sched_setscheduler failed: Operation not permitted
^Cavahi: Shutting down interface
listen: listen_global_finish called

My MPD config:

# An example configuration file for MPD.
# Read the user manual for documentation: http://www.musicpd.org/doc/user/


# Files and directories #######################################################
#
# This setting controls the top directory which MPD will search to discover the
# available audio files and add them to the daemon's online database. This 
# setting defaults to the XDG directory, otherwise the music directory will be
# be disabled and audio files will only be accepted over ipc socket (using
# file:// protocol) or streaming files over an accepted protocol.
#
music_directory		"~/music"
#
# This setting sets the MPD internal playlist directory. The purpose of this
# directory is storage for playlists created by MPD. The server will use 
# playlist files not created by the server but only if they are in the MPD
# format. This setting defaults to playlist saving being disabled.
#
#playlist_directory		"~/.mpd/playlists"
#
# This setting sets the location of the MPD database. This file is used to
# load the database at server start up and store the database while the 
# server is not up. This setting defaults to disabled which will allow
# MPD to accept files over ipc socket (using file:// protocol) or streaming
# files over an accepted protocol.
#
db_file			"~/.config/mpd/database"
# 
# These settings are the locations for the daemon log files for the daemon.
# These logs are great for troubleshooting, depending on your log_level
# settings.
#
# The special value "syslog" makes MPD use the local syslog daemon. This
# setting defaults to logging to syslog, otherwise logging is disabled.
#
log_file			"syslog"
#
# This setting sets the location of the file which stores the process ID
# for use of mpd --kill and some init scripts. This setting is disabled by
# default and the pid file will not be stored.
#
#pid_file			"~/.mpd/pid"
#
# This setting sets the location of the file which contains information about
# most variables to get MPD back into the same general shape it was in before
# it was brought down. This setting is disabled by default and the server 
# state will be reset on server start up.
#
#state_file			"~/.mpd/state"
#
# The location of the sticker database.  This is a database which
# manages dynamic information attached to songs.
#
#sticker_file			"~/.mpd/sticker.sql"
#
###############################################################################


# General music daemon options ################################################
#
# This setting specifies the user that MPD will run as. MPD should never run as
# root and you may use this setting to make MPD change its user ID after
# initialization. This setting is disabled by default and MPD is run as the
# current user.
#
#user				"nobody"
#
# This setting specifies the group that MPD will run as. If not specified
# primary group of user specified with "user" setting will be used (if set).
# This is useful if MPD needs to be a member of group such as "audio" to
# have permission to use sound card.
#
#group				"nogroup"
#
# This setting sets the address for the daemon to listen on. Careful attention
# should be paid if this is assigned to anything other then the default, any.
# This setting can deny access to control of the daemon. Not effective if
# systemd socket activiation is in use.
#
# For network
bind_to_address			"localhost"
#
# And for Unix Socket
#bind_to_address			"~/.config/mpd/socket"
#
# This setting is the TCP port that is desired for the daemon to get assigned
# to.
#
#port				"6600"
#
# This setting controls the type of information which is logged. Available 
# setting arguments are "default", "secure" or "verbose". The "verbose" setting
# argument is recommended for troubleshooting, though can quickly stretch
# available resources on limited hardware storage.
#
#log_level			"default"
#
# If you have a problem with your MP3s ending abruptly it is recommended that 
# you set this argument to "no" to attempt to fix the problem. If this solves
# the problem, it is highly recommended to fix the MP3 files with vbrfix
# (available from <http://www.willwap.co.uk/Programs/vbrfix.php>), at which
# point gapless MP3 playback can be enabled.
#
#gapless_mp3_playback			"yes"
#
# Setting "restore_paused" to "yes" puts MPD into pause mode instead
# of starting playback after startup.
#
#restore_paused "no"
#
# This setting enables MPD to create playlists in a format usable by other
# music players.
#
#save_absolute_paths_in_playlists	"no"
#
# This setting defines a list of tag types that will be extracted during the
# audio file discovery process. The complete list of possible values can be
# found in the user manual.
#metadata_to_use	"artist,album,title,track,name,genre,date,composer,performer,disc"
#
# This setting enables automatic update of MPD's database when files in 
# music_directory are changed.
#
#auto_update	"yes"
#
# Limit the depth of the directories being watched, 0 means only watch
# the music directory itself.  There is no limit by default.
#
#auto_update_depth "3"
#
###############################################################################


# Symbolic link behavior ######################################################
#
# If this setting is set to "yes", MPD will discover audio files by following 
# symbolic links outside of the configured music_directory.
#
#follow_outside_symlinks	"yes"
#
# If this setting is set to "yes", MPD will discover audio files by following
# symbolic links inside of the configured music_directory.
#
#follow_inside_symlinks		"yes"
#
###############################################################################


# Zeroconf / Avahi Service Discovery ##########################################
#
# If this setting is set to "yes", service information will be published with
# Zeroconf / Avahi.
#
#zeroconf_enabled		"yes"
#
# The argument to this setting will be the Zeroconf / Avahi unique name for
# this MPD server on the network.
#
#zeroconf_name			"Music Player"
#
###############################################################################


# Permissions #################################################################
#
# If this setting is set, MPD will require password authorization. The password
# setting can be specified multiple times for different password profiles.
#
#password                        "password@read,add,control,admin"
#
# This setting specifies the permissions a user has who has not yet logged in. 
#
#default_permissions             "read,add,control,admin"
#
###############################################################################


# Database #######################################################################
#

#database {
#       plugin "proxy"
#       host "other.mpd.host"
#       port "6600"
#}

# Input #######################################################################
#

input {
        plugin "curl"
#       proxy "proxy.isp.com:8080"
#       proxy_user "user"
#       proxy_password "password"
}

#
###############################################################################

# Audio Output ################################################################
#
# MPD supports various audio output types, as well as playing through multiple 
# audio outputs at the same time, through multiple audio_output settings 
# blocks. Setting this block is optional, though the server will only attempt
# autodetection for one sound card.
#
# An example of an ALSA output:
#
#audio_output {
##	type		"alsa"
##	name		"My ALSA Device"
##	device		"hw:0,0"	# optional
##	mixer_type      "hardware"	# optional
##	mixer_device	"default"	# optional
##	mixer_control	"PCM"		# optional
##	mixer_index	"0"		# optional
#}
#
# An example of an OSS output:
#
#audio_output {
#	type		"oss"
#	name		"My OSS Device"
##	device		"/dev/dsp"	# optional
##	mixer_type      "hardware"	# optional
##	mixer_device	"/dev/mixer"	# optional
##	mixer_control	"PCM"		# optional
#}
#
# An example of a shout output (for streaming to Icecast):
#
#audio_output {
#	type		"shout"
#	encoder		"vorbis"		# optional
#	name		"My Shout Stream"
#	host		"localhost"
#	port		"8000"
#	mount		"/mpd.ogg"
#	password	"hackme"
#	quality		"5.0"
#	bitrate		"128"
#	format		"44100:16:1"
##	protocol	"icecast2"		# optional
##	user		"source"		# optional
##	description	"My Stream Description"	# optional
##	url		"http://example.com"	# optional
##	genre		"jazz"			# optional
##	public		"no"			# optional
##	timeout		"2"			# optional
##	mixer_type      "software"		# optional
#}
#
# An example of a recorder output:
#
#audio_output {
#	type		"recorder"
#	name		"My recorder"
#	encoder		"vorbis"		# optional, vorbis or lame
#	path		"/var/lib/mpd/recorder/mpd.ogg"
##	quality		"5.0"			# do not define if bitrate is defined
#	bitrate		"128"			# do not define if quality is defined
#	format		"44100:16:1"
#}
#
# An example of a httpd output (built-in HTTP streaming server):
#
#audio_output {
#	type		"httpd"
#	name		"My HTTP Stream"
#	encoder		"vorbis"		# optional, vorbis or lame
#	port		"8000"
#	bind_to_address	"0.0.0.0"		# optional, IPv4 or IPv6
##	quality		"5.0"			# do not define if bitrate is defined
#	bitrate		"128"			# do not define if quality is defined
#	format		"44100:16:1"
#	max_clients	"0"			# optional 0=no limit
#}
#
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
#
audio_output {
	type		"pulse"
	name		"My Pulse Output"
##	server		"remote_server"		# optional
##	sink		"mono"			# optional
}
#
# An example of a winmm output (Windows multimedia API).
#
#audio_output {
#	type		"winmm"
#	name		"My WinMM output"
##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#		or
##	device		"0"		# optional
##	mixer_type	"hardware"	# optional
#}
#
# An example of an openal output.
#
#audio_output {
#	type		"openal"
#	name		"My OpenAL output"
##	device		"Digital Audio (S/PDIF) (High Definition Audio Device)" # optional
#}
#
# An example of an sndio output.
#
#audio_output {
#	type		"sndio"
#	name		"sndio output"
#	mixer_type	"software"
#}
#
# An example of an OS X output:
#
#audio_output {
#	type		"osx"
#	name		"My OS X Device"
##	device		"Built-in Output"	# optional
##	channel_map      "-1,-1,0,1"	# optional
#}
#
## Example "pipe" output:
#
#audio_output {
#	type		"pipe"
#	name		"my pipe"
#	command		"aplay -f cd 2>/dev/null"
## Or if you're want to use AudioCompress
#	command		"AudioCompress -m | aplay -f cd 2>/dev/null"
## Or to send raw PCM stream through PCM:
#	command		"nc example.org 8765"
#	format		"44100:16:2"
#}
#
## An example of a null output (for no audio output):
#
#audio_output {
#	type		"null"
#	name		"My Null Output"
#	mixer_type      "none"			# optional
#}
#
###############################################################################


# Normalization automatic volume adjustments ##################################
#
# This setting specifies the type of ReplayGain to use. This setting can have
# the argument "off", "album", "track" or "auto". "auto" is a special mode that
# chooses between "track" and "album" depending on the current state of
# random playback. If random playback is enabled then "track" mode is used.
# See <http://www.replaygain.org> for more details about ReplayGain.
# This setting is off by default.
#
#replaygain			"album"
#
# This setting sets the pre-amp used for files that have ReplayGain tags. By
# default this setting is disabled.
#
#replaygain_preamp		"0"
#
# This setting sets the pre-amp used for files that do NOT have ReplayGain tags.
# By default this setting is disabled.
#
#replaygain_missing_preamp	"0"
#
# This setting enables or disables ReplayGain limiting.
# MPD calculates actual amplification based on the ReplayGain tags
# and replaygain_preamp / replaygain_missing_preamp setting.
# If replaygain_limit is enabled MPD will never amplify audio signal
# above its original level. If replaygain_limit is disabled such amplification
# might occur. By default this setting is enabled.
#
#replaygain_limit		"yes"
#
# This setting enables on-the-fly normalization volume adjustment. This will
# result in the volume of all playing audio to be adjusted so the output has 
# equal "loudness". This setting is disabled by default.
#
#volume_normalization		"no"
#
###############################################################################

# Character Encoding ##########################################################
#
# If file or directory names do not display correctly for your locale then you 
# may need to modify this setting.
#
#filesystem_charset		"UTF-8"
#
###############################################################################

Solved! Solution posted in #4 by V1del.

Last edited by orderlyDisorganized (2018-10-20 19:20:48)

Offline

#2 2018-10-18 19:25:45

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,427

Re: [SOLVED] MPD, libsmbclient exception

You have to add tracks to the playlist before being able to play something. The exception is irrelevant and mpd doesn't hang, if started with no daemon it will keep running in that terminal. Are you sure that that music directory is correct? Paths on unix filesystems are case sensitive if your actual directory is ~/Music ~/music will not find anything.

Offline

#3 2018-10-19 14:35:51

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

Re: [SOLVED] MPD, libsmbclient exception

V1del wrote:

You have to add tracks to the playlist before being able to play something. The exception is irrelevant and mpd doesn't hang, if started with no daemon it will keep running in that terminal. Are you sure that that music directory is correct? Paths on unix filesystems are case sensitive if your actual directory is ~/Music ~/music will not find anything.

I tried adding tracks to a playlist but the issue remains. I'm also sure that the music directory is correct.

[user1@m01 ~]$ ls music
Front_Center.wav  Front_Left.wav  Front_Right.wav  Noise.wav  Rear_Center.wav  Rear_Left.wav  Rear_Right.wav  Side_Left.wav  Side_Right.wav
[user1@m01 ~]$ ls .config/mpd/playlists/
my_list.m3u

MPD can read my music and playlist:

[user@m01 ~]$ systemctl --user start mpd
[user@m01 ~]$ systemctl --user status mpd
● mpd.service - Music Player Daemon
   Loaded: loaded (/usr/lib/systemd/user/mpd.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-10-19 17:26:17 EEST; 6s ago
     Docs: man:mpd(1)
           man:mpd.conf(5)
 Main PID: 1096 (mpd)
   CGroup: /user.slice/user-1000.slice/user@1000.service/mpd.service
           └─1096 /usr/bin/mpd --no-daemon

Oct 19 17:26:16 m01 systemd[602]: Starting Music Player Daemon...
Oct 19 17:26:17 m01 libsmbclient[1096]: exception: OutputThread could not get realtime scheduling, continuing anyway: sched_setscheduler failed: Operation not permitted
Oct 19 17:26:17 m01 systemd[602]: Started Music Player Daemon.

[user1@m01 ~]$ mpc load my_list
loading: my_list
[user1@m01 ~]$ mpc play
volume:100%   repeat: off   random: off   single: off   consume: off

I'm starting to wonder if my sound configuration is incorrect. I tried to use ALSA directly.

My asoundrc:

pcm.!default {
	type hw
	card 1
}
ctl.!default {
	type hw
	card 1
}

Now my mpd.conf audio configuration is:

# An example of an ALSA output:
#
audio_output {
	type		"alsa"
	name		"My ALSA Device"
#	device		"hw:0,0"	# optional
##	mixer_type      "hardware"	# optional
#	mixer_type	"software"
##	mixer_device	"default"	# optional
##	mixer_control	"PCM"		# optional
##	mixer_index	"0"		# optional
}

Speaker-test produces output successfully.

Last edited by orderlyDisorganized (2018-10-19 14:38:16)

Offline

#4 2018-10-19 14:59:34

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,427

Re: [SOLVED] MPD, libsmbclient exception

If you are using pulse you should be using pulse I don't think that that really is the underlying issue here. That .asoundrc will break anything that tries to use ALSA while you are using pulse at the same time on the same card, you shouldn't be using it if you are using pulse (use pulseaudio-alsa instead).

By adding to a playlist I'm not talking about a traditional playlist but the MPD playback queue. I.e. if you are using mpc as your client you must first use

mpc add  Front_Center.wav 

before you can run

mpc play 1

you might want to read through it's man page.

Last edited by V1del (2018-10-19 15:56:56)

Offline

#5 2018-10-19 15:52:08

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

Re: [SOLVED] MPD, libsmbclient exception

V1del wrote:

If you are using pulse you should be using pulse I don't think that that really is the underlying issue here. That .asoundrc will break anything that tries to use ALSA while you are using pulse at the same time on the same card, you shouldn't be using it if you are using pulse (use pulseaudio-alsa instead).

By adding to a playlist I'm not talking about a traditional playlist but the MPD playback queue. I.e. if you are using mpc as your client you must first use

mpc add  Front_Center.wav 

before you can run

mpd play 1

you might want to read through it's man page.

Thanks, it's working now. And yeah, I should have atleast killed Pulseaudio before trying that ALSA config.

I'm still wondering if using mpd as a socket instead of a service would be beneficial. As I read in the Wiki about mpd.socket, systemd will listen to a socket and start a service only when it's needed. This would lead into lower memory usage if mpd is used only occasionally? The downside is that I wouldn't be able to run mpd as user. This might be far fetched because I'm not familiar with Systemd sockets.

Last edited by orderlyDisorganized (2018-10-19 15:56:55)

Offline

#6 2018-10-19 16:00:57

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,427

Re: [SOLVED] MPD, libsmbclient exception

You can create/define user service sockets, that really shouldn't be a limiting factor. However neither should be MPDs memory usage from what I've seen that rarely exceeds 30MB (granted I haven't used it that extensively yet)

Offline

#7 2018-10-19 17:17:46

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

Re: [SOLVED] MPD, libsmbclient exception

I created a user mpd.socket by copying /etc/systemd/system/mpd.socket to ~/.config/systemd/user. Now I'm able to use the --user flag to start mpd as a socket.

[user1@m01 ~]$ systemctl --user status mpd.socket
● mpd.socket
   Loaded: loaded (/home/user1/.config/systemd/user/mpd.socket; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-10-19 19:38:02 EEST; 6min ago
   Listen: /home/user1/.config/mpd/socket (Stream)
           [::]:6600 (Stream)
   CGroup: /user.slice/user-1000.slice/user@1000.service/mpd.socket

Oct 19 19:38:02 m01 systemd[600]: Listening on mpd.socket.

It says that it's listening to /home/user1/.config/mpd/socket. I guess it got that from my Mpd config where I have bind_to_address "/home/user1/.config/mpd/socket". But if I change Mpd to use localhost instead, why is mpd.socket still listening to /home/user1/.config/mpd/socket? Shouldn't it be listening to localhost::6600?

Offline

#8 2018-10-20 10:06:40

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,427

Re: [SOLVED] MPD, libsmbclient exception

 [::]:6600

  is the ipv6 shortform of localhost::6600 and should unless explicitly configured otherwise be valid for both ipv4 and ipv6 requests.

I find it somewhat strange that you are asking this, because that socket config as it stands should work, does it not?  FWIW since littering the home dir with socket files is somewhat unclean I simply adjusted the socket file so that the listener file system socket would be created in /run/$USERID/mpd/socket

[Socket]
ListenStream=%t/mpd/socket
ListenStream=6600
Backlog=5
KeepAlive=true
PassCredentials=true

[Install]
WantedBy=sockets.target

Last edited by V1del (2018-10-20 10:38:06)

Offline

#9 2018-10-20 17:04:52

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

Re: [SOLVED] MPD, libsmbclient exception

V1del wrote:

I find it somewhat strange that you are asking this, because that socket config as it stands should work, does it not?  FWIW since littering the home dir with socket files is somewhat unclean I simply adjusted the socket file so that the listener file system socket would be created in /run/$USERID/mpd/socket

It works fine. It just seemed odd that the unit listened to a file system socket even when I had configured MPD to use localhost. But this was an error on my part since I missed that IPv6 localhost part.

I agree, your solution to run sockets as a user seems a better alternative than copying systemd files to ~/. Is that completely the same as enabling units with the --user flag?

I tried it with no success unfortunately. The unit is clearly loaded by root since it listens to the socket in /run. I'm sure the problem lies in my knowledge of Systemd.

[user1@m01 ~]$ cat /etc/systemd/system/mpd.socket 
[Socket]
#ListenStream=/home/user1/.config/mpd/socket
ListenStream=%t/mpd/socket
ListenStream=6600
Backlog=5
KeepAlive=true
PassCredentials=true

[Install]
WantedBy=sockets.target
[user1@m01 ~]$ systemctl --user status mpd.socket
Unit mpd.socket could not be found.
[user1@m01 ~]$ systemctl status mpd.socket
● mpd.socket
   Loaded: loaded (/etc/systemd/system/mpd.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Sat 2018-10-20 19:44:33 EEST; 13min ago
   Listen: /run/mpd/socket (Stream)
           [::]:6600 (Stream)
    Tasks: 0 (limit: 4915)
   Memory: 0B
   CGroup: /system.slice/mpd.socket

Last edited by orderlyDisorganized (2018-10-20 17:10:29)

Offline

#10 2018-10-20 17:33:40

V1del
Forum Moderator
Registered: 2012-10-16
Posts: 21,427

Re: [SOLVED] MPD, libsmbclient exception

No you should still run it with the --user flag and I did copy the mpd.socket unit to my home dir (alternatively use /usr/lib/systemd/user/mpd.socket or even better /etc/systemd/user (as /usr/lib is usually reserved for packages), however still use the --user flag to have it start in your user's context). The %t expands to the runtime directory (/var/run for system services, /var/run/USERID for user services)

Last edited by V1del (2018-10-20 18:02:21)

Offline

#11 2018-10-20 19:19:57

orderlyDisorganized
Member
Registered: 2016-05-15
Posts: 15

Re: [SOLVED] MPD, libsmbclient exception

V1del wrote:

No you should still run it with the --user flag and I did copy the mpd.socket unit to my home dir (alternatively use /usr/lib/systemd/user/mpd.socket or even better /etc/systemd/user (as /usr/lib is usually reserved for packages), however still use the --user flag to have it start in your user's context). The %t expands to the runtime directory (/var/run for system services, /var/run/USERID for user services)

I got MPD working now as an user socket and it listens to a socket file. $MPD_HOST variable is also unnecessary now. At some point in my configuration it was needed. It probably became unnecessary since the socket file path is set in the unit file itself and not in mpd.conf or as $MPD_HOST.

Thanks for your help!

Last edited by orderlyDisorganized (2018-10-21 07:13:58)

Offline

Board footer

Powered by FluxBB