#
# Build
#

if {[have_include "power_on/qemu"]} {
	puts "\nTest running on Qemu is not supported.\n"
	exit 0
}

# generic components
set build_components {
	core init timer
	drivers/audio
	drivers/platform
	server/mixer
	server/dynamic_rom
	server/report_rom
	app/pci_decode
	test/audio_out
}

build $build_components
create_boot_directory


#
# Config
#

set config  {
	<config>
		<parent-provides>
			<service name="ROM"/>
			<service name="IRQ"/>
			<service name="IO_MEM"/>
			<service name="IO_PORT"/>
			<service name="PD"/>
			<service name="RM"/>
			<service name="CPU"/>
			<service name="LOG"/>
		</parent-provides>
		<default-route>
			<service name="Audio_out"> <child name="mixer"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</default-route>

		<default caps="100"/>

		<start name="timer">
			<resource name="RAM" quantum="1M"/>
			<provides><service name="Timer"/></provides>
		</start>

		<start name="report_rom">
			<resource name="RAM" quantum="2M"/>
			<provides> <service name="Report"/> <service name="ROM"/> </provides>
			<config>
				<policy label="pci_decode -> system"    report="acpi_drv -> acpi"/>
				<policy label="platform_drv -> devices" report="pci_decode -> devices"/>
				<policy label_prefix="to_whom_it_may_concern" report="mixer -> channel_list"/>
			</config>
		</start>

		<start name="acpi_drv" caps="350">
			<resource name="RAM" quantum="4M"/>
			<route>
				<service name="Report"> <child name="report_rom"/> </service>
				<service name="IO_MEM"> <parent/> </service>
				<service name="LOG">    <parent/> </service>
				<service name="PD">     <parent/> </service>
				<service name="RM">     <parent/> </service>
				<service name="CPU">    <parent/> </service>
				<service name="ROM">    <parent/> </service>
			</route>
		</start>

		<start name="pci_decode" caps="350">
			<resource name="RAM" quantum="2M"/>
			<route>
				<service name="Report">             <child name="report_rom"/> </service>
				<service name="ROM" label="system"> <child name="report_rom"/> </service>
				<service name="IO_MEM"> <parent/> </service>
				<service name="LOG">    <parent/> </service>
				<service name="PD">     <parent/> </service>
				<service name="RM">     <parent/> </service>
				<service name="CPU">    <parent/> </service>
				<service name="ROM">    <parent/> </service>
			</route>
		</start>

		<start name="platform_drv" caps="100" managing_system="yes">
			<resource name="RAM" quantum="1M"/>
			<provides>
				<service name="Platform"/>
			</provides>
			<route>
				<service name="ROM" label="devices"> <child name="report_rom"/> </service>
				<service name="Timer">   <child name="timer"/> </service>
				<service name="IRQ">     <parent/> </service>
				<service name="IO_MEM">  <parent/> </service>
				<service name="ROM">     <parent/> </service>
				<service name="PD">      <parent/> </service>
				<service name="CPU">     <parent/> </service>
				<service name="LOG">     <parent/> </service>
				<service name="Timer">   <parent/> </service>
			</route>
			<config>
				<policy label="audio_drv -> "> <pci class="AUDIO"/> <pci class="HDAUDIO"/> </policy>
			</config>
		</start>

		<start name="audio_drv" caps="150">
			<binary name="pci_audio_drv"/>
			<resource name="RAM" quantum="10M"/>
			<provides>
				<service name="Audio_in"/>
				<service name="Audio_out"/>
			</provides>
			<config>
				<mixer field="outputs.master" value="148,148"/>
			</config>
		</start>


		<start name="dynamic_rom">
			<resource name="RAM" quantum="4M"/>
			<provides><service name="ROM"/></provides>
			<config verbose="yes">
				<rom name="mixer.config">
					<inline description="client1 plays (volume 70%)">
<mixer.config>
	<default out_volume="75" volume="42" muted="false"/>
	<channel_list>
		<channel type="input" label="client1" name="right" number="1" active="1" volume="70" muted="false"/>
		<channel type="input" label="client1" name="left" number="0" active="1" volume="70" muted="false"/>
		<channel type="input" label="client2" name="right" number="1" active="1" volume="0" muted="false"/>
		<channel type="input" label="client2" name="left" number="0" active="1" volume="0" muted="false"/>
		<channel type="output" label="master" name="left" number="0" active="1" volume="100" muted="false"/>
		<channel type="output" label="master" name="right" number="1" active="1" volume="100" muted="false"/>
	</channel_list>
</mixer.config>
					</inline>
					<sleep milliseconds="10000" />
					<inline description="client2 plays (volume 70%)">
<mixer.config>
	<default out_volume="75" volume="42" muted="false"/>
	<channel_list>
		<channel type="input" label="client1" name="right" number="1" active="1" volume="0" muted="false"/>
		<channel type="input" label="client1" name="left" number="0" active="1" volume="0" muted="false"/>
		<channel type="input" label="client2" name="right" number="1" active="1" volume="70" muted="false"/>
		<channel type="input" label="client2" name="left" number="0" active="1" volume="70" muted="false"/>
		<channel type="output" label="master" name="left" number="0" active="1" volume="100" muted="false"/>
		<channel type="output" label="master" name="right" number="1" active="1" volume="100" muted="false"/>
	</channel_list>
</mixer.config>
					</inline>
					<sleep milliseconds="10000" />
					<inline description="both play (volume 50%)">
<mixer.config>
	<default out_volume="75" volume="42" muted="false"/>
	<channel_list>
		<channel type="input" label="client1" name="right" number="1" active="1" volume="50" muted="false"/>
		<channel type="input" label="client1" name="left" number="0" active="1" volume="50" muted="false"/>
		<channel type="input" label="client2" name="right" number="1" active="1" volume="50" muted="false"/>
		<channel type="input" label="client2" name="left" number="0" active="1" volume="50" muted="false"/>
		<channel type="output" label="master" name="left" number="0" active="1" volume="100" muted="false"/>
		<channel type="output" label="master" name="right" number="1" active="1" volume="100" muted="false"/>
	</channel_list>
</mixer.config>
					</inline>
					<sleep milliseconds="10000" />
				</rom>
			</config>
		</start>

		<start name="mixer">
			<resource name="RAM" quantum="2M"/>
			<provides><service name="Audio_out"/></provides>
			<route>
				<service name="Audio_out"> <child name="audio_drv"/> </service>
				<service name="Report"> <child name="report_rom"/> </service>
				<service name="ROM" label="config">
					<child name="dynamic_rom" label="mixer.config"/> </service>
				<any-service> <parent/> <any-child/> </any-service>
			</route>
		</start>

		<start name="client1">
			<binary name="test-audio_out"/>
			<resource name="RAM" quantum="4M"/>
			<config>
				<filename>client1.f32</filename>
			</config>
			<route>
				<service name="Audio_out"> <child name="mixer"/> </service>
				<any-service> <parent/> <any-child/> </any-service>
			</route>
		</start>

		<start name="client2">
			<binary name="test-audio_out"/>
			<resource name="RAM" quantum="4M"/>
			<config>
				<filename>client2.f32</filename>
			</config>
			<route>
				<service name="Audio_out"> <child name="mixer"/> </service>
				<any-service> <parent/> <any-child/> </any-service>
			</route>
		</start>
	</config>}

install_config $config

if {[expr ![file exists bin/client1.f32] || ![file exists bin/client2.f32]]} {
	puts ""
	puts "The sample files are missing. Please take a look at repos/dde_bsd/README"
	puts "and create 'client1.f32' and 'client2.f32'. Afterwards put them into './bin'."
	puts ""
	exit 1
}


#
# Boot modules
#

# generic modules
append boot_modules {
	core ld.lib.so init timer
	report_rom dynamic_rom
	platform_drv acpi_drv pci_decode
	pci_audio_drv test-audio_out
	mixer client1.f32 client2.f32
}

build_boot_image $boot_modules
append qemu_args " -nographic"
run_genode_until forever