Ctrl K
ComunidadGuías…

Makefile

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Test installations persist on disk; each test invocation owns a cleaned workspace.
export YENEY_TEST_CACHE ?= $(HOME)/.cache/yeney-test
export TMPDIR ?= /var/tmp
# An explicitly empty caller value disables private-media checks.
export YENEY_LENGTH_FIXTURE_DIR ?= $(shell for directory in "$(HOME)/src/private-fixtures" "$(HOME)/private-fixtures" /mnt/c/HueSyncLXC/private-fixtures; do if test -d "$$directory"; then printf "%s" "$$directory"; break; fi; done)
export LAMPASTREAM_CHECKOUT ?= $(abspath ../LampaStream)

OWN_UPNP_SOURCES = upnp/http_server.cpp upnp/gena.cpp upnp/xml.cpp upnp/http.cpp upnp/soap.cpp upnp/discovery.cpp upnp/own_speaker_control.cpp
UPNP_OBJS = $(OWN_UPNP_SOURCES:.cpp=.o) upnp/encoded_buffer.o

QUEUE_ROOM_OBJS = queue_room.o queue_relay.o queue_path.o queue_speaker.o queue_lms_commands.o queue_status.o queue_window_relay.o

OBJS = volume_control.o $(QUEUE_ROOM_OBJS) core_queue_sink.o core_sonos.o core_shm.o audio_mode.o $(UPNP_OBJS) yeney.o sbstreamer.o sbencoder.o sonos-status.o sonos-position.o

all: yeney libqueueitems.a yeney-queue-dryrun

CORE_LIB = third_party/yeney-core/libyeneycore.a
.PHONY: core-library
core-library:
$(CORE_LIB): core-library
	$(MAKE) -C third_party/yeney-core libyeneycore.a

core_sonos.o: pcm_pack.h core_sonos.h audio_mode.h sonos-position.h third_party/yeney-core/core/player.h third_party/yeney-core/core/sink.h
yeney.o: obsolete_player.h playback_mode.h
core_sonos.o: %.o: %.cpp
	g++ -std=c++17 -g -O3 -Wall -Wextra -Ithird_party/yeney-core -c -o $@ $<

yeney: $(OBJS) libqueuecontroller.a libqueueitems.a $(CORE_LIB)
	g++ -g -o $@ $^ \
		-lFLAC++ -lFLAC -lcrypto \
		-lpthread

clean:
	rm -f consumption-diagnostic-test queue-declaration-test
	rm -f queue-window-test podcast-metadata-fixture podcast-sink-test volume-test lms-icon-test lms-icon-connection-test queue-source-test room-status-test xml-sanitize-test stream-metrics-lifetime-test stream-pacing-encoder-test encoded-backpressure-test stream-pacing-test stream-metrics-test queue-position-test libqueuecontroller.a playback-mode-test queue-ownership-test queue-actions-test queue-metadata-test queue-route-test yeney-queue-dryrun core-queue-sink-test libqueueitems.a queue-item-store-test oct12-boundary-test oct11-acquisition-test field-cold-test cold-position-test lms-position-test timing-tap-test timing-contract-test timing-probe-field-test timing-probe-settings-test timing-probe-test timing-probe-resets-test timing-probe-http-test lead-test range-test range-history-test encoded-buffer-test stream-content-test http-server-test speaker-state-test *.o tests/*.o upnp/*.o yeney position-test encoder-test resume-state-test streamer-test upnp-test own-control-test

.PHONY: test test-run install
test:
	python3 scripts/run-tests.py $(MAKE) test-run

install: yeney yeney-queue-dryrun
	install -d -m 0755 /var/lib/yeney
	install -m 0755 yeney-queue-dryrun /usr/local/bin/yeney-queue-dryrun
	install -m 0755 scripts/yeney-queue-suite /usr/local/bin/yeney-queue-suite
	install -m 0644 scripts/yeney_room_state.py /usr/local/bin/yeney_room_state.py
	install -m 0755 scripts/yeney-stream-pacing-suite /usr/local/bin/yeney-stream-pacing-suite
	install -m 0755 scripts/yeney-queue-device-suite /usr/local/bin/yeney-queue-device-suite
	install -d -m 0755 /usr/local/share/yeney
	install -m 0644 assets/sonos.svg /usr/local/share/yeney/sonos.svg
	install -m 0755 scripts/yeney-install-lms-icon /usr/local/bin/yeney-install-lms-icon
	scripts/install-devices.sh $(if $(LMS_PREFS_DIR),--lms-prefs-dir="$(LMS_PREFS_DIR)")
encoder-test: tests/audio_pack_fixture.cpp upnp/encoded_buffer.cpp upnp/encoded_buffer.h tests/encoder_test.cpp sbencoder.cpp sbencoder.h
	g++ -g -O2 -Wall -I. -DSBENCODER_TEST -o $@ tests/encoder_test.cpp tests/audio_pack_fixture.cpp sbencoder.cpp upnp/encoded_buffer.cpp -lFLAC++ -lFLAC -lcrypto -lpthread

# Preserve the legacy wire fixtures explicitly; settings tests also exercise the unset default.
test-run: export YENEY_DEBUG =
test-run: export YENEY_LMS_VOLUME = off
test-run: export YENEY_VOLUME_MAX = 100
test-run: export YENEY_LMS_ICON =
test-run: export YENEY_STREAM_PACING = wall
test-run: export YENEY_PLAYBACK_MODE = stream
test-run: export YENEY_START_LEAD_MS = 0
test-run: export YENEY_TIMING_PROBE = 0
test-run: export YENEY_TIMING_RAW = 0
test-run: export YENEY_TIMING_PRIOR = 1
test-run: export YENEY_TIMING_PUBLISH = 0
test-run: export YENEY_TIMING_LOCKED_EVERY_S = 5
test-run: export YENEY_AUDIBLE_OFFSET_MS = 0
test-run: export YENEY_TIMING_STALE_S = 60
test-run: timing-probe-field-test timing-probe-settings-test timing-probe-test timing-probe-resets-test timing-probe-http-test lead-test range-history-test range-test encoded-buffer-test stream-content-test http-server-test speaker-state-test yeney position-test encoder-test resume-state-test streamer-test upnp-test own-control-test
	./consumption-diagnostic-test
	./queue-declaration-test
	./queue-window-test
	./volume-test
	python3 tests/volume_test.py
	python3 tests/player_name_test.py
	YENEY_REAL_LMS_NAME_ONLY=1 python3 tests/real_lms_test.py
	./stream-metrics-lifetime-test
	./stream-metrics-lifetime-test worker
	YENEY_STREAM_PACING=sonos YENEY_START_LEAD_MS=1000 ./stream-pacing-encoder-test
	./encoded-backpressure-test
	./stream-pacing-test
	python3 tests/stream_pacing_setting_test.py
	./stream-metrics-test
	python3 tests/stream_pacing_suite_test.py
	python3 tests/remote_selection_test.py
	python3 tests/queue_device_suite_test.py
	python3 tests/queue_device_cli_test.py
	python3 tests/queue_protocol_setting_test.py
	YENEY_ACCEPTANCE_BINARY=$(CURDIR)/yeney python3 tests/queue_binary_test.py
	python3 tests/queue_takeover_test.py
	python3 tests/queue_group_test.py
	python3 tests/queue_title_test.py
	python3 tests/length_fixture_policy_test.py
	python3 tests/length_binary_test.py
	python3 tests/podcast_metadata_test.py
	./queue-source-test
	./room-status-test
	./queue-position-test
	./playback-mode-test
	python3 tests/playback_mode_test.py
	./queue-ownership-test
	./queue-actions-test
	./queue-metadata-test
	python3 tests/artwork_test.py
	python3 tests/xml_metadata_test.py
	./queue-route-test
	./queue-item-store-test
	./core-queue-sink-test
	YENEY_TIMING_PROBE=1 YENEY_TIMING_PUBLISH=1 ./timing-tap-test
	./timing-contract-test
	./cold-position-test
	./field-cold-test
	./oct11-acquisition-test
	./oct12-boundary-test
	YENEY_TIMING_PRIOR=0 ./field-cold-test prior-setting
	YENEY_TIMING_PRIOR=1 ./field-cold-test prior-setting
	./lms-position-test
	python3 tests/lms_position_check_test.py
	python3 tests/timing_contract_test.py
	./timing-probe-test
	./timing-probe-field-test
	python3 tests/timing_probe_settings_test.py
	YENEY_TIMING_STALE_S=10 ./timing-probe-resets-test
	python3 tests/timing_probe_http_test.py
	python3 tests/timing_probe_raw_http_test.py
	python3 tests/stream_debug_test.py
	python3 tests/lead_setting_test.py
	YENEY_START_LEAD_MS=2000 ./lead-test
	YENEY_START_LEAD_MS=0 ./lead-test
	YENEY_START_LEAD_MS=2000 ./range-test
	python3 tests/start_lead_test.py
	./range-history-test
	./range-test
	./encoded-buffer-test
	python3 tests/encoded_overwrite_test.py
	python3 tests/http_server_test.py
	./speaker-state-test
	./upnp-test
	./xml-sanitize-test
	./stream-content-test
	python3 tests/title_format_setting_test.py
	python3 tests/stream_content_setting_test.py
	python3 tests/list_rooms_test.py
	python3 tests/lms_icon_test.py
	python3 tests/room_state_lookup_test.py
	python3 tests/installer_state_test.py
	python3 tests/debug_settings_test.py
	python3 tests/script_references_test.py
	python3 tests/consumer_policy_test.py
	python3 tests/test_run_storage.py
	python3 tests/installer_test.py
	python3 tests/upnp_mock_test.py
	python3 tests/own_display_test.py
	./podcast-sink-test
	./position-test
	python3 tests/position_reconnect_test.py
	python3 tests/send_error_test.py
	./streamer-test session
	./streamer-test position
	./streamer-test shutdown
	./encoder-test
	./resume-state-test
	YENEY_PAUSE=pause ./streamer-test
	env -u YENEY_PAUSE ./streamer-test stop
	python3 tests/http_streamer_test.py
	python3 tests/device_resume_test.py
	python3 tests/yeney_timeline_test.py
	python3 tests/lms_discovery_test.py
	python3 tests/device_test_script_test.py
	python3 tests/pause_mode_test.py
	python3 tests/audio_mode_test.py
	python3 tests/obsolete_player_test.py
	python3 tests/core_sonos_test.py
	python3 tests/player_engine_test.py
	python3 tests/queue_dryrun_test.py
	python3 tests/queue_suite_test.py
	$(MAKE) -C third_party/yeney-core decimator-fixture
	python3 tests/podcast_device_test.py
	python3 tests/podcast_binary_test.py
	YENEY_REAL_LMS_PODCAST_ONLY=1 python3 tests/real_lms_test.py
	python3 tests/real_lms_test.py
	YENEY_REAL_LMS_LAZY_ONLY=1 python3 tests/real_lms_test.py
	YENEY_REAL_LMS_NAV_ONLY=1 python3 tests/real_lms_test.py
	YENEY_REAL_LMS_NAV_INVARIANTS=1 YENEY_NAV_CASE=F1 python3 tests/real_lms_test.py
	YENEY_REAL_LMS_NAV_INVARIANTS=1 YENEY_NAV_CASE=F2 python3 tests/real_lms_test.py
	YENEY_REAL_LMS_NAV_INVARIANTS=1 YENEY_NAV_CASE=F3 python3 tests/real_lms_test.py
	YENEY_REAL_LMS_VOLUME_ONLY=1 python3 tests/real_lms_test.py
	python3 third_party/yeney-core/tests/decimator_quality.py --sox "$${YENEY_REAL_LMS_HOME:-$${YENEY_TEST_CACHE}/real-lms-9.1.1}/Bin/x86_64-linux/sox"
	$(MAKE) -C third_party/yeney-core test

sbstreamer.o sbencoder.o: sbencoder.h

yeney.o: legacy_environment.h resume_state.h stop_debounce.h
resume-state-test: tests/resume_state_test.cpp resume_state.h stop_debounce.h
	g++ -g -O2 -Wall -I. -o $@ tests/resume_state_test.cpp

streamer-test: upnp/http_server.cpp upnp/gena.cpp upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp upnp/encoded_buffer.cpp upnp/encoded_buffer.h pause_mode.h tests/streamer_test.cpp sbstreamer.cpp sbstreamer.h sbencoder.cpp sbencoder.h resume_state.h
	g++ -g -O2 -Wall -I. -o $@ tests/streamer_test.cpp sbstreamer.cpp sbencoder.cpp sonos-position.cpp upnp/http_server.cpp upnp/gena.cpp upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp upnp/encoded_buffer.cpp -lFLAC++ -lFLAC -lcrypto -lpthread

yeney.o streamer-test: pause_mode.h

position-test: tests/position_test.cpp position_state.h
	g++ -g -O2 -Wall -I. -o $@ tests/position_test.cpp
sonos-position.o: position_state.h sonos-position.h
yeney.o sbstreamer.o streamer-test: sonos-position.h
streamer-test: sonos-position.cpp position_state.h

yeney.o: transport_intent.h retry_budget.h

yeney.o sbstreamer.o streamer-test: stream_session.h

$(OBJS) streamer-test: upnp/speaker_control.h upnp/stream_server.h

$(UPNP_OBJS) yeney.o: $(wildcard upnp/*.h)

upnp-test: $(wildcard upnp/*.h) tests/upnp_test.cpp upnp/xml.cpp upnp/soap.cpp upnp/http.cpp upnp/discovery.cpp
	g++ -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^)

own-control-test: $(wildcard upnp/*.h) tests/own_control_fixture.cpp $(OWN_UPNP_SOURCES)
	g++ -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^) -lpthread

upnp/encoded_buffer.o sbencoder.o: upnp/encoded_buffer.h

yeney.o: upnp/list_rooms.h

sbstreamer.o streamer-test: stream_close_log.h upnp/stale_stream.h

yeney.o sonos-status.o: sonos-status.h
sonos-status.o: speaker_uri.h stream_session.h

audio_mode.o yeney.o sbstreamer.o streamer-test: audio_mode.h

speaker-state-test: queue_speaker_changes.h tests/speaker_state_test.cpp $(wildcard upnp/*.h) upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp
	g++ -g -O2 -Wall -Wextra -I. -o $@ tests/speaker_state_test.cpp upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp

yeney.o sbstreamer.o streamer-test resume-state-test: upnp/timing.h

http-server-test: $(wildcard upnp/*.h) tests/http_server_fixture.cpp upnp/http_server.cpp upnp/http_server.h upnp/stream_server.h upnp/timing.h
	g++ -g -O2 -Wall -Wextra -I. -o $@ tests/http_server_fixture.cpp upnp/http_server.cpp upnp/gena.cpp upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp -lpthread

http-server-test: upnp/gena.cpp upnp/xml.cpp upnp/discovery.cpp upnp/http.cpp upnp/icon.h

stream-content-test: tests/stream_content_test.cpp upnp/soap.cpp upnp/xml.cpp $(wildcard upnp/*.h)
	g++ -g -O2 -Wall -Wextra -I. -o $@ tests/stream_content_test.cpp upnp/soap.cpp upnp/xml.cpp

encoded-buffer-test: tests/encoded_buffer_test.cpp upnp/encoded_buffer.cpp upnp/encoded_buffer.h
	g++ -g -O2 -Wall -Wextra -I. -o $@ tests/encoded_buffer_test.cpp upnp/encoded_buffer.cpp -lpthread

upnp/http_server.o streamer-test own-control-test: upnp/icon.h

yeney.o sbstreamer.o streamer-test: source_ownership.h speaker_uri.h

sbencoder.o sbstreamer.o encoder-test streamer-test: encoded_history.h sbencoder.h start_lead.h stream_debug.h

range-history-test: tests/range_history_test.cpp encoded_history.h sbencoder.h start_lead.h stream_debug.h
	g++ -std=c++17 -O2 -Wall -I. -o $@ $<
range-test: tests/range_fixture.cpp sbstreamer.cpp sbencoder.cpp sonos-position.cpp upnp/encoded_buffer.cpp $(wildcard upnp/*.h) encoded_history.h sbencoder.h start_lead.h stream_debug.h
	g++ -std=c++17 -O2 -Wall -I. -o $@ $(filter %.cpp,$^) -lFLAC++ -lFLAC -lcrypto -lpthread

lead-test: tests/lead_fixture.cpp sbencoder.cpp sbencoder.h start_lead.h upnp/encoded_buffer.cpp
	g++ -g -O2 -Wall -I. -o $@ tests/lead_fixture.cpp sbencoder.cpp upnp/encoded_buffer.cpp -lFLAC++ -lFLAC -lcrypto -lpthread

sbencoder.o core_sonos.o: start_lead.h
sbstreamer.o: stream_debug.h sbencoder.h
upnp/http_server.o: upnp/http_server.h upnp/stream_server.h

sonos-position.o: position_state.h start_lead.h

core_sonos.o encoder-test: pcm_pack.h

# Measurement-only timing probe fixtures.
timing-probe-test: tests/timing_probe_test.cpp timing_probe.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $<
timing-probe-resets-test: tests/timing_probe_resets_test.cpp sonos-position.cpp timing_probe.h timing_probe_runtime.h position_state.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^) -lpthread
timing-probe-http-test: tests/timing_probe_http_fixture.cpp $(OWN_UPNP_SOURCES) timing_probe.h timing_probe_runtime.h $(wildcard upnp/*.h)
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^) -lpthread
core_sonos.o sonos-position.o sbstreamer.o upnp/own_speaker_control.o upnp/http.o: timing_probe.h timing_probe_runtime.h

timing-probe-field-test: tests/timing_probe_field_test.cpp timing_probe.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $<
timing-probe-settings-test: tests/timing_probe_settings_fixture.cpp timing_probe.h timing_probe_runtime.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $< -lpthread

core_sonos.o: timing_tap.h timing_settings.h timing_channel.h timing_brackets.h
core_sonos.o sonos-position.o sbstreamer.o upnp/own_speaker_control.o upnp/http.o: timing_settings.h timing_channel.h timing_brackets.h

timing-contract-test: tests/timing_contract_test.cpp timing_probe_runtime.h timing_probe.h timing_brackets.h timing_channel.h timing_settings.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: timing-contract-test

timing-tap-test: tests/timing_tap_test.cpp timing_tap.h timing_probe_runtime.h timing_brackets.h timing_channel.h timing_settings.h core_shm.o $(CORE_LIB)
	g++ -std=c++17 -O2 -Wall -Wextra -I. -Ithird_party/yeney-core -pthread -o $@ $< core_shm.o $(CORE_LIB) -lFLAC
test-run: timing-tap-test

core_shm.o: third_party/yeney-core/sinks/shm_v1/sink.cpp third_party/yeney-core/core/sink.h third_party/yeney-core/sinks/shm_v1/sink.h third_party/yeney-core/sinks/shm_v1/layout.h
	g++ -std=c++17 -O2 -Wall -Wextra -Ithird_party/yeney-core -c -o $@ $<

timing-probe-settings-test timing-probe-resets-test timing-probe-http-test streamer-test range-test own-control-test: timing_brackets.h timing_channel.h timing_settings.h

lms-position-test: tests/lms_position_test.cpp position_state.h timing_probe_runtime.h timing_settings.h timing_brackets.h timing_channel.h timing_probe.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: lms-position-test
sonos-position.o position-test: position_state.h

core_sonos.o sonos-position.o sbstreamer.o upnp/own_speaker_control.o timing-contract-test lms-position-test: timing_drift_state.h

cold-position-test: tests/cold_position_test.cpp timing_brackets.h timing_probe.h timing_drift_state.h timing_probe_runtime.h timing_settings.h timing_channel.h position_state.h
	g++ -std=c++17 -g -O2 -Wall -I. -o $@ $<
test-run: cold-position-test

field-cold-test: tests/field_cold_test.cpp timing_probe_runtime.h timing_probe.h timing_brackets.h timing_settings.h position_state.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $<
test-run: field-cold-test

oct11-acquisition-test: tests/oct11_acquisition_test.cpp timing_probe_runtime.h timing_probe.h timing_brackets.h timing_drift_state.h timing_settings.h timing_channel.h position_state.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: oct11-acquisition-test

oct12-boundary-test: tests/oct12_boundary_test.cpp core_sonos.cpp core_sonos.h position_state.h timing_probe_runtime.h core_shm.o $(CORE_LIB)
	g++ -std=c++17 -O2 -Wall -Wextra -I. -Ithird_party/yeney-core -pthread -o $@ tests/oct12_boundary_test.cpp core_sonos.cpp core_shm.o $(CORE_LIB) -lFLAC
test-run: oct12-boundary-test

# Independent phase 1 library; no playback registration or transport changes.
queue_route.o queue_item_store.o wav_writer.o: %.o: %.cpp queue_item_store.h wav_writer.h pcm_pack.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -c -o $@ $<
queue_route.o: queue_route.h
libqueueitems.a: queue_item_store.o wav_writer.o queue_route.o
	ar rcs $@ $^
queue-item-store-test: tests/queue_item_store_test.cpp libqueueitems.a pcm_pack.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $< libqueueitems.a -lFLAC -pthread
test-run: queue-item-store-test

core_queue_sink.o: core_queue_sink.cpp core_queue_sink.h queue_item_store.h third_party/yeney-core/core/sink.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -c -o $@ $<
core_queue_sink.o: queue_declaration.h
queue-declaration-test: tests/queue_declaration_test.cpp core_queue_sink.o libqueueitems.a $(CORE_LIB) upnp/queue_metadata.cpp upnp/xml.o queue_declaration.h tests/test_temp.h upnp/queue_metadata.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -Itests -o $@ $(filter %.cpp %.o %.a,$^) -lFLAC -pthread
test-run: queue-declaration-test
core-queue-sink-test: tests/core_queue_sink_test.cpp core_queue_sink.o libqueueitems.a
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp %.o %.a,$^) -lFLAC -pthread
test-run: core-queue-sink-test

yeney-queue-dryrun: queue_dryrun.cpp core_queue_sink.o libqueueitems.a $(CORE_LIB)
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp %.o %.a,$^) -lFLAC -pthread

core-queue-sink-test yeney-queue-dryrun: queue_report.h
yeney-queue-dryrun: queue_lms_cli.h queue_flac_metadata.h

yeney-queue-dryrun: queue_lms_cli.h

test-run: yeney-queue-dryrun

queue-route-test: tests/queue_route_test.cpp libqueueitems.a upnp/http_server.o upnp/gena.o upnp/xml.o upnp/discovery.o upnp/http.o
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp %.o %.a,$^) -lFLAC -pthread
test-run: queue-route-test

queue-metadata-test: tests/queue_metadata_test.cpp upnp/queue_metadata.cpp upnp/xml.cpp upnp/queue_metadata.h upnp/soap.h upnp/title_format.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^)
test-run: queue-metadata-test

queue-actions-test: tests/queue_actions_test.cpp upnp/queue_actions.cpp upnp/queue_actions.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^)
test-run: queue-actions-test

queue-ownership-test: tests/queue_ownership_test.cpp upnp/queue_ownership.cpp upnp/queue_ownership.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $(filter %.cpp,$^)
test-run: queue-ownership-test

playback-mode-test: tests/playback_mode_test.cpp playback_mode.h upnp/speaker_control.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $<
test-run: playback-mode-test

QUEUE_CONTROLLER_OBJS = upnp/queue_coordinator.o upnp/queue_actions.o upnp/queue_ownership.o upnp/queue_metadata.o
upnp/queue_coordinator.o: upnp/queue_coordinator.cpp upnp/queue_coordinator.h playback_mode.h transport_source.h upnp/queue_actions.h upnp/queue_ownership.h upnp/http.h upnp/soap.h upnp/xml.h upnp/discovery.h
upnp/queue_actions.o: upnp/queue_actions.cpp upnp/queue_actions.h upnp/soap.h upnp/xml.h
upnp/queue_ownership.o: upnp/queue_ownership.cpp upnp/queue_ownership.h
upnp/queue_metadata.o: upnp/queue_metadata.cpp upnp/queue_metadata.h upnp/soap.h upnp/title_format.h upnp/xml.h
$(QUEUE_CONTROLLER_OBJS):
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -c -o $@ $<
libqueuecontroller.a: $(QUEUE_CONTROLLER_OBJS)
	ar rcs $@ $^
all: libqueuecontroller.a

QUEUE_TEST_UPNP = upnp/http_server.o upnp/gena.o upnp/xml.o upnp/http.o upnp/soap.o upnp/discovery.o



queue-position-test: tests/queue_position_test.cpp position_state.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $<
test-run: queue-position-test

upnp/encoded_buffer.o upnp/http_server.o sbstreamer.o sonos-status.o yeney.o: stream_metrics.h

stream-metrics-test: tests/stream_metrics_test.cpp stream_metrics.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: stream-metrics-test

sbencoder.o sbstreamer.o yeney.o sonos-position.o upnp/own_speaker_control.o core_sonos.o: stream_pacing.h

stream-pacing-test: tests/stream_pacing_test.cpp stream_pacing.h timing_probe_runtime.h upnp/encoded_buffer.cpp stream_metrics.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $< upnp/encoded_buffer.cpp
test-run: stream-pacing-test

encoded-backpressure-test: tests/encoded_backpressure_test.cpp upnp/encoded_buffer.cpp upnp/encoded_buffer.h stream_metrics.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ tests/encoded_backpressure_test.cpp upnp/encoded_buffer.cpp
test-run: encoded-backpressure-test

stream-pacing-encoder-test: tests/stream_pacing_encoder_test.cpp sbencoder.cpp sbencoder.h stream_pacing.h stream_metrics.h upnp/encoded_buffer.cpp
	g++ -std=c++17 -O2 -Wall -Wextra -DSBENCODER_TEST -I. -pthread -o $@ tests/stream_pacing_encoder_test.cpp sbencoder.cpp upnp/encoded_buffer.cpp -lFLAC++ -lFLAC
test-run: stream-pacing-encoder-test

stream-metrics-lifetime-test: tests/stream_metrics_lifetime_test.cpp stream_metrics.h
	g++ -std=c++17 -g -O1 -Wall -Wextra -fsanitize=address -fno-omit-frame-pointer -I. -pthread -o $@ $<
test-run: stream-metrics-lifetime-test

$(QUEUE_ROOM_OBJS): %.o: %.cpp queue_room_internal.h queue_room.h room_status.h queue_playlist.h queue_lms_cli.h queue_lazy_item.h queue_route.h upnp/queue_metadata.h upnp/queue_actions.h core_queue_sink.h
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -c -o $@ $<



$(OBJS): room_status.h
core_shm.o: third_party/yeney-core/core/sink.h
stream-metrics-test stream-pacing-test encoded-backpressure-test stream-pacing-encoder-test stream-metrics-lifetime-test: room_status.h



yeney.o queue_room.o : lms_artwork.h

queue_room.o: queue_protocol.h

xml-sanitize-test: tests/xml_sanitize_test.cpp upnp/xml.cpp upnp/xml.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ tests/xml_sanitize_test.cpp upnp/xml.cpp
test-run: xml-sanitize-test

room-status-test: tests/room_status_test.cpp room_status.h
	$(CXX) -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: room-status-test

queue-source-test: tests/queue_source_test.cpp queue_source.h lms_artwork.h queue_playlist.h
	$(CXX) -std=c++17 -Wall -Wextra -I. -o $@ tests/queue_source_test.cpp
test-run: queue-source-test

queue_room.o: queue_path_sink.h queue_source.h core_sonos.h

core_sonos.o queue_room.o: lms_icon.h queue_lms_cli.h

lms-icon-test: tests/lms_icon_fixture.cpp lms_icon.h queue_lms_cli.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<

lms-icon-connection-test: tests/lms_icon_connection.cpp $(CORE_LIB)
	g++ -std=c++17 -O2 -Wall -Wextra -Ithird_party/yeney-core -pthread -o $@ $< $(CORE_LIB) -lFLAC

test-run: lms-icon-test lms-icon-connection-test

# Both playback paths and timing persistence share the room state policy.
yeney.o queue_room.o sonos-position.o core_sonos.o sonos-status.o sbencoder.o: room_state_directory.h stream_metrics.h timing_probe_runtime.h timing_drift_state.h

yeney.o upnp/own_speaker_control.o sbstreamer.o: debug_settings.h

$(QUEUE_ROOM_OBJS): queue_room_internal.h queue_room.h core_queue_sink.h queue_path_sink.h queue_playlist.h queue_source.h queue_speaker_changes.h transport_source.h stream_metrics.h

yeney.o sonos-status.o: stream_display.h
yeney.o $(QUEUE_ROOM_OBJS): queue_lms_commands.h

queue_room.o: third_party/yeney-core/core/player.h

# Disk scratch policy is shared by these native fixtures.
queue-route-test core-queue-sink-test queue-item-store-test cold-position-test field-cold-test oct11-acquisition-test oct12-boundary-test encoded-backpressure-test stream-metrics-test upnp-test: tests/test_temp.h

# QueueOwnership is stored by value in the room implementation.
$(QUEUE_ROOM_OBJS): upnp/queue_ownership.h

yeney.o: volume_worker.h volume_control.h
volume_control.o: volume_control.h

volume-test: tests/volume_test.cpp volume_control.cpp volume_control.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ tests/volume_test.cpp volume_control.cpp
test-run: volume-test

upnp/own_speaker_control.o: upnp/own_speaker_control.h upnp/subscriptions.h upnp/speaker_state.h

$(OBJS) stream-metrics-test stream-pacing-test encoded-backpressure-test stream-pacing-encoder-test stream-metrics-lifetime-test: player_name.h

podcast-sink-test: tests/podcast_sink_test.cpp core_queue_sink.o libqueueitems.a
	g++ -std=c++17 -g -O2 -Wall -Wextra -I. -o $@ $^ -lFLAC -pthread

test-run: podcast-sink-test

# Sink capabilities and encoded-buffer reservations cross the static core/bridge ABI.
$(OBJS) queue_item_store.o wav_writer.o queue_route.o: third_party/yeney-core/core/sink.h

queue_path.o queue-source-test: podcast_title.h
queue-source-test: queue_lms_cli.h

yeney.o $(QUEUE_ROOM_OBJS) room-status-test: podcast_settings.h

podcast-metadata-fixture: tests/podcast_metadata_fixture.cpp podcast_title.h podcast_settings.h libqueuecontroller.a upnp/xml.o
	$(CXX) -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $< libqueuecontroller.a upnp/xml.o

test-run: podcast-metadata-fixture

queue-window-test: tests/queue_window_test.cpp queue_window.h queue_window_edits.h queue_playlist.h
	g++ -std=c++17 -O2 -Wall -Wextra -I. -o $@ $<
test-run: queue-window-test

$(QUEUE_ROOM_OBJS): queue_route.h
$(QUEUE_ROOM_OBJS): queue_window.h queue_window_edits.h

queue-route-test: queue_lazy_item.h

$(OBJS) room-status-test streamer-test range-test oct12-boundary-test: queue_uri_log.h
stream-metrics-test stream-pacing-test encoded-backpressure-test stream-pacing-encoder-test stream-metrics-lifetime-test: queue_uri_log.h

upnp/own_speaker_control.o speaker-state-test own-control-test timing-probe-http-test: queue_uri_log.h

# Queue event filtering and stream polling share this control interface.
$(OBJS): upnp/own_speaker_control.h

consumption-diagnostic-test: tests/consumption_diagnostic_test.cpp consumption_diagnostic.h upnp/stream_server.h upnp/tcp_backlog.h
	$(CXX) -std=c++17 -O2 -Wall -Wextra -I. -pthread -o $@ $<
test-run: consumption-diagnostic-test
$(OBJS) wav_writer.o streamer-test range-test: consumption_diagnostic.h
core_sonos.o queue_room.o: queue_path_sink.h

upnp/http_server.o: upnp/tcp_backlog.h

.PHONY: navigation-soak navigation-targeted
navigation-soak: yeney
	python3 tests/navigation_suite.py --soak
navigation-targeted: yeney
	python3 tests/navigation_suite.py

test-run: navigation-targeted navigation-soak