# Copyright 1999-2015 Gentoo Foundation
# Copyright 2016-2018 Jan Chren (rindeal)
# Distributed under the terms of the GNU General Public License v2

EAPI=7
inherit rindeal

## git-hosting.eclass:
GH_RN="github:kcat:openal-soft"
GH_REF="openal-soft-${PV}"

## EXPORT_FUNCTIONS: src_unpack
## variables: GH_HOMEPAGE
inherit git-hosting
## EXPORT_FUNCTIONS: src_prepare src_configure src_compile src_test src_install
inherit cmake
## EXPORT_FUNCTIONS: src_prepare pkg_preinst pkg_postinst pkg_postrm
inherit xdg
## functions: make_desktop_entry
inherit desktop
## functions: dohelp2man
inherit help2man

DESCRIPTION="Software implementation of the OpenAL 3D audio API"
HOMEPAGE="http://kcat.strangesoft.net/openal.html ${GH_HOMEPAGE}"
LICENSE="LGPL-2+"

SLOT="0"

KEYWORDS="~amd64 ~arm ~arm64"
backends=( alsa coreaudio jack oss portaudio pulseaudio )
IUSE_A=(
	${backends[@]}
	debug examples gui tests utils
	cpu_flags_x86_{sse,sse2,sse3,sse4_1} cpu_flags_arm_neon
)

CDEPEND_A=(
	"alsa? ( media-libs/alsa-lib )"
	"jack? ( virtual/jack )"
	"portaudio? ( media-libs/portaudio )"
	"pulseaudio? ( media-sound/pulseaudio )"
	"gui? ("
		"dev-qt/qtcore:5"
		"dev-qt/qtgui:5"
		"dev-qt/qtwidgets:5"
	")"

	"examples? ("
		"media-libs/libsdl2[sound]"
		"media-video/ffmpeg"
	")"
)
DEPEND_A=( "${CDEPEND_A[@]}"
	"oss? ( virtual/os-headers )"
	"utils? ( sys-apps/help2man )"
)
RDEPEND_A=( "${CDEPEND_A[@]}" )

REQUIRED_USE_A=(
	# at least one backend must be selected otherwise it segfaults
# 	"|| ( ${backends[*]} )"
	# IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL) add_subdirectory(utils/alsoft-config)
	"gui? ( utils )"
)

inherit arrays

# upstream uses this pre-created dir
BUILD_DIR="${S}/build"

src_prepare() {
	eapply "${FILESDIR}"/1.17.2-disable_pulseaudio_auto_spawn.patch
	eapply_user

	xdg_src_prepare
	cmake_src_prepare
}

src_configure() {
		local mycmakeargs=(
			# for dynamicly loading backend libs
			-D "ALSOFT_DLOPEN=ON"
			-D "ALSOFT_WERROR=OFF"
			# Build and install utility programs
			-D "ALSOFT_UTILS=$(usex utils)"
			# Disable building the alsoft-config utility
			-D "ALSOFT_NO_CONFIG_UTIL=$(usex '!gui')"

			-D "ALSOFT_EXAMPLES=$(usex examples)"
			-D "ALSOFT_TESTS=$(usex tests)"

			# alsoft.conf sample configuration file
			-D "ALSOFT_CONFIG=ON"
			# HRTF definition files
			-D "ALSOFT_HRTF_DEFS=ON"
			# AmbDec preset files
			-D "ALSOFT_AMBDEC_PRESETS=ON"
			# install headers and libs, executables only otherwise
			-D "ALSOFT_INSTALL=ON"

			-D ALSOFT_{REQUIRE,BACKEND}_ALSA=$(usex alsa)
			-D ALSOFT_{REQUIRE,BACKEND}_OSS=$(usex oss)
			# SOLARIS # skipped
			# SNDIO # skipped
			# QSA # skipped
			# Windows-only # skipped
			-D ALSOFT_{REQUIRE,BACKEND}_PORTAUDIO=$(usex portaudio)
			-D ALSOFT_{REQUIRE,BACKEND}_PULSEAUDIO=$(usex pulseaudio)
			-D ALSOFT_{REQUIRE,BACKEND}_JACK=$(usex jack)
			-D ALSOFT_{REQUIRE,BACKEND}_COREAUDIO=$(usex coreaudio)
			# OpenSL (Android) # skipped
			# SDL2 # skipped
			-D ALSOFT_BACKEND_WAVE=ON # Wave File Writer

			-D ALSOFT_{REQUIRE,CPUEXT}_SSE=$(usex cpu_flags_x86_sse)
			-D ALSOFT_{REQUIRE,CPUEXT}_SSE2=$(usex cpu_flags_x86_sse2)
			# broken upstream, https://github.com/kcat/openal-soft/issues/195
			-D ALSOFT_{REQUIRE,CPUEXT}_SSE3=$(usex cpu_flags_x86_sse3)
			-D ALSOFT_{REQUIRE,CPUEXT}_SSE4_1=$(usex cpu_flags_x86_sse4_1)
			-D ALSOFT_{REQUIRE,CPUEXT}_NEON=$(usex cpu_flags_arm_neon)

			-D "ALSOFT_EMBED_HRTF_DATA=OFF"
		)

		cmake_src_configure
}

src_install() {
	DOCS=( alsoftrc.sample docs/env-vars.txt docs/hrtf.txt ChangeLog README )

	cmake_src_install

	local b h2m_bins=()
	use tests && h2m_bins+=( altonegen )
	use utils && h2m_bins+=( makehrtf openal-info )
	for b in "${h2m_bins[@]}" ; do
		local H2M_NO_DEFAULT_HELP_OPTION=1
		dohelp2man "build/${b}"
	done

	# NOTE: alsoft.conf doesn't support PREFIX, needs patching in ${S}/Alc/alcConfig.c
	insinto /etc/openal
	newins alsoftrc.sample alsoft.conf

	if use gui ; then
		local make_desktop_entry_args=(
			"${EPREFIX}"/usr/bin/alsoft-config	# exec
			"OpenAL Soft Configuration"	# name
			settings-configure	# icon
			"Settings;HardwareSettings;Audio;AudioVideo;"	# categories
		)
		local make_desktop_entry_extras=(  )
		make_desktop_entry "${make_desktop_entry_args[@]}" \
			"$( printf '%s\n' "${make_desktop_entry_extras[@]}" )"
	fi
}