mikebrady / shairport-sync

AirPlay and AirPlay 2 audio player
Other
7.15k stars 568 forks source link

Can’t play unless on two speakers #1317

Closed outsharded closed 2 years ago

outsharded commented 2 years ago

I am having an issue in which the speaker won't play unless another is playing with it. When beginning a song I have to seek a little backwards and forwards and then the song will begin. I'm on the development branch and I run sudo apt update/upgrade every night, so I think it's whatever the latest version is.

mikebrady commented 2 years ago

Thanks for the post. Unfortunately, there is insufficient information. Ideally it should be possible, at least in principle, to replicate your situation exactly -- please see also REPORTING ISSUES.

Also, in this case, what player, what computer, what other devices were involved?

microfx commented 2 years ago

Same problem here. The problem seems to be persistent (it changed with every other major iOS15/ATV update - before it was also possible to set volume - but when I have two speakers where I can't control one because of HDMI - not possible anymore).

My setup for example: AppleTV 4k -> HDMI -> TV and since the speakers are bad then over ATV Airplay (2) -> Raspberry Pi 3 (pisound DAC) with Shairport dev branche.

Without having two destinations in my ATV videos are not even playing / acting weird / endless buffering (so I turned down TV volume to 0 as a "solution").

I thought this behavior was known on your end ... glad someone brought it up!

Hardware: Apple TV 4k, tvOS 15.1; Raspberry PI 3 with PiSound DAC

One app doesn't work (no sound/playback) at all – even with this workaround: Amazon Prime

shairport-sync -V
4.1-dev-8-gd25a20aa-AirPlay2-OpenSSL-Avahi-ALSA-soxr-metadata-dbus-sysconfdir:/etc

sudo systemctl status shairport-sync
● shairport-sync.service - Shairport Sync - AirPlay Audio Receiver
   Loaded: loaded (/lib/systemd/system/shairport-sync.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-10-04 22:17:21 CEST; 3 weeks 4 days ago
 Main PID: 531 (shairport-sync)
    Tasks: 25 (limit: 2075)
   Memory: 58.7M
   CGroup: /system.slice/shairport-sync.service
           └─531 /usr/local/bin/shairport-sync

Oct 30 17:01:50 MiCROLABS-P3 shairport-sync[531]: warning: The range requested is too large to accommodate -- ignored.  >>>  (spammed a lot)
Oct 30 17:16:10 MiCROLABS-P3 shairport-sync[531]: [aac @ 0x6a508030] Input buffer exhausted before END element found

edit: https://github.com/mikebrady/shairport-sync/issues/1308#issuecomment-939249852 this helped indeed! I am now on

4.1-dev-16-g6b9b45c8-AirPlay2-OpenSSL-Avahi-ALSA-soxr-metadata-dbus-sysconfdir:/etc

And now I can deactivate my TV as output. I still have to seek in time to have the video start. But AT LAST I have back volume control! When using Apple TV+ content I didn't have to seek in time to get to have the video start but it is async ... but seeking in time fixes this :)

mikebrady commented 2 years ago

Thanks for the update. There is something odd going on here with the ATV alright. Investigations are ongoing!

mikebrady commented 2 years ago

Hi there. I've pushed a new nqptp branch called wakener that works around a problem like this on an Apple Silicon Mac, and may (?) help in your situation. If you got a chance to try it out, that would be great. Please pay particular attention to the README -- the installation instructions might have changed.

mikebrady commented 2 years ago

Update -- apologies, one line was left out of the instructions (it was $ git checkout wakener). Fixed now.

microfx commented 2 years ago

Hmm... this broke everything 😅 "No connection possible" says Apple TV

edit: I rebuild without wakener branch … works again … PLUS I can now set volume when both TV and Shairport are connected (I don‘t see the volume slider on screen though … I can live with it right now)

outsharded commented 2 years ago

It worked perfectly by just removing and reinstalling everything! Also was able to add ALAC support so it appears to have fixed itself.

microfx commented 2 years ago

what do you mean with „everything“? In a bhuddist way? 😄

outsharded commented 2 years ago

what do you mean with „everything“? In a bhuddist way? 😄

I mean no seeking, plays to one speaker, it's exactly how it should be as a Shairport-Sync server.

mikebrady commented 2 years ago

Thanks. Just FYI, the wakener branch will be deleted shortly -- it's been merged into the development branch.

mikebrady commented 2 years ago

Just FYI, a bug has just been fixed in Shairport Sync itself that should make it more reliable with Apple TV.

microfx commented 2 years ago

Just FYI, a bug has just been fixed in Shairport Sync itself that should make it more reliable with Apple TV.

Thanks a lot for letting us now!! Really appreciated!

What's the best way to update "everything" now?

Remove all services / binaries etc. then git clone dev branche of shairplay / compile, then git clone dev branche of nqtpt / compile? Restart?

mikebrady commented 2 years ago

Yeah, but build them in the opposite order -- do nqptp first and make sure it's restarted and running before you do Shairport Sync.

Thanks.

mikebrady commented 2 years ago

Let us know how it works for you, please. I've been testing it with Netflix, Amazon Prime, YouTube. Some other AppleTV apps don't do AirPlay 2 at all.

mikebrady commented 2 years ago

Yeah, but build them in the opposite order -- do nqptp first and make sure it's restarted and running before you do Shairport Sync.

Thanks.

PS -- make sure it's the development branch of nqptp you use!

microfx commented 2 years ago

Hmm… still (frozen) „beachball“ + black screen when using Amazon Prime. Everything else works pretty good so far!

I paste my bash history .. maybe you can see a mistake on my end (also maybe my „old“ shairport-sync.conf might be a problem?)

Hm… I realize I don‘t understand the following: my shairport-sync.conf seems to be the default … BUT it will execute my script to turn on my speakers before playback / turn off after playback…


rm -rf nqptp/
rm -rd shairport-sync/
rm -rf shairport-sync/
sudo rm /lib/systemd/system/nqptp.service
sudo rm /lib/systemd/system/shairport-sync.service 
which shairport-sync 
rm -rf /usr/local/bin/shairport-sync 
sudo rm -rf /usr/local/bin/shairport-sync 
sudo rm -rf /usr/local/bin/nqptp 
git clone https://github.com/mikebrady/nqptp.git
cd nqptp/
git checkout development
./configure --with-systemd-startup
autoreconf -fi
./configure --with-systemd-startup
make
sudo make install
cd ..
sudo reboot
sudo systemctl status nqptp.service 
git clone https://github.com/mikebrady/shairport-sync.git
cd shairport-sync/
git checkout development 
autoconf -fi
autoreconf -fi
./configure --with-systemd-startup
./configure --sysconfdir=/etc --with-alsa     --with-soxr --with-avahi --with-ssl=openssl --with-systemd --with-dbus-interface --with-airplay-2
make
sudo make install
sudo reboot
sudo killall jackd
sudo systemctl status shairport-sync.service

cat /usr/local/etc/shairport-sync.conf
// Sample Configuration File for Shairport Sync
// Commented out settings are generally the defaults, except where noted.
// Some sections are operative only if Shairport Sync has been built with the right configuration flags.
// See the individual sections for details.

// General Settings
general =
{
//      name = "%H"; // This means "Hostname" -- see below. This is the name the service will advertise to iTunes.
//              The default is "Hostname" -- i.e. the machine's hostname with the first letter capitalised (ASCII only.)
//              You can use the following substitutions:
//                              %h for the hostname,
//                              %H for the Hostname (i.e. with first letter capitalised (ASCII only)),
//                              %v for the version number, e.g. 3.0 and
//                              %V for the full version string, e.g. 3.3-OpenSSL-Avahi-ALSA-soxr-metadata-sysconfdir:/etc
//              Overall length can not exceed 50 characters. Example: "Shairport Sync %v on %H".
//      password = "secret"; // leave this commented out if you don't want to require a password
//      interpolation = "auto"; // aka "stuffing". Default is "auto". Alternatives are "basic" or "soxr". Choose "soxr" only if you have a reasonably fast processor and Shairport Sync has been built with "soxr" support.
//      output_backend = "alsa"; // Run "shairport-sync -h" to get a list of all output_backends, e.g. "alsa", "pipe", "stdout". The default is the first one.
//      mdns_backend = "avahi"; // Run "shairport-sync -h" to get a list of all mdns_backends. The default is the first one.
//      interface = "name"; // Use this advanced setting to specify the interface on which Shairport Sync should provide its service. Leave it commented out to get the default, which is to select the interface(s) automatically.
//      port = 5000; // Listen for service requests on this port
//      udp_port_base = 6001; // start allocating UDP ports from this port number when needed
//      udp_port_range = 10; // look for free ports in this number of places, starting at the UDP port base. Allow at least 10, though only three are needed in a steady state.
//      regtype = "_raop._tcp"; // Use this advanced setting to set the service type and transport to be advertised by Zeroconf/Bonjour. Default is "_raop._tcp".

//      drift_tolerance_in_seconds = 0.002; // allow a timing error of this number of seconds of drift away from exact synchronisation before attempting to correct it
//      resync_threshold_in_seconds = 0.050; // a synchronisation error greater than this number of seconds will cause resynchronisation; 0 disables it

//      playback_mode = "stereo"; // This can be "stereo", "mono", "reverse stereo", "both left" or "both right". Default is "stereo".
//      alac_decoder = "hammerton"; // This can be "hammerton" or "apple". This advanced setting allows you to choose
//              the original Shairport decoder by David Hammerton or the Apple Lossless Audio Codec (ALAC) decoder written by Apple.
//              If you build Shairport Sync with the flag --with-apple-alac, the Apple ALAC decoder will be chosen by default.

//      ignore_volume_control = "no"; // set this to "yes" if you want the volume to be at 100% no matter what the source's volume control is set to.
//      volume_range_db = 60 ; // use this advanced setting to set the range, in dB, you want between the maximum volume and the minimum volume. Range is 30 to 150 dB. Leave it commented out to use mixer's native range.
//      volume_max_db = 0.0 ; // use this advanced setting, which must have a decimal point in it, to set the maximum volume, in dB, you wish to use.
//              The setting is for the hardware mixer, if chosen, or the software mixer otherwise. The value must be in the mixer's range (0.0 to -96.2 for the software mixer).
//              Leave it commented out to use mixer's maximum volume.
//      volume_control_profile = "standard" ; // use this advanced setting to specify how the airplay volume is transferred to the mixer volume.
//              "standard" makes the volume change more quickly at lower volumes and slower at higher volumes.
//              "flat" makes the volume change at the same rate at all volumes.
//      volume_range_combined_hardware_priority = "no"; // when extending the volume range by combining the built-in software attenuator with the hardware mixer attenuator, set this to "yes" to reduce volume by using the hardware mixer first, then the built-in software attenuator.
//      run_this_when_volume_is_set = "/full/path/to/application/and/args"; //  Run the specified application whenever the volume control is set or changed.
//              The desired AirPlay volume is appended to the end of the command line – leave a space if you want it treated as an extra argument.
//              AirPlay volume goes from 0 to -30 and -144 means "mute".

//      audio_backend_latency_offset_in_seconds = 0.0; // This is added to the latency requested by the player to delay or advance the output by a fixed amount.
//              Use it, for example, to compensate for a fixed delay in the audio back end.
//              E.g. if the output device, e.g. a soundbar, takes 100 ms to process audio, set this to -0.1 to deliver the audio
//              to the output device 100 ms early, allowing it time to process the audio and output it perfectly in sync.
//      audio_backend_buffer_desired_length_in_seconds = 0.2; // If set too small, buffer underflow occurs on low-powered machines.
//              Too long and the response time to volume changes becomes annoying.
//              Default is 0.2 seconds in the alsa backend, 0.35 seconds in the pa backend and 1.0 seconds otherwise.
//      audio_backend_buffer_interpolation_threshold_in_seconds = 0.075; // Advanced feature. If the buffer size drops below this, stop using time-consuming interpolation like soxr to avoid dropouts due to underrun.
//      audio_backend_silent_lead_in_time = "auto"; // This optional advanced setting, either "auto" or a positive number, sets the length of the period of silence that precedes the start of the audio.
//              The default is "auto" -- the silent lead-in starts as soon as the player starts sending packets.
//              Values greater than the latency are ignored. Values that are too low will affect initial synchronisation.

//      dbus_service_bus = "system"; // The Shairport Sync dbus interface, if selected at compilation, will appear
//              as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
//      mpris_service_bus = "system"; // The Shairport Sync mpris interface, if selected at compilation, will appear
//              as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".

//      resend_control_first_check_time = 0.10; // Use this optional advanced setting to set the wait time in seconds before deciding a packet is missing.
//      resend_control_check_interval_time = 0.25; //  Use this optional advanced setting to set the time in seconds between requests for a missing packet.
//      resend_control_last_check_time = 0.10; // Use this optional advanced setting to set the latest time, in seconds, by which the last check should be done before the estimated time of a missing packet's transfer to the output buffer.
//      missing_port_dacp_scan_interval_seconds = 2.0; // Use this optional advanced setting to set the time interval between scans for a DACP port number if no port number has been provided by the player for remote control commands
};

// Advanced parameters for controlling how Shairport Sync stays active and how it runs a session
sessioncontrol =
{
//      "active" state starts when play begins and ends when the active_state_timeout has elapsed after play ends, unless another play session starts before the timeout has fully elapsed.
//      run_this_before_entering_active_state = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
//      run_this_after_exiting_active_state = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
//      active_state_timeout = 10.0; // wait for this number of seconds after play ends before leaving the active state, unless another play session begins.

//      run_this_before_play_begins = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
//      run_this_after_play_ends = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line

//      run_this_if_an_unfixable_error_is_detected = "/full/path/to/application and args"; // if a problem occurs that can't be cleared by Shairport Sync itself, hook a program on here to deal with it. An error code-string is passed as the last argument.
//        Many of these "unfixable" problems are caused by malfunctioning output devices, and sometimes it is necessary to restart the whole device to clear the problem.
//        You could hook on a program to do this automatically, but beware -- the device may then power off and restart without warning!
//      wait_for_completion = "no"; // set to "yes" to get Shairport Sync to wait until the "run_this..." applications have terminated before continuing

//      allow_session_interruption = "no"; // set to "yes" to allow another device to interrupt Shairport Sync while it's playing from an existing audio source
//      session_timeout = 120; // wait for this number of seconds after a source disappears before terminating the session and becoming available again.
};

// Back End Settings

// These are parameters for the "alsa" audio back end.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-alsa
alsa =
{
//      output_device = "default"; // the name of the alsa output device. Use "shairport-sync -h" to discover the names of ALSA hardware devices. Use "alsamixer" or "aplay" to find out the names of devices, mixers, etc.
//      mixer_control_name = "PCM"; // the name of the mixer to use to adjust output volume. If not specified, volume in adjusted in software.
//      mixer_device = "default"; // the mixer_device default is whatever the output_device is. Normally you wouldn't have to use this.

//      output_rate = "auto"; // can be "auto", 44100, 88200, 176400 or 352800, but the device must have the capability.
//      output_format = "auto"; // can be "auto", "U8", "S8", "S16", "S16_LE", "S16_BE", "S24", "S24_LE", "S24_BE", "S24_3LE", "S24_3BE", "S32", "S32_LE" or "S32_BE" but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor.

//      disable_synchronization = "no"; // Set to "yes" to disable synchronization. Default is "no" This is really meant for troubleshootingG.

//      period_size = <number>; // Use this optional advanced setting to set the alsa period size near to this value
//      buffer_size = <number>; // Use this optional advanced setting to set the alsa buffer size near to this value
//      use_mmap_if_available = "yes"; // Use this optional advanced setting to control whether MMAP-based output is used to communicate  with the DAC. Default is "yes"
//      use_hardware_mute_if_available = "no"; // Use this optional advanced setting to control whether the hardware in the DAC is used for muting. Default is "no", for compatibility with other audio players.
//      maximum_stall_time = 0.200; // Use this optional advanced setting to control how long to wait for data to be consumed by the output device before considering it an error. It should never approach 200 ms.
//      use_precision_timing = "auto"; // Use this optional advanced setting to control how Shairport Sync gathers timing information. When set to "auto", if the output device is a real hardware device, precision timing will be used. Choose "no" for more compatible standard timing, choose "yes" to force the use of precision timing, which may cause problems.

//      disable_standby_mode = "never"; // This setting prevents the DAC from entering the standby mode. Some DACs make small "popping" noises when they go in and out of standby mode. Settings can be: "always", "auto" or "never". Default is "never", but only for backwards compatibility. The "auto" setting prevents entry to standby mode while Shairport Sync is in the "active" mode. You can use "yes" instead of "always" and "no" instead of "never".
//      disable_standby_mode_silence_threshold = 0.040; // Use this optional advanced setting to control how little audio should remain in the output buffer before the disable_standby code should start sending silence to the output device.
//      disable_standby_mode_silence_scan_interval = 0.004; // Use this optional advanced setting to control how often the amount of audio remaining in the output buffer should be checked.
};

// Parameters for the "sndio" audio back end. All are optional.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-sndio
sndio =
{
//      device = "snd/0"; // optional setting to set the name of the output device. Default is the sndio system default.
//      rate = 44100; // optional setting  which can be 44100, 88200, 176400 or 352800, but the device must have the capability. Default is 44100.
//      format = "S16"; // optional setting  which can be "U8", "S8", "S16", "S24", "S24_3LE", "S24_3BE" or "S32", but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor.
//      round = <number>; // advanced optional setting to set the period size near to this value
//      bufsz = <number>; // advanced optional setting to set the buffer size near to this value
};

// Parameters for the "pa" PulseAudio  backend.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-pa
pa =
{
//      server = "host"; // Set this to override the default pulseaudio server that should be used.
//      sink = "Sink Name"; // Set this to override the default pulseaudio sink that should be used. (Untested)
//      application_name = "Shairport Sync"; //Set this to the name that should appear in the Sounds "Applications" tab when Shairport Sync is active.
};

// Parameters for the "jack" JACK Audio Connection Kit backend.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-jack
jack =
{
//      client_name = "shairport-sync"; // Set this to the name of the client that should appear in "Connections" when Shairport Sync is active.
//      autoconnect_pattern = ""; // Set this to a POSIX regular expression pattern that describes the ports you would like to connect to
//                                   automatically. Examples:
//                                   "system:playback_[12]"
//                                   "some_app_[0-9]*:in-[LR]"
//                                   "jack_mixer:in_2[78]"
//                                   Beware: if you make a syntax error, libjack might crash. In that case, fix it and start over.
//                                   For a good overview, look here: https://www.ibm.com/support/knowledgecenter/SS8NLW_11.0.1/com.ibm.swg.im.infosphere.dataexpl.engine.doc/c_posix-regex-examples.html
//  soxr_resample_quality = "none"; // Enable resampling by setting this to "very high", "high", "medium", "low" or "quick"
//      bufsz = <number>; // advanced optional setting to set the buffer size to this value
};

// Parameters for the "pipe" audio back end, a back end that directs raw CD-style audio output to a pipe. No interpolation is done.
// For this section to be operative, Shairport Sync must have been built with the following configuration flag:
// --with-pipe
pipe =
{
//      name = "/tmp/shairport-sync-audio"; // this is the default
};

// There are no configuration file parameters for the "stdout" audio back end. No interpolation is done.
// To include support for the "stdout" backend, Shairport Sync must be built with the following configuration flag:
// --with-stdout

// There are no configuration file parameters for the "ao" audio back end. No interpolation is done.
// To include support for the "ao" backend, Shairport Sync must be built with the following configuration flag:
// --with-ao

// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-convolution
dsp =
{

//////////////////////////////////////////
// This convolution filter can be used to apply almost any correction to the audio signal, like frequency and phase correction.
// For example you could measure (with a good microphone and a sweep-sine) the frequency response of your speakers + room,
// and apply a correction to get a flat response curve.
//////////////////////////////////////////
//
//      convolution = "no";                   // Set this to "yes" to activate the convolution filter.
//      convolution_ir_file = "impulse.wav";  // Impulse Response file to be convolved to the audio stream
//      convolution_gain = -4.0;              // Static gain applied to prevent clipping during the convolution process
//      convolution_max_length = 44100;       // Truncate the input file to this length in order to save CPU.

//////////////////////////////////////////
// This loudness filter is used to compensate for human ear non linearity.
// When the volume decreases, our ears loose more sentisitivity in the low range frequencies than in the mid range ones.
// This filter aims at compensating for this loss, applying a variable gain to low frequencies depending on the volume.
// More info can be found here: https://en.wikipedia.org/wiki/Equal-loudness_contour
// For this filter to work properly, you should disable (or set to a fix value) all other volume control and only let shairport-sync control your volume.
// The setting "loudness_reference_volume_db" should be set at the volume reported by shairport-sync when listening to music at a normal listening volume.
//////////////////////////////////////////
//
//      loudness = "no";                      // Set this to "yes" to activate the loudness filter
//      loudness_reference_volume_db = -20.0; // Above this level the filter will have no effect anymore. Below this level it will gradually boost the low frequencies.

};

// How to deal with metadata, including artwork
// For this section to be operative, Shairport Sync must be built with at one (or more) of the following configuration flags:
// --with-metadata, --with-dbus-interface, --with-mpris-interface or --with-mqtt-client.
// In those cases, "enabled" and "include_cover_art" will both be "yes" by default
metadata =
{
//      enabled = "yes"; // set this to yes to get Shairport Sync to solicit metadata from the source and to pass it on via a pipe
//      include_cover_art = "yes"; // set to "yes" to get Shairport Sync to solicit cover art from the source and pass it via the pipe. You must also set "enabled" to "yes".
//      cover_art_cache_directory = "/tmp/shairport-sync/.cache/coverart"; // artwork will be  stored in this directory if the dbus or MPRIS interfaces are enabled or if the MQTT client is in use. Set it to "" to prevent caching, which may be useful on some systems
//      pipe_name = "/tmp/shairport-sync-metadata";
//      pipe_timeout = 5000; // wait for this number of milliseconds for a blocked pipe to unblock before giving up
//      socket_address = "226.0.0.1"; // if set to a host name or IP address, UDP packets containing metadata will be sent to this address. May be a multicast address. "socket-port" must be non-zero and "enabled" must be set to yes"
//      socket_port = 5555; // if socket_address is set, the port to send UDP packets to
//      socket_msglength = 65000; // the maximum packet size for any UDP metadata. This will be clipped to be between 500 or 65000. The default is 500.
};

// How to enable the MQTT-metadata/remote-service
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-mqtt-client
mqtt =
{
//      enabled = "no"; // set this to yes to enable the mqtt-metadata-service
//      hostname = "iot.eclipse.org"; // Hostname of the MQTT Broker
//      port = 1883; // Port on the MQTT Broker to connect to
//      username = NULL; //set this to a string to your username in order to enable username authentication
//      password = NULL; //set this to a string you your password in order to enable username & password authentication
//      capath = NULL; //set this to the folder with the CA-Certificates to be accepted for the server certificate. If not set, TLS is not used
//      cafile = NULL; //this may be used as an (exclusive) alternative to capath with a single file for all ca-certificates
//      certfile = NULL; //set this to a string to a user certificate to enable MQTT Client certificates. keyfile must also be set!
//      keyfile = NULL; //private key for MQTT Client authentication
//      topic = NULL; //MQTT topic where this instance of shairport-sync should publish. If not set, the general.name value is used.
//      publish_raw = "no"; //whether to publish all available metadata under the codes given in the 'metadata' docs.
//      publish_parsed = "no"; //whether to publish a small (but useful) subset of metadata under human-understandable topics
//      Currently published topics:artist,album,title,genre,format,songalbum,volume,client_ip,
//      Additionally, empty messages at the topics play_start,play_end,play_flush,play_resume are published
//      publish_cover = "no"; //whether to publish the cover over mqtt in binary form. This may lead to a bit of load on the broker
//      enable_remote = "no"; //whether to remote control via MQTT. RC is available under `topic`/remote.
//      Available commands are "command", "beginff", "beginrew", "mutetoggle", "nextitem", "previtem", "pause", "playpause", "play", "stop", "playresume", "shuffle_songs", "volumedown", "volumeup"
};

// Diagnostic settings. These are for diagnostic and debugging only. Normally you should leave them commented out
diagnostics =
{
//      disable_resend_requests = "no"; // set this to yes to stop Shairport Sync from requesting the retransmission of missing packets. Default is "no".
//      log_output_to = "syslog"; // set this to "syslog" (default), "stderr" or "stdout" or a file or pipe path to specify were all logs, statistics and diagnostic messages are written to. If there's anything wrong with the file spec, output will be to "stderr".
//      statistics = "no"; // set to "yes" to print statistics in the log
//      log_verbosity = 0; // "0" means no debug verbosity, "3" is most verbose.
//      log_show_file_and_line = "yes"; // set this to yes if you want the file and line number of the message source in the log file
//      log_show_time_since_startup = "no"; // set this to yes if you want the time since startup in the debug message -- seconds down to nanoseconds
//      log_show_time_since_last_message = "yes"; // set this to yes if you want the time since the last debug message in the debug message -- seconds down to nanoseconds
//      drop_this_fraction_of_audio_packets = 0.0; // use this to simulate a noisy network where this fraction of UDP packets are lost in transmission. E.g. a value of 0.001 would mean an average of 0.1% of packets are lost, which is actually quite a high figure.
//      retain_cover_art = "no"; // artwork is deleted when its corresponding track has been played. Set this to "yes" to retain all artwork permanently. Warning -- your directory might fill up.
};
mikebrady commented 2 years ago

Thanks. Could you just list the version strings for both programs please? As follows:

$ shairport-sync -V
$ nqptp -V

I notice you do not select an output device in the configuration file, and maybe the default device is not a real hardware device but rather a pulseaudio fake device. The output from $ shairport-sync -h should list the hardware output devices available to you. Perhaps you would list them here too:

$ shairport-sync -h

Just the last few lines are important.

mikebrady commented 2 years ago

Also, are you running jack on the system as well?

microfx commented 2 years ago
shairport-sync -V
4.1-dev-20-gfb1b2e9d-AirPlay2-OpenSSL-Avahi-ALSA-soxr-metadata-dbus-sysconfdir:/etc
patch@MiCROLABS-P3:~$ nqptp -V
Version: 1.1-dev-86-g512a251. Shared Memory Interface Version: 5.

Available audio backends:
    alsa (default)

    hardware output devices:
      "hw:Loopback"
      "hw:pisound"

Yes, I’m using jack - it‘s on autostart (using my rasperry with a pisound DAC with a line input for my synthesizer/drummachine)

mikebrady commented 2 years ago

Thanks. A couple of things:

Your shairport-sync and nqptp programs are up to date.

I see also that Shairport Sync expects your configuration file to be at /etc/shairport-sync.conf. Perhaps you could list that?

If your pisound device is this one, then -- rather oddly -- it does not list a sampling frequency of 44,100 frames per second in its specification. This rate -- 44,100 fps -- is CD quality and AirPlay 1 and basic AirPlay 2 require it to function. It may be that they just left it out of the specification.

For it to be effective, it should

microfx commented 2 years ago

Thanks. A couple of things:

Your shairport-sync and nqptp programs are up to date.

I see also that Shairport Sync expects your configuration file to be at /etc/shairport-sync.conf. Perhaps you could list that?

If your pisound device is this one, then -- rather oddly -- it does not list a sampling frequency of 44,100 frames per second in its specification. This rate -- 44,100 fps -- is CD quality and AirPlay 1 and basic AirPlay 2 require it to function. It may be that they just left it out of the specification.

For it to be effective, it should

oh.. phew.. all those different locations in Linux - you are right! I also do a rate conversion from 44,1kHz to 48 kHz in my .asoundrc (I better don‘t touch that ever again 😄 happy it works!)


$ cat .asoundrc
pcm.!default
{
  type plug
  slave sl1
}

ctl.!default
{
  type hw
  card 1
}

pcm_slave.sl1
{
  pcm "hw:1,0"
  format S16_LE
  channels 2
  rate 48000
}

pcm_slave.pisound
{
    pcm "hw:1,0"
    rate 48000
}

pcm.airplay {
    type rate
    slave pisound
}

cat /etc/shairport-sync.conf
// Sample Configuration File for Shairport Sync
// Commented out settings are generally the defaults, except where noted.
// Some sections are operative only if Shairport Sync has been built with the right configuration flags.
// See the individual sections for details.

// General Settings
general =
{
//      name = "%H"; // This means "Hostname" -- see below. This is the name the service will advertise to iTunes.
//              The default is "Hostname" -- i.e. the machine's hostname with the first letter capitalised (ASCII only.)
//              You can use the following substitutions:
//                              %h for the hostname,
//                              %H for the Hostname (i.e. with first letter capitalised (ASCII only)),
//                              %v for the version number, e.g. 3.0 and
//                              %V for the full version string, e.g. 3.3-OpenSSL-Avahi-ALSA-soxr-metadata-sysconfdir:/etc
//              Overall length can not exceed 50 characters. Example: "Shairport Sync %v on %H".
//      password = "secret"; // leave this commented out if you don't want to require a password
//      interpolation = "auto"; // aka "stuffing". Default is "auto". Alternatives are "basic" or "soxr". Choose "soxr" only if you have a reasonably fast processor and Shairport Sync has been built with "soxr" support.
        output_backend = "alsa"; // Run "shairport-sync -h" to get a list of all output_backends, e.g. "alsa", "pipe", "stdout". The default is the first one.
//      mdns_backend = "avahi"; // Run "shairport-sync -h" to get a list of all mdns_backends. The default is the first one.
//      interface = "name"; // Use this advanced setting to specify the interface on which Shairport Sync should provide its service. Leave it commented out to get the default, which is to select the interface(s) automatically.
//      port = 5000; // Listen for service requests on this port
//      udp_port_base = 6001; // start allocating UDP ports from this port number when needed
//      udp_port_range = 10; // look for free ports in this number of places, starting at the UDP port base. Allow at least 10, though only three are needed in a steady state.
//      regtype = "_raop._tcp"; // Use this advanced setting to set the service type and transport to be advertised by Zeroconf/Bonjour. Default is "_raop._tcp".

//      drift_tolerance_in_seconds = 0.002; // allow a timing error of this number of seconds of drift away from exact synchronisation before attempting to correct it
//      resync_threshold_in_seconds = 0.050; // a synchronisation error greater than this number of seconds will cause resynchronisation; 0 disables it

//      playback_mode = "stereo"; // This can be "stereo", "mono", "reverse stereo", "both left" or "both right". Default is "stereo".
//      alac_decoder = "hammerton"; // This can be "hammerton" or "apple". This advanced setting allows you to choose
//              the original Shairport decoder by David Hammerton or the Apple Lossless Audio Codec (ALAC) decoder written by Apple.
//              If you build Shairport Sync with the flag --with-apple-alac, the Apple ALAC decoder will be chosen by default.

//      ignore_volume_control = "no"; // set this to "yes" if you want the volume to be at 100% no matter what the source's volume control is set to.
        volume_range_db = 100 ; // use this advanced setting to set the range, in dB, you want between the maximum volume and the minimum volume. Range is 30 to 150 dB. Leave it commented out to use mixer's native range.
//      volume_max_db = 0.0 ; // use this advanced setting, which must have a decimal point in it, to set the maximum volume, in dB, you wish to use.
//              The setting is for the hardware mixer, if chosen, or the software mixer otherwise. The value must be in the mixer's range (0.0 to -96.2 for the software mixer).
//              Leave it commented out to use mixer's maximum volume.
        volume_control_profile = "standard" ; // use this advanced setting to specify how the airplay volume is transferred to the mixer volume.
//              "standard" makes the volume change more quickly at lower volumes and slower at higher volumes.
//              "flat" makes the volume change at the same rate at all volumes.
//      volume_range_combined_hardware_priority = "no"; // when extending the volume range by combining the built-in software attenuator with the hardware mixer attenuator, set this to "yes" to reduce volume by using the hardware mixer first, then the built-in software attenuator.
//      run_this_when_volume_is_set = "/full/path/to/application/and/args"; //      Run the specified application whenever the volume control is set or changed.
//              The desired AirPlay volume is appended to the end of the command line – leave a space if you want it treated as an extra argument.
//              AirPlay volume goes from 0 to -30 and -144 means "mute".

//      audio_backend_latency_offset_in_seconds = 0.0; // This is added to the latency requested by the player to delay or advance the output by a fixed amount.
//              Use it, for example, to compensate for a fixed delay in the audio back end.
//              E.g. if the output device, e.g. a soundbar, takes 100 ms to process audio, set this to -0.1 to deliver the audio
//              to the output device 100 ms early, allowing it time to process the audio and output it perfectly in sync.
        audio_backend_buffer_desired_length_in_seconds = 0.2; // If set too small, buffer underflow occurs on low-powered machines.
//              Too long and the response time to volume changes becomes annoying.
//              Default is 0.2 seconds in the alsa backend, 0.35 seconds in the pa backend and 1.0 seconds otherwise.
//      audio_backend_buffer_interpolation_threshold_in_seconds = 0.075; // Advanced feature. If the buffer size drops below this, stop using time-consuming interpolation like soxr to avoid dropouts due to underrun.
//      audio_backend_silent_lead_in_time = "auto"; // This optional advanced setting, either "auto" or a positive number, sets the length of the period of silence that precedes the start of the audio.
//              The default is "auto" -- the silent lead-in starts as soon as the player starts sending packets.
//              Values greater than the latency are ignored. Values that are too low will affect initial synchronisation.

//      dbus_service_bus = "system"; // The Shairport Sync dbus interface, if selected at compilation, will appear
//              as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
//      mpris_service_bus = "system"; // The Shairport Sync mpris interface, if selected at compilation, will appear
//              as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".

//      resend_control_first_check_time = 0.10; // Use this optional advanced setting to set the wait time in seconds before deciding a packet is missing.
//      resend_control_check_interval_time = 0.25; //  Use this optional advanced setting to set the time in seconds between requests for a missing packet.
//      resend_control_last_check_time = 0.10; // Use this optional advanced setting to set the latest time, in seconds, by which the last check should be done before the estimated time of a missing packet's transfer to the output buffer.
//      missing_port_dacp_scan_interval_seconds = 2.0; // Use this optional advanced setting to set the time interval between scans for a DACP port number if no port number has been provided by the player for remote control commands
};

// Advanced parameters for controlling how Shairport Sync stays active and how it runs a session
sessioncontrol =
{
//      "active" state starts when play begins and ends when the active_state_timeout has elapsed after play ends, unless another play session starts before the timeout has fully elapsed.
        run_this_before_entering_active_state = "/bin/bash /usr/local/bin/webhook_airplay_start.sh"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
        run_this_after_exiting_active_state = "/bin/bash /usr/local/bin/webhook_airplay_stop.sh"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
        active_state_timeout = 200.0; // wait for this number of seconds after play ends before leaving the active state, unless another play session begins.

//      run_this_before_play_begins = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line
//      run_this_after_play_ends = "/full/path/to/application and args"; // make sure the application has executable permission. If it's a script, include the shebang (#!/bin/...) on the first line

//      run_this_if_an_unfixable_error_is_detected = "/full/path/to/application and args"; // if a problem occurs that can't be cleared by Shairport Sync itself, hook a program on here to deal with it. An error code-string is passed as the last argument.
//        Many of these "unfixable" problems are caused by malfunctioning output devices, and sometimes it is necessary to restart the whole device to clear the problem.
//        You could hook on a program to do this automatically, but beware -- the device may then power off and restart without warning!
//      wait_for_completion = "no"; // set to "yes" to get Shairport Sync to wait until the "run_this..." applications have terminated before continuing

        allow_session_interruption = "yes"; // set to "yes" to allow another device to interrupt Shairport Sync while it's playing from an existing audio source
//      session_timeout = 120; // wait for this number of seconds after a source disappears before terminating the session and becoming available again.
};

// Back End Settings

// These are parameters for the "alsa" audio back end.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-alsa
alsa =
{
//      output_device = "hw:pisound"; // the name of the alsa output device. Use "shairport-sync -h" to discover the names of ALSA hardware devices. Use "alsamixer" or "aplay" to find out the names of devices, mixers, etc.
//      mixer_control_name = "PCM"; // the name of the mixer to use to adjust output volume. If not specified, volume in adjusted in software.
        mixer_device = "default"; // the mixer_device default is whatever the output_device is. Normally you wouldn't have to use this.

//      output_rate = "auto"; // can be "auto", 44100, 88200, 176400 or 352800, but the device must have the capability.
//      output_format = "auto"; // can be "auto", "U8", "S8", "S16", "S16_LE", "S16_BE", "S24", "S24_LE", "S24_BE", "S24_3LE", "S24_3BE", "S32", "S32_LE" or "S32_BE" but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor.

//      disable_synchronization = "no"; // Set to "yes" to disable synchronization. Default is "no" This is really meant for troubleshootingG.

//      period_size = <number>; // Use this optional advanced setting to set the alsa period size near to this value
//      buffer_size = <number>; // Use this optional advanced setting to set the alsa buffer size near to this value
//      use_mmap_if_available = "yes"; // Use this optional advanced setting to control whether MMAP-based output is used to communicate  with the DAC. Default is "yes"
//      use_hardware_mute_if_available = "no"; // Use this optional advanced setting to control whether the hardware in the DAC is used for muting. Default is "no", for compatibility with other audio players.
//      maximum_stall_time = 0.200; // Use this optional advanced setting to control how long to wait for data to be consumed by the output device before considering it an error. It should never approach 200 ms.
//      use_precision_timing = "auto"; // Use this optional advanced setting to control how Shairport Sync gathers timing information. When set to "auto", if the output device is a real hardware device, precision timing will be used. Choose "no" for more compatible standard timing, choose "yes" to force the use of precision timing, which may cause problems.

//      disable_standby_mode = "never"; // This setting prevents the DAC from entering the standby mode. Some DACs make small "popping" noises when they go in and out of standby mode. Settings can be: "always", "auto" or "never". Default is "never", but only for backwards compatibility. The "auto" setting prevents entry to standby mode while Shairport Sync is in the "active" mode. You can use "yes" instead of "always" and "no" instead of "never".
//      disable_standby_mode_silence_threshold = 0.040; // Use this optional advanced setting to control how little audio should remain in the output buffer before the disable_standby code should start sending silence to the output device.
//      disable_standby_mode_silence_scan_interval = 0.004; // Use this optional advanced setting to control how often the amount of audio remaining in the output buffer should be checked.
};

// Parameters for the "sndio" audio back end. All are optional.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-sndio
sndio =
{
//      device = "snd/0"; // optional setting to set the name of the output device. Default is the sndio system default.
//      rate = 44100; // optional setting  which can be 44100, 88200, 176400 or 352800, but the device must have the capability. Default is 44100.
//      format = "S16"; // optional setting  which can be "U8", "S8", "S16", "S24", "S24_3LE", "S24_3BE" or "S32", but the device must have the capability. Except where stated using (*LE or *BE), endianness matches that of the processor.
//      round = <number>; // advanced optional setting to set the period size near to this value
//      bufsz = <number>; // advanced optional setting to set the buffer size near to this value
};

// Parameters for the "pa" PulseAudio  backend.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-pa
pa =
{
//      server = "host"; // Set this to override the default pulseaudio server that should be used.
//      application_name = "Shairport Sync"; //Set this to the name that should appear in the Sounds "Applications" tab when Shairport Sync is active.
};

// Parameters for the "jack" JACK Audio Connection Kit backend.
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-jack
jack =
{
//      client_name = "shairport-sync"; // Set this to the name of the client that should appear in "Connections" when Shairport Sync is active.
//      autoconnect_pattern = "system:playback_[12]"; // Set this to a POSIX regular expression pattern that describes the ports you would like to connect to
//                                  automatically. Examples:                                 "system:playback_[12]"
//                                   "some_app_[0-9]*:in-[LR]"
//                                   "jack_mixer:in_2[78]"
//                                   Beware: if you make a syntax error, libjack might crash. In that case, fix it and start over.
//                                   For a good overview, look here: https://www.ibm.com/support/knowledgecenter/SS8NLW_11.0.1/com.ibm.swg.im.infosphere.dataexpl.engine.doc/c_posix-regex-examples.html
// soxr_resample_quality = "very high"; // Enable resampling by setting this to "very high", "high", "medium", "low" or "quick"
//      bufsz = <number>; // advanced optional setting to set the buffer size to this value
};

// Parameters for the "pipe" audio back end, a back end that directs raw CD-style audio output to a pipe. No interpolation is done.
// For this section to be operative, Shairport Sync must have been built with the following configuration flag:
// --with-pipe
pipe =
{
//      name = "/path/to/pipe"; // there is no default pipe name for the output
};

// There are no configuration file parameters for the "stdout" audio back end. No interpolation is done.
// To include support for the "stdout" backend, Shairport Sync must be built with the following configuration flag:
// --with-stdout

// There are no configuration file parameters for the "ao" audio back end. No interpolation is done.
// To include support for the "ao" backend, Shairport Sync must be built with the following configuration flag:
// --with-ao

// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-convolution
dsp =
{

//////////////////////////////////////////
// This convolution filter can be used to apply almost any correction to the audio signal, like frequency and phase correction.
// For example you could measure (with a good microphone and a sweep-sine) the frequency response of your speakers + room,
// and apply a correction to get a flat response curve.
//////////////////////////////////////////
//
//      convolution = "no";                   // Set this to "yes" to activate the convolution filter.
//      convolution_ir_file = "impulse.wav";  // Impulse Response file to be convolved to the audio stream
//      convolution_gain = -4.0;              // Static gain applied to prevent clipping during the convolution process
//      convolution_max_length = 44100;       // Truncate the input file to this length in order to save CPU.

//////////////////////////////////////////
// This loudness filter is used to compensate for human ear non linearity.
// When the volume decreases, our ears loose more sentisitivity in the low range frequencies than in the mid range ones.
// This filter aims at compensating for this loss, applying a variable gain to low frequencies depending on the volume.
// More info can be found here: https://en.wikipedia.org/wiki/Equal-loudness_contour
// For this filter to work properly, you should disable (or set to a fix value) all other volume control and only let shairport-sync control your volume.
// The setting "loudness_reference_volume_db" should be set at the volume reported by shairport-sync when listening to music at a normal listening volume.
//////////////////////////////////////////
//
        loudness = "yes";                      // Set this to "yes" to activate the loudness filter
        loudness_reference_volume_db = -20.0; // Above this level the filter will have no effect anymore. Below this level it will gradually boost the low frequencies.

};

// How to deal with metadata, including artwork
// For this section to be operative, Shairport Sync must be built with at one (or more) of the following configuration flags:
// --with-metadata, --with-dbus-interface, --with-mpris-interface or --with-mqtt-client.
// In those cases, "enabled" and "include_cover_art" will both be "yes" by default
metadata =
{
//      enabled = "yes"; // set this to yes to get Shairport Sync to solicit metadata from the source and to pass it on via a pipe
//      include_cover_art = "yes"; // set to "yes" to get Shairport Sync to solicit cover art from the source and pass it via the pipe. You must also set "enabled" to "yes".
//      cover_art_cache_directory = "/tmp/shairport-sync/.cache/coverart"; // artwork will be  stored in this directory if the dbus or MPRIS interfaces are enabled or if the MQTT client is in use. Set it to "" to prevent caching, which may be useful on some systems
//      pipe_name = "/tmp/shairport-sync-metadata";
//      pipe_timeout = 5000; // wait for this number of milliseconds for a blocked pipe to unblock before giving up
//      socket_address = "226.0.0.1"; // if set to a host name or IP address, UDP packets containing metadata will be sent to this address. May be a multicast address. "socket-port" must be non-zero and "enabled" must be set to yes"
//      socket_port = 5555; // if socket_address is set, the port to send UDP packets to
//      socket_msglength = 65000; // the maximum packet size for any UDP metadata. This will be clipped to be between 500 or 65000. The default is 500.
};

// How to enable the MQTT-metadata/remote-service
// For this section to be operative, Shairport Sync must be built with the following configuration flag:
// --with-mqtt-client
mqtt =
{
//      enabled = "no"; // set this to yes to enable the mqtt-metadata-service
//      hostname = "iot.eclipse.org"; // Hostname of the MQTT Broker
//      port = 1883; // Port on the MQTT Broker to connect to
//      username = NULL; //set this to a string to your username in order to enable username authentication
//      password = NULL; //set this to a string you your password in order to enable username & password authentication
//      capath = NULL; //set this to the folder with the CA-Certificates to be accepted for the server certificate. If not set, TLS is not used
//      cafile = NULL; //this may be used as an (exclusive) alternative to capath with a single file for all ca-certificates
//      certfile = NULL; //set this to a string to a user certificate to enable MQTT Client certificates. keyfile must also be set!
//      keyfile = NULL; //private key for MQTT Client authentication
//      topic = NULL; //MQTT topic where this instance of shairport-sync should publish. If not set, the general.name value is used.
//      publish_raw = "no"; //whether to publish all available metadata under the codes given in the 'metadata' docs.
//      publish_parsed = "no"; //whether to publish a small (but useful) subset of metadata under human-understandable topics
//      Currently published topics:artist,album,title,genre,format,songalbum,volume,client_ip,
//      Additionally, empty messages at the topics play_start,play_end,play_flush,play_resume are published
//      publish_cover = "no"; //whether to publish the cover over mqtt in binary form. This may lead to a bit of load on the broker
//      enable_remote = "no"; //whether to remote control via MQTT. RC is available under `topic`/remote.
//      Available commands are "command", "beginff", "beginrew", "mutetoggle", "nextitem", "previtem", "pause", "playpause", "play", "stop", "playresume", "shuffle_songs", "volumedown", "volumeup"
};

// Diagnostic settings. These are for diagnostic and debugging only. Normally you should leave them commented out
diagnostics =
{
//      disable_resend_requests = "no"; // set this to yes to stop Shairport Sync from requesting the retransmission of missing packets. Default is "no".
//      log_output_to = "syslog"; // set this to "syslog" (default), "stderr" or "stdout" or a file or pipe path to specify were all logs, statistics and diagnostic messages are written to. If there's anything wrong with the file spec, output will be to "stderr".
//      statistics = "no"; // set to "yes" to print statistics in the log
        log_verbosity = 0; // "0" means no debug verbosity, "3" is most verbose.
//      log_show_file_and_line = "yes"; // set this to yes if you want the file and line number of the message source in the log file
//      log_show_time_since_startup = "no"; // set this to yes if you want the time since startup in the debug message -- seconds down to nanoseconds
//      log_show_time_since_last_message = "yes"; // set this to yes if you want the time since the last debug message in the debug message -- seconds down to nanoseconds
//      drop_this_fraction_of_audio_packets = 0.0; // use this to simulate a noisy network where this fraction of UDP packets are lost in transmission. E.g. a value of 0.001 would mean an average of 0.1% of packets are lost, which is actually quite a high figure.
//      retain_cover_art = "no"; // artwork is deleted when its corresponding track has been played. Set this to "yes" to retain all artwork permanently. Warning -- your directory might fill up.
};
mikebrady commented 2 years ago

Okay, thanks. I guess I'd have a few questions about the rate conversion. The main one is whether the Pi is able to keep up.

To ensure is doesn't get bogged down in Shairport Sync, set the interpolation to "basic" (not "auto" or "soxr", and make sure you uncomment it!). Restart Shairport Sync. Then, run top or htop or similar to see how busy the Pi gets when your trying to play... What model Pi is it anyway?

microfx commented 2 years ago

Raspberry Pi 3 …shouldn‘t be a problem… before changing to „basic“ interpolation I copied from htop (playing a Youtube video) … seems to be the same after setting it to basic:


1  [|||||||          7.1%]   Tasks: 39, 38 thr; 1 running
2  [|          0.7%]   Load average: 1.58 1.39 1.32 
3  [||||||||||||     13.5%]   Uptime: 01:38:26
4  [||||||||         8.6%]
Mem[||||||||||||||||||||||80.5M/874M]
Swp[0K/100.0M]

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
24822 shairport  20   0  281M 25332 17684 S 20.4  2.8  0:20.33 /usr/local/bin/shairport-sync
26058 shairport  20   0  281M 25332 17684 S 17.7  2.8  0:15.67 /usr/local/bin/shairport-sync
26207 patch     20   0  8228  2940  2312 R  2.0  0.3  0:01.50 htop
26055 shairport  20   0  281M 25332 17684 S  2.0  2.8  0:01.79 /usr/local/bin/shairport-sync
521 root       20   0  2172   460   388 S  1.3  0.1  1:06.92 /usr/local/bin/nqptp
  342 avahi      20   0  6020  3060  2616 S  0.7  0.3  0:28.49 avahi-daemon: running [MiCROLABS-P3.local]
469 root       20   0 43592  2656  2456 S  0.0  0.3  0:16.58 mec-app /etc/mec-blokas.json
  450 root       20   0 43592  2656  2456 S  0.7  0.3  0:30.67 mec-app /etc/mec-blokas.json
26109 raspotify 20   0 25508  6508  5912 S  0.0  0.7  0:00.24 /usr/bin/librespot --name MiCROLABS-P3 --device-type speaker --backend alsa --bitrate 320 --disable-audio-cache --enable-26182 patch      20   0 12240  3532  2744 S  0.0  0.4  0:00.09 sshd: patch@pts/0
24827 shairport  20   0  281M 25332 17684 S  0.0  2.8  0:00.73 /usr/local/bin/shairport-sync
314 root       20   0 59632  3980  3660 S  0.0  0.4  0:07.77 /usr/bin/pisound-ctl
471 root       20   0 43592  2656  2456 S  0.0  0.3  0:08.65 mec-app /etc/mec-blokas.json
  445 root       20   0 59632  3980  3660 S  0.7  0.4  0:05.31 /usr/bin/pisound-ctl
microfx commented 2 years ago

I think my problem is solved and it‘s only Amazon‘s crappy implementation / safety measures … something with HDCP.

https://www.reddit.com/r/appletv/comments/7m0g02/amazon_prime_video_4kuhd_hdcp_error_doesnt_play/

Maybe I can fix it with using another HDMI port or something.

Mike, thank you so much for your help!

mikebrady commented 2 years ago

Thanks. Yes, the Raspberry Pi 3 should be okay, especially with "basic" interpolation. I hadn't come across that problem with Amazon Prime UHD content, but of course it's always a possibility!