mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	Compare commits
	
		
			1014 commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
							 | 
						62022ce623 | ||
| 
							 | 
						c63c100c4b | ||
| 
							 | 
						d89c85d374 | ||
| 
							 | 
						a60eb4fe64 | ||
| 
							 | 
						95fb03c8e3 | ||
| 
							 | 
						77a5100280 | ||
| 
							 | 
						e9a89822f8 | ||
| 
							 | 
						ece9545695 | ||
| 
							 | 
						ff0bc22cb1 | ||
| 
							 | 
						8ba08f3029 | ||
| 
							 | 
						056f257058 | ||
| 
							 | 
						7706ca6361 | ||
| 
							 | 
						9f3c553298 | ||
| 
							 | 
						a813830024 | ||
| 
							 | 
						a837dcd40b | ||
| 
							 | 
						752de866ae | ||
| 
							 | 
						ec11859a48 | ||
| 
							 | 
						1096d63468 | ||
| 
							 | 
						955c9ae837 | ||
| 
							 | 
						3e0f4daf60 | ||
| 
							 | 
						5d21e12658 | ||
| 
							 | 
						f1ffd5e5e8 | ||
| 
							 | 
						80e7302a05 | ||
| 
							 | 
						b57bd00be0 | ||
| 
							 | 
						c1e737bbe4 | ||
| 
							 | 
						76a31a47c2 | ||
| 
							 | 
						23c449af5d | ||
| 
							 | 
						94d0d8bc09 | ||
| 
							 | 
						0276bb5b06 | ||
| 
							 | 
						614186a590 | ||
| 
							 | 
						c6d0b364ab | ||
| 
							 | 
						8a23b13798 | ||
| 
							 | 
						3d08c0557f | ||
| 
							 | 
						68dc45cc62 | ||
| 
							 | 
						b0e308e0dc | ||
| 
							 | 
						fe2c62b9b1 | ||
| 
							 | 
						3febf09b85 | ||
| 
							 | 
						93495d3a75 | ||
| 
							 | 
						9f1a149876 | ||
| 
							 | 
						88c65932d8 | ||
| 
							 | 
						c8d4de5e77 | ||
| 
							 | 
						c4244a6cf3 | ||
| 
							 | 
						f7c3d37969 | ||
| 
							 | 
						d18670d7bb | ||
| 
							 | 
						aa0272f6f3 | ||
| 
							 | 
						78219471ff | ||
| 
							 | 
						6d74eee874 | ||
| 
							 | 
						be29ae4ef6 | ||
| 
							 | 
						5e1e3fca1e | ||
| 
							 | 
						b8eeb2db45 | ||
| 
							 | 
						c5533b3c32 | ||
| 
							 | 
						11f1298f53 | ||
| 
							 | 
						7177f8269d | ||
| 
							 | 
						6465a63bf6 | ||
| 
							 | 
						ae50bb5dc0 | ||
| 
							 | 
						99bbac9cbf | ||
| 
							 | 
						f19b075306 | ||
| 
							 | 
						dbc5c81e4a | ||
| 
							 | 
						818d1435ce | ||
| 
							 | 
						8bbca3b8f3 | ||
| 
							 | 
						9e7cae13df | ||
| 
							 | 
						13b8c23767 | ||
| 
							 | 
						eb096bfb62 | ||
| 
							 | 
						ede13a8cb5 | ||
| 
							 | 
						f453b1545d | ||
| 
							 | 
						c94aff8cae | ||
| 
							 | 
						fb49759d1f | ||
| 
							 | 
						f70b0892ea | ||
| 
							 | 
						3263e2497e | ||
| 
							 | 
						453ca31214 | ||
| 
							 | 
						0b78a2d97c | ||
| 
							 | 
						da2cecf074 | ||
| 
							 | 
						a75cea96fb | ||
| 
							 | 
						b220f85790 | ||
| 
							 | 
						c40e0d1d98 | ||
| 
							 | 
						f91aed5eeb | ||
| 
							 | 
						9b507d3210 | ||
| 
							 | 
						9f2d873760 | ||
| 
							 | 
						20d2a331be | ||
| 
							 | 
						c89acd3e1c | ||
| 
							 | 
						91702975f7 | ||
| 
							 | 
						4e3a5d9e6f | ||
| 
							 | 
						4ca1d70979 | ||
| 
							 | 
						8bf8600e59 | ||
| 
							 | 
						126d61db1b | ||
| 
							 | 
						c65e70fce0 | ||
| 
							 | 
						4da25df986 | ||
| 
							 | 
						16ce5a2ccf | ||
| 
							 | 
						2aa725e4fe | ||
| 
							 | 
						154ab33607 | ||
| 
							 | 
						91e2f184e2 | ||
| 
							 | 
						d268b6e104 | ||
| 
							 | 
						bd6081018f | ||
| 
							 | 
						b7b9e7dc6e | ||
| 
							 | 
						a4ec02f9d7 | ||
| 
							 | 
						dcdb88d7b7 | ||
| 
							 | 
						4fb0a0aeea | ||
| 
							 | 
						7d781e696f | ||
| 
							 | 
						e4480cf804 | ||
| 
							 | 
						e72962fb42 | ||
| 
							 | 
						e9aef9196f | ||
| 
							 | 
						5ccaf29793 | ||
| 
							 | 
						e7bc261830 | ||
| 
							 | 
						984b2d296e | ||
| 
							 | 
						b66d49702f | ||
| 
							 | 
						af3ad7bf9f | ||
| 
							 | 
						1a54b9e66f | ||
| 
							 | 
						aede3d049c | ||
| 
							 | 
						df2f36ad8f | ||
| 
							 | 
						fe78e80614 | ||
| 
							 | 
						0b0226322f | ||
| 
							 | 
						4161fa3071 | ||
| 
							 | 
						1fdde582c0 | ||
| 
							 | 
						83ee3021e9 | ||
| 
							 | 
						52041e888c | ||
| 
							 | 
						0de80603e1 | ||
| 
							 | 
						6755f24a3d | ||
| 
							 | 
						8277bf6b36 | ||
| 
							 | 
						4625f7ee3a | ||
| 
							 | 
						91ae1c13b7 | ||
| 
							 | 
						0915ed8be0 | ||
| 
							 | 
						c91f75ae2e | ||
| 
							 | 
						532140ca90 | ||
| 
							 | 
						74e6e6c29d | ||
| 
							 | 
						2248807835 | ||
| 
							 | 
						3f9ae1ee10 | ||
| 
							 | 
						3cf182255f | ||
| 
							 | 
						468a9ac954 | ||
| 
							 | 
						fdc74df383 | ||
| 
							 | 
						678e571d80 | ||
| 
							 | 
						9be06c46b7 | ||
| 
							 | 
						17cad8e7ef | ||
| 
							 | 
						5a894270e6 | ||
| 
							 | 
						ecac86b0ca | ||
| 
							 | 
						06214b6087 | ||
| 
							 | 
						9c42c06af0 | ||
| 
							 | 
						19198d2982 | ||
| 
							 | 
						f8389cbdb7 | ||
| 
							 | 
						65e49b38d1 | ||
| 
							 | 
						63df661eff | ||
| 
							 | 
						f1e1f720bf | ||
| 
							 | 
						2e2f7c9f79 | ||
| 
							 | 
						f0a5f09420 | ||
| 
							 | 
						3c921acb48 | ||
| 
							 | 
						ad33ff34f7 | ||
| 
							 | 
						0267a5906e | ||
| 
							 | 
						6bc451cf6d | ||
| 
							 | 
						12464ed1bb | ||
| 
							 | 
						00d983a40d | ||
| 
							 | 
						a859c7a651 | ||
| 
							 | 
						b57c6d3729 | ||
| 
							 | 
						83242a5c3c | ||
| 
							 | 
						1717ff336e | ||
| 
							 | 
						c296c52cae | ||
| 
							 | 
						06efc8ffb6 | ||
| 
							 | 
						ca713c08ee | ||
| 
							 | 
						38cb14d39d | ||
| 
							 | 
						361a0de85a | ||
| 
							 | 
						cfde4c1b17 | ||
| 
							 | 
						d5608c07c3 | ||
| 
							 | 
						707bd256b9 | ||
| 
							 | 
						e6bcd7b611 | ||
| 
							 | 
						6305eada80 | ||
| 
							 | 
						83b59d6ebe | ||
| 
							 | 
						03c5f493dc | ||
| 
							 | 
						af6571d0c7 | ||
| 
							 | 
						336b2dbbc2 | ||
| 
							 | 
						9daf499fff | ||
| 
							 | 
						6686d5d1e6 | ||
| 
							 | 
						96ac4ae10d | ||
| 
							 | 
						4dccddd564 | ||
| 
							 | 
						f89428d9f8 | ||
| 
							 | 
						09cd7bf783 | ||
| 
							 | 
						f81bb670c3 | ||
| 
							 | 
						9df770eb16 | ||
| 
							 | 
						41e6e875e5 | ||
| 
							 | 
						818ef4e138 | ||
| 
							 | 
						2be4c2ba51 | ||
| 
							 | 
						862ac1f7c8 | ||
| 
							 | 
						2891e579a1 | ||
| 
							 | 
						d6488c5351 | ||
| 
							 | 
						1e5a938e43 | ||
| 
							 | 
						144c3630ea | ||
| 
							 | 
						0b08468035 | ||
| 
							 | 
						93774b1d14 | ||
| 
							 | 
						9d01a26242 | ||
| 
							 | 
						91b764faac | ||
| 
							 | 
						cec0ab322e | ||
| 
							 | 
						589bc4b6f4 | ||
| 
							 | 
						94c354c290 | ||
| 
							 | 
						e446e3aac5 | ||
| 
							 | 
						f48a72a504 | ||
| 
							 | 
						7e04f8fe44 | ||
| 
							 | 
						396d37594c | ||
| 
							 | 
						28393cb896 | ||
| 
							 | 
						bf783ab08f | ||
| 
							 | 
						916896c1cc | ||
| 
							 | 
						64aaf8a832 | ||
| 
							 | 
						7a98bcf735 | ||
| 
							 | 
						756df7b6ae | ||
| 
							 | 
						93941e5207 | ||
| 
							 | 
						47780884e1 | ||
| 
							 | 
						e9b78f1c31 | ||
| 
							 | 
						5af8340183 | ||
| 
							 | 
						3b33f60d2f | ||
| 
							 | 
						f10dec9dae | ||
| 
							 | 
						0877eba761 | ||
| 
							 | 
						0f1e4f8706 | ||
| 
							 | 
						36871ff1ff | ||
| 
							 | 
						bde2aa34ef | ||
| 
							 | 
						98b7a34102 | ||
| 
							 | 
						1bf5ca28d8 | ||
| 
							 | 
						9f88d6997f | ||
| 
							 | 
						233b7f1d4a | ||
| 
							 | 
						0f6aae914f | ||
| 
							 | 
						9606b37776 | ||
| 
							 | 
						00bb4a936a | ||
| 
							 | 
						b6ce585da6 | ||
| 
							 | 
						220bdf8a00 | ||
| 
							 | 
						0095d79ef8 | ||
| 
							 | 
						0d42f11b87 | ||
| 
							 | 
						d46a4686a8 | ||
| 
							 | 
						370d190572 | ||
| 
							 | 
						0310bb5c5c | ||
| 
							 | 
						4796b3fb95 | ||
| 
							 | 
						8425307ca1 | ||
| 
							 | 
						9eb6cda245 | ||
| 
							 | 
						eda3290883 | ||
| 
							 | 
						b192099353 | ||
| 
							 | 
						4b177f4557 | ||
| 
							 | 
						70ec3aec64 | ||
| 
							 | 
						e2ac91b860 | ||
| 
							 | 
						ddc5c17163 | ||
| 
							 | 
						1ce85ee2ae | ||
| 
							 | 
						6c110a3b18 | ||
| 
							 | 
						c99311e822 | ||
| 
							 | 
						a0e27314c6 | ||
| 
							 | 
						2385aa18e1 | ||
| 
							 | 
						984c44b044 | ||
| 
							 | 
						b0b6b1fcc5 | ||
| 
							 | 
						335d891ee9 | ||
| 
							 | 
						e3cc44966b | ||
| 
							 | 
						7359491b97 | ||
| 
							 | 
						28ed09b155 | ||
| 
							 | 
						caf72fd9bc | ||
| 
							 | 
						37e597ff0a | ||
| 
							 | 
						3476e77714 | ||
| 
							 | 
						2f22c1d595 | ||
| 
							 | 
						5f3ae4376e | ||
| 
							 | 
						95497f8777 | ||
| 
							 | 
						d991be6a26 | ||
| 
							 | 
						2958692eca | ||
| 
							 | 
						882737b077 | ||
| 
							 | 
						07f36ab580 | ||
| 
							 | 
						b801527f88 | ||
| 
							 | 
						f60638a3aa | ||
| 
							 | 
						b7412169f5 | ||
| 
							 | 
						00bb29de0f | ||
| 
							 | 
						e35a8554f8 | ||
| 
							 | 
						bf10458604 | ||
| 
							 | 
						15f3b1f450 | ||
| 
							 | 
						c0a7c01a35 | ||
| 
							 | 
						f562394596 | ||
| 
							 | 
						0aff6e0ef0 | ||
| 
							 | 
						5153dc3362 | ||
| 
							 | 
						3643c468e4 | ||
| 
							 | 
						1d437dfb8e | ||
| 
							 | 
						e8ae244b2b | ||
| 
							 | 
						b82160c2e7 | ||
| 
							 | 
						bf327d3dfb | ||
| 
							 | 
						b948ffdb25 | ||
| 
							 | 
						3e28f3e859 | ||
| 
							 | 
						507688e6c9 | ||
| 
							 | 
						1f60cd291f | ||
| 
							 | 
						c517e712ed | ||
| 
							 | 
						31176120f5 | ||
| 
							 | 
						a8a60832cd | ||
| 
							 | 
						dac9e40be6 | ||
| 
							 | 
						05a9e52caf | ||
| 
							 | 
						25075bb3d7 | ||
| 
							 | 
						019a5c130f | ||
| 
							 | 
						22ddb88072 | ||
| 
							 | 
						c01a2977a5 | ||
| 
							 | 
						72fd462090 | ||
| 
							 | 
						099292d63d | ||
| 
							 | 
						68627c5563 | ||
| 
							 | 
						475665d615 | ||
| 
							 | 
						29b0c87d71 | ||
| 
							 | 
						348e703be0 | ||
| 
							 | 
						b9b7c0ab05 | ||
| 
							 | 
						89545946fd | ||
| 
							 | 
						14e0a8f66f | ||
| 
							 | 
						47ee86938b | ||
| 
							 | 
						860e455440 | ||
| 
							 | 
						3914d0cab3 | ||
| 
							 | 
						0fcabdbd0c | ||
| 
							 | 
						9438df8d30 | ||
| 
							 | 
						fcb318b9c5 | ||
| 
							 | 
						0d0108e954 | ||
| 
							 | 
						a50b66651e | ||
| 
							 | 
						1ad3fdff8a | ||
| 
							 | 
						618d60a1f2 | ||
| 
							 | 
						22e80e228c | ||
| 
							 | 
						a39462a6c0 | ||
| 
							 | 
						206a30d100 | ||
| 
							 | 
						9aeba05e47 | ||
| 
							 | 
						30ba62e47c | ||
| 
							 | 
						2ac708d916 | ||
| 
							 | 
						97a1609b29 | ||
| 
							 | 
						c9a8b8629f | ||
| 
							 | 
						e5be9cce4f | ||
| 
							 | 
						b8d98d03fe | ||
| 
							 | 
						2a460e18e3 | ||
| 
							 | 
						6c4cd0f1b2 | ||
| 
							 | 
						e6f767d41d | ||
| 
							 | 
						8673f17c0a | ||
| 
							 | 
						e379267274 | ||
| 
							 | 
						8d9e469e09 | ||
| 
							 | 
						e9367443ac | ||
| 
							 | 
						66cc01ee2d | ||
| 
							 | 
						44c05cfa7b | ||
| 
							 | 
						cc187b035b | ||
| 
							 | 
						3c759ae293 | ||
| 
							 | 
						bac3d31283 | ||
| 
							 | 
						c9c7552fed | ||
| 
							 | 
						02aee17cc3 | ||
| 
							 | 
						58d86cfb5f | ||
| 
							 | 
						5ecf27681e | ||
| 
							 | 
						a346a7d42e | ||
| 
							 | 
						35b3c8c279 | ||
| 
							 | 
						8614fc45f8 | ||
| 
							 | 
						a36b8a273d | ||
| 
							 | 
						e0e8bf083d | ||
| 
							 | 
						49be2a1c52 | ||
| 
							 | 
						8c4f60af48 | ||
| 
							 | 
						429c0e03a3 | ||
| 
							 | 
						c167b98ff2 | ||
| 
							 | 
						30ce210c2a | ||
| 
							 | 
						07a4e593bb | ||
| 
							 | 
						938195b19f | ||
| 
							 | 
						a858290e4b | ||
| 
							 | 
						6f058e6b0d | ||
| 
							 | 
						4e4086934c | ||
| 
							 | 
						e8fa7929b7 | ||
| 
							 | 
						79a069c886 | ||
| 
							 | 
						5ccd1c5619 | ||
| 
							 | 
						e4b0f68e0b | ||
| 
							 | 
						0b647a9009 | ||
| 
							 | 
						88d7d5706a | ||
| 
							 | 
						bef0706238 | ||
| 
							 | 
						00dbe9cb2a | ||
| 
							 | 
						121608f040 | ||
| 
							 | 
						8495bffee5 | ||
| 
							 | 
						28510f3117 | ||
| 
							 | 
						f4ab704948 | ||
| 
							 | 
						ede1924ded | ||
| 
							 | 
						45ed70d480 | ||
| 
							 | 
						4715e36a5c | ||
| 
							 | 
						5743849b50 | ||
| 
							 | 
						a3da53f66e | ||
| 
							 | 
						7f7b4be82d | ||
| 
							 | 
						abcf70538d | ||
| 
							 | 
						6d07eaea1f | ||
| 
							 | 
						8f45cfcbc9 | ||
| 
							 | 
						77494086c1 | ||
| 
							 | 
						f7ae61cb1e | ||
| 
							 | 
						2c11f65701 | ||
| 
							 | 
						847982eb0e | ||
| 
							 | 
						244d5a1cc1 | ||
| 
							 | 
						3cade43cf3 | ||
| 
							 | 
						84e8d59782 | ||
| 
							 | 
						91ebfac75b | ||
| 
							 | 
						0cab2fcb75 | ||
| 
							 | 
						3785896533 | ||
| 
							 | 
						e317edcfb9 | ||
| 
							 | 
						e2c291d18e | ||
| 
							 | 
						56e2d52b65 | ||
| 
							 | 
						927ab0f4b8 | ||
| 
							 | 
						1957d3fb00 | ||
| 
							 | 
						87333537d2 | ||
| 
							 | 
						b991e9acc9 | ||
| 
							 | 
						9e789c65c2 | ||
| 
							 | 
						0f6b365138 | ||
| 
							 | 
						0c33101a42 | ||
| 
							 | 
						a85c24e9ca | ||
| 
							 | 
						42b779974c | ||
| 
							 | 
						a09bf57944 | ||
| 
							 | 
						2bcc8589fa | ||
| 
							 | 
						f8b0d0a43c | ||
| 
							 | 
						1ed8f771bd | ||
| 
							 | 
						c7838cbbcb | ||
| 
							 | 
						5fa137cc0d | ||
| 
							 | 
						0b0912cc5b | ||
| 
							 | 
						b52c490709 | ||
| 
							 | 
						c54d3764b2 | ||
| 
							 | 
						d2a9141913 | ||
| 
							 | 
						fcc49ad517 | ||
| 
							 | 
						685aed1de2 | ||
| 
							 | 
						fc3a199ca2 | ||
| 
							 | 
						5b436abef7 | ||
| 
							 | 
						495d6ba796 | ||
| 
							 | 
						dd9d8038da | ||
| 
							 | 
						e91c541446 | ||
| 
							 | 
						b904cb14a9 | ||
| 
							 | 
						0a52f959ac | ||
| 
							 | 
						a03bbc79fe | ||
| 
							 | 
						05bd4547d0 | ||
| 
							 | 
						da1d4fb30c | ||
| 
							 | 
						ed7398a64a | ||
| 
							 | 
						ff7fb675f1 | ||
| 
							 | 
						9189b1d8b7 | ||
| 
							 | 
						eac495f0e7 | ||
| 
							 | 
						47e8984450 | ||
| 
							 | 
						36f288f884 | ||
| 
							 | 
						e6e36c4d34 | ||
| 
							 | 
						f2fb0b0aa5 | ||
| 
							 | 
						5fba59b41d | ||
| 
							 | 
						ce2989891d | ||
| 
							 | 
						5cd7b1de16 | ||
| 
							 | 
						ec5d2d2a29 | ||
| 
							 | 
						8babd0bc4e | ||
| 
							 | 
						f2c878a2c1 | ||
| 
							 | 
						97996a6e20 | ||
| 
							 | 
						c504851dca | ||
| 
							 | 
						48716a72b1 | ||
| 
							 | 
						1c991a329e | ||
| 
							 | 
						14b242c737 | ||
| 
							 | 
						f4f548fbe6 | ||
| 
							 | 
						bb022c1b84 | ||
| 
							 | 
						ece2890c8b | ||
| 
							 | 
						efa4d31cfb | ||
| 
							 | 
						ae226a12b6 | ||
| 
							 | 
						c38dc1cf72 | ||
| 
							 | 
						6605caa39e | ||
| 
							 | 
						b3dddfed6a | ||
| 
							 | 
						4b37f3db3d | ||
| 
							 | 
						eb3d14053d | ||
| 
							 | 
						67711e899c | ||
| 
							 | 
						328e101f37 | ||
| 
							 | 
						0be61add02 | ||
| 
							 | 
						da9bd36cbb | ||
| 
							 | 
						b8e29d471b | ||
| 
							 | 
						b04da87e38 | ||
| 
							 | 
						d37bdf5cbf | ||
| 
							 | 
						edef57f6c3 | ||
| 
							 | 
						fb315b9050 | ||
| 
							 | 
						7ac94f1a69 | ||
| 
							 | 
						5bfc3e6b03 | ||
| 
							 | 
						2c2808fab1 | ||
| 
							 | 
						db3d91ebeb | ||
| 
							 | 
						4fa11619a2 | ||
| 
							 | 
						bb8223bff1 | ||
| 
							 | 
						cb71071d93 | ||
| 
							 | 
						e19a8bb5cd | ||
| 
							 | 
						561a9d6ebb | ||
| 
							 | 
						0022fc90b7 | ||
| 
							 | 
						f94f4de6ff | ||
| 
							 | 
						311b3cc37f | ||
| 
							 | 
						489cc49937 | ||
| 
							 | 
						0ea7dc9f19 | ||
| 
							 | 
						f53ac8d57c | ||
| 
							 | 
						1a1cf55efb | ||
| 
							 | 
						5a9cdd724f | ||
| 
							 | 
						5f4f4b5dd3 | ||
| 
							 | 
						f073a1a59b | ||
| 
							 | 
						cee0c39b00 | ||
| 
							 | 
						ff81fc9f7b | ||
| 
							 | 
						02d5d9bc1f | ||
| 
							 | 
						87843366ce | ||
| 
							 | 
						90a1b35017 | ||
| 
							 | 
						d0680a2b3d | ||
| 
							 | 
						a2ede93479 | ||
| 
							 | 
						5e79d0fb01 | ||
| 
							 | 
						d10249d0ce | ||
| 
							 | 
						2c70c13cc3 | ||
| 
							 | 
						ad90a2d0ac | ||
| 
							 | 
						30047f232b | ||
| 
							 | 
						ddc023b883 | ||
| 
							 | 
						90c0d8c225 | ||
| 
							 | 
						a55561dcba | ||
| 
							 | 
						0923e12fa3 | ||
| 
							 | 
						b124385fac | ||
| 
							 | 
						b71d0224db | ||
| 
							 | 
						7a336645fb | ||
| 
							 | 
						801ac5ced8 | ||
| 
							 | 
						10161407ff | ||
| 
							 | 
						f0579b9b67 | ||
| 
							 | 
						c4984e33b2 | ||
| 
							 | 
						3b4f37ac92 | ||
| 
							 | 
						7eb98a31bb | ||
| 
							 | 
						279b7ee698 | ||
| 
							 | 
						13fe4a5a57 | ||
| 
							 | 
						ca47d0ef15 | ||
| 
							 | 
						72f1719c95 | ||
| 
							 | 
						d17f68c047 | ||
| 
							 | 
						331bb2f1ed | ||
| 
							 | 
						49d9d5e618 | ||
| 
							 | 
						51d4d5ec3c | ||
| 
							 | 
						067e29543a | ||
| 
							 | 
						74e576c31a | ||
| 
							 | 
						a188f1d29f | ||
| 
							 | 
						20a4aa8cf9 | ||
| 
							 | 
						ae7a893ce9 | ||
| 
							 | 
						7e202a3844 | ||
| 
							 | 
						c54fdb76f8 | ||
| 
							 | 
						adb3a55703 | ||
| 
							 | 
						9a66938283 | ||
| 
							 | 
						3c3ead2784 | ||
| 
							 | 
						32b8e5f500 | ||
| 
							 | 
						b3bf5be1f6 | ||
| 
							 | 
						5cf84fa3fe | ||
| 
							 | 
						4a92ec35a6 | ||
| 
							 | 
						b4f97c62c6 | ||
| 
							 | 
						5ca74996f0 | ||
| 
							 | 
						eec1ac20b7 | ||
| 
							 | 
						477674740e | ||
| 
							 | 
						a328e0ae28 | ||
| 
							 | 
						8f429ac04b | ||
| 
							 | 
						e8dbd328d8 | ||
| 
							 | 
						241147968e | ||
| 
							 | 
						85ff73d690 | ||
| 
							 | 
						0efd0258a7 | ||
| 
							 | 
						9debb4b814 | ||
| 
							 | 
						80d44e8f39 | ||
| 
							 | 
						2581575bd1 | ||
| 
							 | 
						d3eb06ab74 | ||
| 
							 | 
						ce2f9eebb4 | ||
| 
							 | 
						289b33281f | ||
| 
							 | 
						8aa836d588 | ||
| 
							 | 
						deb7dddbef | ||
| 
							 | 
						5f4b4b02f9 | ||
| 
							 | 
						a0f5c4153f | ||
| 
							 | 
						8554c9d02a | ||
| 
							 | 
						2011474936 | ||
| 
							 | 
						e4fcbef89a | ||
| 
							 | 
						aa2289a25b | ||
| 
							 | 
						b75ed93e51 | ||
| 
							 | 
						a0beb30ba8 | ||
| 
							 | 
						019b53ace8 | ||
| 
							 | 
						ef5d9ff028 | ||
| 
							 | 
						616db9809e | ||
| 
							 | 
						47ee9ef10a | ||
| 
							 | 
						70aaec0ac4 | ||
| 
							 | 
						a8b9ce2050 | ||
| 
							 | 
						653e1578a1 | ||
| 
							 | 
						0817001728 | ||
| 
							 | 
						3ff0c270dd | ||
| 
							 | 
						f93b3b23a3 | ||
| 
							 | 
						e9a0ac1346 | ||
| 
							 | 
						69eaa6d098 | ||
| 
							 | 
						64b7a8990e | ||
| 
							 | 
						a77c1cbd0b | ||
| 
							 | 
						7795e06563 | ||
| 
							 | 
						41b831d0f8 | ||
| 
							 | 
						6294cbeb68 | ||
| 
							 | 
						20cdc9155f | ||
| 
							 | 
						4c5e3f9015 | ||
| 
							 | 
						9a6f8d31dc | ||
| 
							 | 
						17c755714d | ||
| 
							 | 
						1541ce3368 | ||
| 
							 | 
						c045767252 | ||
| 
							 | 
						a9cece3c2e | ||
| 
							 | 
						dd6c9de604 | ||
| 
							 | 
						8a09bacdf6 | ||
| 
							 | 
						bd7ce5c7fa | ||
| 
							 | 
						bcb9ff20fd | ||
| 
							 | 
						d093402d97 | ||
| 
							 | 
						fa52a596f4 | ||
| 
							 | 
						5c8e1ab7b6 | ||
| 
							 | 
						b2edefbc4c | ||
| 
							 | 
						43441a4d69 | ||
| 
							 | 
						4b236f8274 | ||
| 
							 | 
						220b037683 | ||
| 
							 | 
						fd2db174c1 | ||
| 
							 | 
						7fd05e7eaa | ||
| 
							 | 
						665a27f281 | ||
| 
							 | 
						5b4e9dc33e | ||
| 
							 | 
						f9b0bf3f95 | ||
| 
							 | 
						2f74789a92 | ||
| 
							 | 
						f3ff25c936 | ||
| 
							 | 
						b91864eb37 | ||
| 
							 | 
						cad0523617 | ||
| 
							 | 
						8047a37b02 | ||
| 
							 | 
						2e18d5f70c | ||
| 
							 | 
						343509abdf | ||
| 
							 | 
						b51755bc8b | ||
| 
							 | 
						54923bf5bd | ||
| 
							 | 
						7ce9b0daec | ||
| 
							 | 
						b67226fa0c | ||
| 
							 | 
						a6199c92a4 | ||
| 
							 | 
						b57b87abbb | ||
| 
							 | 
						f2905c74ed | ||
| 
							 | 
						58aab3e16b | ||
| 
							 | 
						953b0f81ad | ||
| 
							 | 
						0b2b723a0e | ||
| 
							 | 
						75b4c3379d | ||
| 
							 | 
						2cb678edb3 | ||
| 
							 | 
						931b6d9ad8 | ||
| 
							 | 
						3922247356 | ||
| 
							 | 
						b869305282 | ||
| 
							 | 
						dc618d37c6 | ||
| 
							 | 
						baadda3b67 | ||
| 
							 | 
						3539374ba7 | ||
| 
							 | 
						7f2bdab8ea | ||
| 
							 | 
						26b09b0ee3 | ||
| 
							 | 
						3ed969144a | ||
| 
							 | 
						209820bab8 | ||
| 
							 | 
						8795298f69 | ||
| 
							 | 
						592a97a7b0 | ||
| 
							 | 
						6e0970c14b | ||
| 
							 | 
						a30d385636 | ||
| 
							 | 
						64f2f38ec4 | ||
| 
							 | 
						6982bb8c7f | ||
| 
							 | 
						d04ee91714 | ||
| 
							 | 
						7e135a5235 | ||
| 
							 | 
						df591638a5 | ||
| 
							 | 
						52fc22a76b | ||
| 
							 | 
						9f34e962a6 | ||
| 
							 | 
						83f6d719b1 | ||
| 
							 | 
						3f9fb8d664 | ||
| 
							 | 
						defcea02fa | ||
| 
							 | 
						1c5895f625 | ||
| 
							 | 
						123f937701 | ||
| 
							 | 
						61b0ea4589 | ||
| 
							 | 
						13256e9083 | ||
| 
							 | 
						62bec49c27 | ||
| 
							 | 
						e6f5fb12a3 | ||
| 
							 | 
						4e0d0c5f0b | ||
| 
							 | 
						83c644fe09 | ||
| 
							 | 
						3d1c9f1cce | ||
| 
							 | 
						3d8a19af33 | ||
| 
							 | 
						72e0fe0479 | ||
| 
							 | 
						baf0b0b9e1 | ||
| 
							 | 
						c1b5fb19ea | ||
| 
							 | 
						c2eb173fdc | ||
| 
							 | 
						f6fc307638 | ||
| 
							 | 
						d238fc8199 | ||
| 
							 | 
						0e8a8e9844 | ||
| 
							 | 
						d07a383d6e | ||
| 
							 | 
						fa8208eeef | ||
| 
							 | 
						4c1be71773 | ||
| 
							 | 
						549f3fc46f | ||
| 
							 | 
						046fdad4ee | ||
| 
							 | 
						92243038c1 | ||
| 
							 | 
						2393be4543 | ||
| 
							 | 
						5480a1382f | ||
| 
							 | 
						3a0ffe21e6 | ||
| 
							 | 
						82229b3d87 | ||
| 
							 | 
						3fdcf0d34c | ||
| 
							 | 
						524da5962d | ||
| 
							 | 
						b0462cb5de | ||
| 
							 | 
						c08ef84745 | ||
| 
							 | 
						190d49d874 | ||
| 
							 | 
						a2f2bded0b | ||
| 
							 | 
						b6b61a956f | ||
| 
							 | 
						4976ac7ef9 | ||
| 
							 | 
						9afa0cd270 | ||
| 
							 | 
						c2e539b780 | ||
| 
							 | 
						ff3bc8818f | ||
| 
							 | 
						88963e9a9c | ||
| 
							 | 
						550ec8c2a4 | ||
| 
							 | 
						8e32afb863 | ||
| 
							 | 
						feba1fd260 | ||
| 
							 | 
						a78e97a53b | ||
| 
							 | 
						8c68537446 | ||
| 
							 | 
						41cafb4d2f | ||
| 
							 | 
						2f51b9a5d9 | ||
| 
							 | 
						94116901ce | ||
| 
							 | 
						9b36e576cb | ||
| 
							 | 
						930f2f3e2d | ||
| 
							 | 
						b51d3d7e8b | ||
| 
							 | 
						4f3a2d723b | ||
| 
							 | 
						420c510d47 | ||
| 
							 | 
						e43324a186 | ||
| 
							 | 
						7ef8dc4dee | ||
| 
							 | 
						efb1208b97 | ||
| 
							 | 
						113e22cb72 | ||
| 
							 | 
						6e64d5da47 | ||
| 
							 | 
						457b1c2e1e | ||
| 
							 | 
						56c6e19f99 | ||
| 
							 | 
						c515f9bf8e | ||
| 
							 | 
						187df01b5e | ||
| 
							 | 
						38a3ebdca1 | ||
| 
							 | 
						a5e63102d9 | ||
| 
							 | 
						f65f5cf866 | ||
| 
							 | 
						abb55697c1 | ||
| 
							 | 
						5dd65dccf3 | ||
| 
							 | 
						13105a8e64 | ||
| 
							 | 
						60669920f0 | ||
| 
							 | 
						2cec77e7df | ||
| 
							 | 
						50fe63ea76 | ||
| 
							 | 
						fecf1bcba4 | ||
| 
							 | 
						820e0fccb1 | ||
| 
							 | 
						c45d667934 | ||
| 
							 | 
						b943c31fd8 | ||
| 
							 | 
						e2731914ad | ||
| 
							 | 
						7341cc401b | ||
| 
							 | 
						5db9bca75c | ||
| 
							 | 
						bd25614cb9 | ||
| 
							 | 
						cef14695b6 | ||
| 
							 | 
						6f197484fc | ||
| 
							 | 
						592c7c404c | ||
| 
							 | 
						2042a0483b | ||
| 
							 | 
						34796d5bb8 | ||
| 
							 | 
						f2452a6af7 | ||
| 
							 | 
						f7fdafc203 | ||
| 
							 | 
						fb49e0795c | ||
| 
							 | 
						cd1d9ceff1 | ||
| 
							 | 
						65cbbf1a02 | ||
| 
							 | 
						d258892392 | ||
| 
							 | 
						71c0c8e34c | ||
| 
							 | 
						023525eca2 | ||
| 
							 | 
						2fe77c47e1 | ||
| 
							 | 
						d9b742cfda | ||
| 
							 | 
						a1be639894 | ||
| 
							 | 
						3f99c6f259 | ||
| 
							 | 
						51d9bdd9cb | ||
| 
							 | 
						e126f9bcbf | ||
| 
							 | 
						548fa0ec48 | ||
| 
							 | 
						417a72365e | ||
| 
							 | 
						96007dc576 | ||
| 
							 | 
						e81fb77322 | ||
| 
							 | 
						737ca4ee7b | ||
| 
							 | 
						564c9b1ba5 | ||
| 
							 | 
						617f1b8a38 | ||
| 
							 | 
						d37f213236 | ||
| 
							 | 
						5e81ff8ede | ||
| 
							 | 
						ccb7a51c3a | ||
| 
							 | 
						f7eab4172e | ||
| 
							 | 
						12f8ca664b | ||
| 
							 | 
						7dc1d28b2c | ||
| 
							 | 
						5a54ecd8df | ||
| 
							 | 
						b80189c3dd | ||
| 
							 | 
						b9a8bb15a4 | ||
| 
							 | 
						9ff1c93ab1 | ||
| 
							 | 
						e5afc939e8 | ||
| 
							 | 
						e387772dc2 | ||
| 
							 | 
						1e18cded75 | ||
| 
							 | 
						489e4b6bd2 | ||
| 
							 | 
						897748759e | ||
| 
							 | 
						e375364c87 | ||
| 
							 | 
						01d1e29402 | ||
| 
							 | 
						2771c435fd | ||
| 
							 | 
						218f25088c | ||
| 
							 | 
						6712d9c3db | ||
| 
							 | 
						9b316f6deb | ||
| 
							 | 
						a0eb12e4be | ||
| 
							 | 
						b957d74eb6 | ||
| 
							 | 
						26099f4c29 | ||
| 
							 | 
						093b3eea21 | ||
| 
							 | 
						c334bfb0bb | ||
| 
							 | 
						37bf571db3 | ||
| 
							 | 
						ca032152b1 | ||
| 
							 | 
						b71216af70 | ||
| 
							 | 
						6b3681938b | ||
| 
							 | 
						08efc1171c | ||
| 
							 | 
						1f16f949ec | ||
| 
							 | 
						d599936925 | ||
| 
							 | 
						882542e001 | ||
| 
							 | 
						b47d28bad6 | ||
| 
							 | 
						4f53136891 | ||
| 
							 | 
						1445843ced | ||
| 
							 | 
						09a5b7ee35 | ||
| 
							 | 
						2420c3a8c8 | ||
| 
							 | 
						8dfa086c3c | ||
| 
							 | 
						e5d0dd2020 | ||
| 
							 | 
						436195f05f | ||
| 
							 | 
						608bf93f7a | ||
| 
							 | 
						a5a6973472 | ||
| 
							 | 
						f068e4ba85 | ||
| 
							 | 
						2d8080cbde | ||
| 
							 | 
						ff0d6d5677 | ||
| 
							 | 
						b2695f86cf | ||
| 
							 | 
						d5e2cc94cd | ||
| 
							 | 
						bca83c8eee | ||
| 
							 | 
						68c5f41708 | ||
| 
							 | 
						46f5740604 | ||
| 
							 | 
						8e4c211a80 | ||
| 
							 | 
						8bcf0460d1 | ||
| 
							 | 
						8ee51cd88f | ||
| 
							 | 
						dbca286de8 | ||
| 
							 | 
						e545efdb6e | ||
| 
							 | 
						d277b3b62e | ||
| 
							 | 
						5a4e8bb45e | ||
| 
							 | 
						a30a988606 | ||
| 
							 | 
						42b9b0eb4c | ||
| 
							 | 
						5bf3a0c454 | ||
| 
							 | 
						958ae36717 | ||
| 
							 | 
						27fecd3c56 | ||
| 
							 | 
						afa7ebc032 | ||
| 
							 | 
						e68111b4aa | ||
| 
							 | 
						a419f69bbb | ||
| 
							 | 
						445ca819ce | ||
| 
							 | 
						d96485190d | ||
| 
							 | 
						8c8fd97698 | ||
| 
							 | 
						20246b5c0e | ||
| 
							 | 
						0ebf664515 | ||
| 
							 | 
						df2369f6e1 | ||
| 
							 | 
						6161cb3ec5 | ||
| 
							 | 
						1904521a4d | ||
| 
							 | 
						46d376cb78 | ||
| 
							 | 
						80f700876d | ||
| 
							 | 
						aedbe51043 | ||
| 
							 | 
						6373827a40 | ||
| 
							 | 
						86dd937857 | ||
| 
							 | 
						77e6471a04 | ||
| 
							 | 
						4dd98b4ff8 | ||
| 
							 | 
						df52086c47 | ||
| 
							 | 
						399ff82ab2 | ||
| 
							 | 
						14eb03a821 | ||
| 
							 | 
						faf5ae0c2f | ||
| 
							 | 
						9255e07c3a | ||
| 
							 | 
						2940c9ff7b | ||
| 
							 | 
						584ea400c3 | ||
| 
							 | 
						270eda63a9 | ||
| 
							 | 
						9586ef891e | ||
| 
							 | 
						1b6830f68f | ||
| 
							 | 
						b02b69b271 | ||
| 
							 | 
						ce8abfc5cc | ||
| 
							 | 
						c5b5476aa4 | ||
| 
							 | 
						efb4a1df25 | ||
| 
							 | 
						4d22296d3a | ||
| 
							 | 
						24843a73c0 | ||
| 
							 | 
						69b5fe8395 | ||
| 
							 | 
						db47c3e442 | ||
| 
							 | 
						74fe7728d2 | ||
| 
							 | 
						8120493edb | ||
| 
							 | 
						612cbf5176 | ||
| 
							 | 
						533c67710e | ||
| 
							 | 
						8e62b08e58 | ||
| 
							 | 
						7f07448a80 | ||
| 
							 | 
						21a468a9cd | ||
| 
							 | 
						39e079d8ac | ||
| 
							 | 
						92643f77f9 | ||
| 
							 | 
						2ea8d3430c | ||
| 
							 | 
						8d3cb2cd84 | ||
| 
							 | 
						aa67998e26 | ||
| 
							 | 
						237c0197c6 | ||
| 
							 | 
						664359a020 | ||
| 
							 | 
						a9083c7519 | ||
| 
							 | 
						743d86500c | ||
| 
							 | 
						6e8db1cd4a | ||
| 
							 | 
						c7b318523d | ||
| 
							 | 
						3856d29646 | ||
| 
							 | 
						18a5f884be | ||
| 
							 | 
						78fe234bfe | ||
| 
							 | 
						40dbc5f00f | ||
| 
							 | 
						3d6e77e96d | ||
| 
							 | 
						07f033c8da | ||
| 
							 | 
						b6cb76bf8d | ||
| 
							 | 
						93ee66dcab | ||
| 
							 | 
						84c18df626 | ||
| 
							 | 
						14f48c7a1c | ||
| 
							 | 
						7e4dd9524f | ||
| 
							 | 
						41665e6bb8 | ||
| 
							 | 
						7d6e2a6417 | ||
| 
							 | 
						abfad78fb3 | ||
| 
							 | 
						8b01fce2bc | ||
| 
							 | 
						19f6d83fa2 | ||
| 
							 | 
						1cca24c585 | ||
| 
							 | 
						bcf0c0cf89 | ||
| 
							 | 
						d1d580cafa | ||
| 
							 | 
						4774178c68 | ||
| 
							 | 
						2f21b27397 | ||
| 
							 | 
						205ee5b6b0 | ||
| 
							 | 
						336a5d1ded | ||
| 
							 | 
						14f55663bf | ||
| 
							 | 
						2e409c0237 | ||
| 
							 | 
						46c4261998 | ||
| 
							 | 
						0d61cc1b1d | ||
| 
							 | 
						081116906d | ||
| 
							 | 
						a4148c80b4 | ||
| 
							 | 
						31069b2626 | ||
| 
							 | 
						ebe9381236 | ||
| 
							 | 
						55f71520db | ||
| 
							 | 
						c4a88dfe6c | ||
| 
							 | 
						57326d65d9 | ||
| 
							 | 
						3140ede326 | ||
| 
							 | 
						e9dae61cca | ||
| 
							 | 
						6e57510d6b | ||
| 
							 | 
						55372a41b1 | ||
| 
							 | 
						d22a4d60b3 | ||
| 
							 | 
						6dfb164cab | ||
| 
							 | 
						558721efc2 | ||
| 
							 | 
						9e3f9607a6 | ||
| 
							 | 
						4c51e6518b | ||
| 
							 | 
						bbe1587f71 | ||
| 
							 | 
						b15ec9bec9 | ||
| 
							 | 
						42b92a3487 | ||
| 
							 | 
						bb1bb07f6c | ||
| 
							 | 
						e9a2406314 | ||
| 
							 | 
						e3122a8555 | ||
| 
							 | 
						b8ad9acbc7 | ||
| 
							 | 
						e355df3785 | ||
| 
							 | 
						a99ed4da2a | ||
| 
							 | 
						031014bbab | ||
| 
							 | 
						8205038ffb | ||
| 
							 | 
						a9f12537d1 | ||
| 
							 | 
						722776cf65 | ||
| 
							 | 
						5cfd461ba2 | ||
| 
							 | 
						9d6098f8c6 | ||
| 
							 | 
						77143e54d9 | ||
| 
							 | 
						dd683176c2 | ||
| 
							 | 
						832c5a6d25 | ||
| 
							 | 
						5c547d58d1 | ||
| 
							 | 
						ee2c6eb41e | ||
| 
							 | 
						1b258f4ecc | ||
| 
							 | 
						774f9cbb80 | ||
| 
							 | 
						bf952a6e4b | ||
| 
							 | 
						da69bddb95 | ||
| 
							 | 
						1adc9e5445 | ||
| 
							 | 
						aca673b3ab | ||
| 
							 | 
						94910f77c9 | ||
| 
							 | 
						5c5075f4d6 | ||
| 
							 | 
						b23161d772 | ||
| 
							 | 
						5f4c0cdd1e | ||
| 
							 | 
						ae1bbc93d8 | ||
| 
							 | 
						dba31d7e2a | ||
| 
							 | 
						d0c4b491da | ||
| 
							 | 
						b501290bd5 | ||
| 
							 | 
						328718f958 | ||
| 
							 | 
						9ceb4310f8 | ||
| 
							 | 
						abc03ec810 | ||
| 
							 | 
						afb4a2f49c | ||
| 
							 | 
						479ba33685 | ||
| 
							 | 
						f8dcf32c8d | ||
| 
							 | 
						2873d7a6cc | ||
| 
							 | 
						d7cb68bfc7 | ||
| 
							 | 
						5ef13489db | ||
| 
							 | 
						dfdc3e333a | ||
| 
							 | 
						4c200183b9 | ||
| 
							 | 
						cc6081b70d | ||
| 
							 | 
						241ec04d88 | ||
| 
							 | 
						ea7cfb9e94 | ||
| 
							 | 
						636e123fdd | ||
| 
							 | 
						5fb9716ce7 | ||
| 
							 | 
						beb075c5a6 | ||
| 
							 | 
						6015fa353a | ||
| 
							 | 
						aea77dc055 | ||
| 
							 | 
						439d5d04fe | ||
| 
							 | 
						3c62d29a55 | ||
| 
							 | 
						4ae348254e | ||
| 
							 | 
						eb534b4515 | ||
| 
							 | 
						d37b0b4cd2 | ||
| 
							 | 
						1515e46d50 | ||
| 
							 | 
						437e486d6e | ||
| 
							 | 
						4ddb17c4b5 | ||
| 
							 | 
						e584cee066 | ||
| 
							 | 
						14b7b31bd9 | ||
| 
							 | 
						7da66f8a5f | ||
| 
							 | 
						fff8f63c0e | ||
| 
							 | 
						64b2792d61 | ||
| 
							 | 
						77b23c619e | ||
| 
							 | 
						4b3be9cc9b | ||
| 
							 | 
						b238c9d7a1 | ||
| 
							 | 
						dda60fb374 | ||
| 
							 | 
						367e756ebe | ||
| 
							 | 
						824354f38e | ||
| 
							 | 
						7e67daa292 | ||
| 
							 | 
						de54cfc475 | ||
| 
							 | 
						b8d5334462 | ||
| 
							 | 
						6fe1c6d67b | ||
| 
							 | 
						e0938303e6 | ||
| 
							 | 
						2625983a23 | ||
| 
							 | 
						923b8b48ec | ||
| 
							 | 
						7662a01f85 | ||
| 
							 | 
						4e0545aa04 | ||
| 
							 | 
						6f8a814f29 | ||
| 
							 | 
						a460842769 | ||
| 
							 | 
						e3a068de7d | ||
| 
							 | 
						3be88eacb8 | ||
| 
							 | 
						795e917716 | ||
| 
							 | 
						bcde5cbd8a | ||
| 
							 | 
						de2ab7cac9 | ||
| 
							 | 
						9b2b420cf5 | ||
| 
							 | 
						91806ff747 | ||
| 
							 | 
						33584dae1d | ||
| 
							 | 
						ada2146692 | ||
| 
							 | 
						a241495eaf | ||
| 
							 | 
						74035f0a34 | ||
| 
							 | 
						21e9fdf8ad | ||
| 
							 | 
						d329dac6ba | ||
| 
							 | 
						4ffa82b590 | ||
| 
							 | 
						4e421e0012 | ||
| 
							 | 
						f1ed12fc8d | ||
| 
							 | 
						f0e09ae363 | ||
| 
							 | 
						76619eaa1d | ||
| 
							 | 
						bd3a8b594f | ||
| 
							 | 
						4338189f76 | ||
| 
							 | 
						6c9ada270b | ||
| 
							 | 
						60981494d6 | ||
| 
							 | 
						1af1fc846c | ||
| 
							 | 
						48a32e4ced | ||
| 
							 | 
						6598938f12 | ||
| 
							 | 
						8e8306cad8 | ||
| 
							 | 
						b997ff8ac1 | ||
| 
							 | 
						bf3c7aa6e1 | ||
| 
							 | 
						ff08c28b62 | ||
| 
							 | 
						badd8691bd | ||
| 
							 | 
						d43fb09ea1 | ||
| 
							 | 
						a503244c10 | ||
| 
							 | 
						fd5bd5ca6e | ||
| 
							 | 
						4379cf446f | ||
| 
							 | 
						6620c6cde1 | ||
| 
							 | 
						9bc29b4b37 | ||
| 
							 | 
						4442ab007f | ||
| 
							 | 
						5c1d6fb5ad | ||
| 
							 | 
						6d51b4bb11 | ||
| 
							 | 
						bc890d3b83 | ||
| 
							 | 
						ef023916b9 | ||
| 
							 | 
						0e92ab9307 | ||
| 
							 | 
						90b95ae065 | ||
| 
							 | 
						be1fc5f3a6 | ||
| 
							 | 
						22951a9b87 | 
					 603 changed files with 36651 additions and 22352 deletions
				
			
		
							
								
								
									
										145
									
								
								.gitlab-ci.yml
									
										
									
									
									
								
							
							
						
						
									
										145
									
								
								.gitlab-ci.yml
									
										
									
									
									
								
							| 
						 | 
					@ -18,8 +18,8 @@ stages:
 | 
				
			||||||
variables:
 | 
					variables:
 | 
				
			||||||
  FDO_UPSTREAM_REPO: 'pipewire/pipewire'
 | 
					  FDO_UPSTREAM_REPO: 'pipewire/pipewire'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ci-templates as of Jan 27th 2022
 | 
					# ci-templates as of Mar 25th 2024
 | 
				
			||||||
.templates_sha: &templates_sha 0c312d9c7255f46e741d43bcd1930f09cd12efe7
 | 
					.templates_sha: &templates_sha ef5e4669b7500834a17ffe9277e15fbb6d977fff
 | 
				
			||||||
 | 
					
 | 
				
			||||||
include:
 | 
					include:
 | 
				
			||||||
  - project: 'freedesktop/ci-templates'
 | 
					  - project: 'freedesktop/ci-templates'
 | 
				
			||||||
| 
						 | 
					@ -31,12 +31,15 @@ include:
 | 
				
			||||||
  - project: 'freedesktop/ci-templates'
 | 
					  - project: 'freedesktop/ci-templates'
 | 
				
			||||||
    ref: *templates_sha
 | 
					    ref: *templates_sha
 | 
				
			||||||
    file: '/templates/alpine.yml'
 | 
					    file: '/templates/alpine.yml'
 | 
				
			||||||
 | 
					  - project: 'freedesktop/ci-templates'
 | 
				
			||||||
 | 
					    ref: *templates_sha
 | 
				
			||||||
 | 
					    file: '/templates/debian.yml'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.fedora:
 | 
					.fedora:
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    # Update this tag when you want to trigger a rebuild
 | 
					    # Update this tag when you want to trigger a rebuild
 | 
				
			||||||
    FDO_DISTRIBUTION_TAG: '2024-12-10.0'
 | 
					    FDO_DISTRIBUTION_TAG: '2025-10-22.0'
 | 
				
			||||||
    FDO_DISTRIBUTION_VERSION: '40'
 | 
					    FDO_DISTRIBUTION_VERSION: '42'
 | 
				
			||||||
    FDO_DISTRIBUTION_PACKAGES: >-
 | 
					    FDO_DISTRIBUTION_PACKAGES: >-
 | 
				
			||||||
      alsa-lib-devel
 | 
					      alsa-lib-devel
 | 
				
			||||||
      avahi-devel
 | 
					      avahi-devel
 | 
				
			||||||
| 
						 | 
					@ -45,6 +48,7 @@ include:
 | 
				
			||||||
      dbus-devel
 | 
					      dbus-devel
 | 
				
			||||||
      doxygen
 | 
					      doxygen
 | 
				
			||||||
      fdk-aac-free-devel
 | 
					      fdk-aac-free-devel
 | 
				
			||||||
 | 
					      file
 | 
				
			||||||
      findutils
 | 
					      findutils
 | 
				
			||||||
      gcc
 | 
					      gcc
 | 
				
			||||||
      gcc-c++
 | 
					      gcc-c++
 | 
				
			||||||
| 
						 | 
					@ -55,6 +59,7 @@ include:
 | 
				
			||||||
      gstreamer1-plugins-base-devel
 | 
					      gstreamer1-plugins-base-devel
 | 
				
			||||||
      jack-audio-connection-kit-devel
 | 
					      jack-audio-connection-kit-devel
 | 
				
			||||||
      libasan
 | 
					      libasan
 | 
				
			||||||
 | 
					      liblc3-devel
 | 
				
			||||||
      libcanberra-devel
 | 
					      libcanberra-devel
 | 
				
			||||||
      libebur128-devel
 | 
					      libebur128-devel
 | 
				
			||||||
      libffado-devel
 | 
					      libffado-devel
 | 
				
			||||||
| 
						 | 
					@ -64,7 +69,6 @@ include:
 | 
				
			||||||
      libubsan
 | 
					      libubsan
 | 
				
			||||||
      libusb1-devel
 | 
					      libusb1-devel
 | 
				
			||||||
      lilv-devel
 | 
					      lilv-devel
 | 
				
			||||||
      libv4l-devel
 | 
					 | 
				
			||||||
      libva-devel
 | 
					      libva-devel
 | 
				
			||||||
      libX11-devel
 | 
					      libX11-devel
 | 
				
			||||||
      ModemManager-devel
 | 
					      ModemManager-devel
 | 
				
			||||||
| 
						 | 
					@ -76,6 +80,7 @@ include:
 | 
				
			||||||
      sbc-devel
 | 
					      sbc-devel
 | 
				
			||||||
      ShellCheck
 | 
					      ShellCheck
 | 
				
			||||||
      SDL2-devel
 | 
					      SDL2-devel
 | 
				
			||||||
 | 
					      spandsp-devel
 | 
				
			||||||
      systemd-devel
 | 
					      systemd-devel
 | 
				
			||||||
      vulkan-loader-devel
 | 
					      vulkan-loader-devel
 | 
				
			||||||
      webrtc-audio-processing-devel
 | 
					      webrtc-audio-processing-devel
 | 
				
			||||||
| 
						 | 
					@ -87,6 +92,9 @@ include:
 | 
				
			||||||
      openal-soft
 | 
					      openal-soft
 | 
				
			||||||
      readline-devel
 | 
					      readline-devel
 | 
				
			||||||
      pandoc
 | 
					      pandoc
 | 
				
			||||||
 | 
					      fftw-libs-single
 | 
				
			||||||
 | 
					      fftw-devel
 | 
				
			||||||
 | 
					      onnxruntime-devel
 | 
				
			||||||
# Uncommenting the following two lines and disabling the meson entry above
 | 
					# Uncommenting the following two lines and disabling the meson entry above
 | 
				
			||||||
# will re-enable use of Meson via pip but please consider using a newer distro
 | 
					# will re-enable use of Meson via pip but please consider using a newer distro
 | 
				
			||||||
# image first or making the build system compatible instead! This is because
 | 
					# image first or making the build system compatible instead! This is because
 | 
				
			||||||
| 
						 | 
					@ -101,7 +109,7 @@ include:
 | 
				
			||||||
.ubuntu:
 | 
					.ubuntu:
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    # Update this tag when you want to trigger a rebuild
 | 
					    # Update this tag when you want to trigger a rebuild
 | 
				
			||||||
    FDO_DISTRIBUTION_TAG: '2024-01-12.0'
 | 
					    FDO_DISTRIBUTION_TAG: '2025-05-10.0'
 | 
				
			||||||
    FDO_DISTRIBUTION_VERSION: '22.04'
 | 
					    FDO_DISTRIBUTION_VERSION: '22.04'
 | 
				
			||||||
    FDO_DISTRIBUTION_PACKAGES: >-
 | 
					    FDO_DISTRIBUTION_PACKAGES: >-
 | 
				
			||||||
      debhelper-compat
 | 
					      debhelper-compat
 | 
				
			||||||
| 
						 | 
					@ -122,7 +130,6 @@ include:
 | 
				
			||||||
      libsnapd-glib-dev
 | 
					      libsnapd-glib-dev
 | 
				
			||||||
      libudev-dev
 | 
					      libudev-dev
 | 
				
			||||||
      libva-dev
 | 
					      libva-dev
 | 
				
			||||||
      libv4l-dev
 | 
					 | 
				
			||||||
      libx11-dev
 | 
					      libx11-dev
 | 
				
			||||||
      meson
 | 
					      meson
 | 
				
			||||||
      ninja-build
 | 
					      ninja-build
 | 
				
			||||||
| 
						 | 
					@ -138,10 +145,34 @@ include:
 | 
				
			||||||
#    FDO_DISTRIBUTION_EXEC: >-
 | 
					#    FDO_DISTRIBUTION_EXEC: >-
 | 
				
			||||||
#      pip3 install meson
 | 
					#      pip3 install meson
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.debian:
 | 
				
			||||||
 | 
					  variables:
 | 
				
			||||||
 | 
					     # Update this tag when you want to trigger a rebuild
 | 
				
			||||||
 | 
					    BASE_TAG: '2025-08-10.0'
 | 
				
			||||||
 | 
					    FDO_DISTRIBUTION_VERSION: 'trixie'
 | 
				
			||||||
 | 
					    FDO_DISTRIBUTION_PACKAGES: >-
 | 
				
			||||||
 | 
					      build-essential
 | 
				
			||||||
 | 
					      dpkg-dev
 | 
				
			||||||
 | 
					      findutils
 | 
				
			||||||
 | 
					      git
 | 
				
			||||||
 | 
					      meson
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.debian-archictectures:
 | 
				
			||||||
 | 
					  parallel:
 | 
				
			||||||
 | 
					    matrix:
 | 
				
			||||||
 | 
					      - ARCH:
 | 
				
			||||||
 | 
					        - amd64
 | 
				
			||||||
 | 
					        - arm64
 | 
				
			||||||
 | 
					        - armhf
 | 
				
			||||||
 | 
					        - i386
 | 
				
			||||||
 | 
					        - ppc64el
 | 
				
			||||||
 | 
					        - riscv64
 | 
				
			||||||
 | 
					        - s390x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.alpine:
 | 
					.alpine:
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    # Update this tag when you want to trigger a rebuild
 | 
					    # Update this tag when you want to trigger a rebuild
 | 
				
			||||||
    FDO_DISTRIBUTION_TAG: '2024-09-20.0'
 | 
					    FDO_DISTRIBUTION_TAG: '2025-03-25.0'
 | 
				
			||||||
    FDO_DISTRIBUTION_VERSION: '3.20'
 | 
					    FDO_DISTRIBUTION_VERSION: '3.20'
 | 
				
			||||||
    FDO_DISTRIBUTION_PACKAGES: >-
 | 
					    FDO_DISTRIBUTION_PACKAGES: >-
 | 
				
			||||||
      alsa-lib-dev
 | 
					      alsa-lib-dev
 | 
				
			||||||
| 
						 | 
					@ -210,7 +241,8 @@ include:
 | 
				
			||||||
    - echo "Building with meson options $MESON_OPTIONS"
 | 
					    - echo "Building with meson options $MESON_OPTIONS"
 | 
				
			||||||
    - meson setup "$BUILD_DIR" --prefix="$PREFIX" $MESON_OPTIONS
 | 
					    - meson setup "$BUILD_DIR" --prefix="$PREFIX" $MESON_OPTIONS
 | 
				
			||||||
    - meson compile -C "$BUILD_DIR" $COMPILE_ARGS
 | 
					    - meson compile -C "$BUILD_DIR" $COMPILE_ARGS
 | 
				
			||||||
    - meson test -C "$BUILD_DIR" --no-rebuild
 | 
					    - echo "Running tests with meson options $MESON_TEST_OPTIONS"
 | 
				
			||||||
 | 
					    - meson test -C "$BUILD_DIR" --no-rebuild $MESON_TEST_OPTIONS
 | 
				
			||||||
    - meson install -C "$BUILD_DIR" --no-rebuild
 | 
					    - meson install -C "$BUILD_DIR" --no-rebuild
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
    name: pipewire-$CI_COMMIT_SHA
 | 
					    name: pipewire-$CI_COMMIT_SHA
 | 
				
			||||||
| 
						 | 
					@ -226,6 +258,18 @@ container_ubuntu:
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
 | 
					    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					container_debian:
 | 
				
			||||||
 | 
					  extends:
 | 
				
			||||||
 | 
					    - .debian
 | 
				
			||||||
 | 
					    - .debian-archictectures
 | 
				
			||||||
 | 
					    - .fdo.container-build@debian
 | 
				
			||||||
 | 
					  stage: container
 | 
				
			||||||
 | 
					  variables:
 | 
				
			||||||
 | 
					    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
 | 
				
			||||||
 | 
					    FDO_DISTRIBUTION_TAG: "$BASE_TAG-$ARCH"
 | 
				
			||||||
 | 
					    FDO_DISTRIBUTION_EXEC: >-
 | 
				
			||||||
 | 
					      ./.gitlab/ci/setup-debian-cross-container.sh "$ARCH"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
container_fedora:
 | 
					container_fedora:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
    - .fedora
 | 
					    - .fedora
 | 
				
			||||||
| 
						 | 
					@ -258,9 +302,54 @@ build_on_ubuntu:
 | 
				
			||||||
    - .fdo.distribution-image@ubuntu
 | 
					    - .fdo.distribution-image@ubuntu
 | 
				
			||||||
    - .build
 | 
					    - .build
 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
 | 
					  needs:
 | 
				
			||||||
 | 
					    - job: container_ubuntu
 | 
				
			||||||
 | 
					      artifacts: false
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    MESON_OPTIONS: "-Dsession-managers=[] -Dsnap=enabled"
 | 
					    MESON_OPTIONS: "-Dsession-managers=[] -Dsnap=enabled"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					build_on_debian:
 | 
				
			||||||
 | 
					  extends:
 | 
				
			||||||
 | 
					    - .debian
 | 
				
			||||||
 | 
					    - .debian-archictectures
 | 
				
			||||||
 | 
					    - .not_coverity
 | 
				
			||||||
 | 
					    - .fdo.distribution-image@debian
 | 
				
			||||||
 | 
					    - .build
 | 
				
			||||||
 | 
					  stage: build
 | 
				
			||||||
 | 
					  needs:
 | 
				
			||||||
 | 
					    - job: container_debian
 | 
				
			||||||
 | 
					      artifacts: false
 | 
				
			||||||
 | 
					      # ideally
 | 
				
			||||||
 | 
					      # parallel:
 | 
				
			||||||
 | 
					      #   matrix:
 | 
				
			||||||
 | 
					      #     - ARCH: "$ARCH"
 | 
				
			||||||
 | 
					      # however https://gitlab.com/gitlab-org/gitlab/-/issues/423553
 | 
				
			||||||
 | 
					      #         ("Expand variables in `needs:parallel:matrix`")
 | 
				
			||||||
 | 
					  variables:
 | 
				
			||||||
 | 
					    FDO_DISTRIBUTION_TAG: "$BASE_TAG-$ARCH"
 | 
				
			||||||
 | 
					    # see /.gitlab/ci/setup-debian-cross-container.sh for installed packages
 | 
				
			||||||
 | 
					    MESON_OPTIONS: >-
 | 
				
			||||||
 | 
					      --cross-file /opt/meson-$ARCH.cross
 | 
				
			||||||
 | 
					      -D c_args=['-UFASTPATH']
 | 
				
			||||||
 | 
					      -D cpp_args=['-UFASTPATH']
 | 
				
			||||||
 | 
					      -D auto_features=enabled
 | 
				
			||||||
 | 
					      -D session-managers=[]
 | 
				
			||||||
 | 
					      -D bluez5-backend-native-mm=enabled
 | 
				
			||||||
 | 
					      -D bluez5-codec-lc3plus=disabled
 | 
				
			||||||
 | 
					      -D bluez5-codec-ldac=disabled
 | 
				
			||||||
 | 
					      -D bluez5-codec-ldac-dec=disabled
 | 
				
			||||||
 | 
					      -D libcamera=disabled
 | 
				
			||||||
 | 
					      -D roc=disabled
 | 
				
			||||||
 | 
					      -D snap=disabled
 | 
				
			||||||
 | 
					      -D systemd-user-service=disabled
 | 
				
			||||||
 | 
					      -D systemd-system-service=disabled
 | 
				
			||||||
 | 
					      -D onnxruntime=disabled
 | 
				
			||||||
 | 
					      -D vulkan=enabled
 | 
				
			||||||
 | 
					      -D ffmpeg=enabled
 | 
				
			||||||
 | 
					      -D pw-cat-ffmpeg=enabled
 | 
				
			||||||
 | 
					    MESON_TEST_OPTIONS: >-
 | 
				
			||||||
 | 
					      --timeout-multiplier=2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.build_on_fedora:
 | 
					.build_on_fedora:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
    - .fedora
 | 
					    - .fedora
 | 
				
			||||||
| 
						 | 
					@ -268,6 +357,9 @@ build_on_ubuntu:
 | 
				
			||||||
    - .fdo.distribution-image@fedora
 | 
					    - .fdo.distribution-image@fedora
 | 
				
			||||||
    - .build
 | 
					    - .build
 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
 | 
					  needs:
 | 
				
			||||||
 | 
					    - job: container_fedora
 | 
				
			||||||
 | 
					      artifacts: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_on_fedora:
 | 
					build_on_fedora:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
| 
						 | 
					@ -318,11 +410,13 @@ build_on_fedora_html_docs:
 | 
				
			||||||
        -Dsndfile=enabled
 | 
					        -Dsndfile=enabled
 | 
				
			||||||
        -Dsession-managers=[]
 | 
					        -Dsession-managers=[]
 | 
				
			||||||
  before_script:
 | 
					  before_script:
 | 
				
			||||||
    - git fetch origin 1.0 1.2 master
 | 
					    - git fetch origin 1.0 1.2 1.4 master
 | 
				
			||||||
    - git branch -f 1.0 origin/1.0
 | 
					    - git branch -f 1.0 origin/1.0
 | 
				
			||||||
    - git clone -b 1.0 . branch-1.0
 | 
					    - git clone -b 1.0 . branch-1.0
 | 
				
			||||||
    - git branch -f 1.2 origin/1.2
 | 
					    - git branch -f 1.2 origin/1.2
 | 
				
			||||||
    - git clone -b 1.2 . branch-1.2
 | 
					    - git clone -b 1.2 . branch-1.2
 | 
				
			||||||
 | 
					    - git branch -f 1.4 origin/1.4
 | 
				
			||||||
 | 
					    - git clone -b 1.4 . branch-1.4
 | 
				
			||||||
    - git branch -f master origin/master
 | 
					    - git branch -f master origin/master
 | 
				
			||||||
    - git clone -b master . branch-master
 | 
					    - git clone -b master . branch-master
 | 
				
			||||||
    - !reference [.build, before_script]
 | 
					    - !reference [.build, before_script]
 | 
				
			||||||
| 
						 | 
					@ -335,6 +429,10 @@ build_on_fedora_html_docs:
 | 
				
			||||||
    - meson setup builddir $MESON_OPTIONS
 | 
					    - meson setup builddir $MESON_OPTIONS
 | 
				
			||||||
    - meson compile -C builddir doc/pipewire-docs
 | 
					    - meson compile -C builddir doc/pipewire-docs
 | 
				
			||||||
    - cd ..
 | 
					    - cd ..
 | 
				
			||||||
 | 
					    - cd branch-1.4
 | 
				
			||||||
 | 
					    - meson setup builddir $MESON_OPTIONS
 | 
				
			||||||
 | 
					    - meson compile -C builddir doc/pipewire-docs
 | 
				
			||||||
 | 
					    - cd ..
 | 
				
			||||||
    - cd branch-master
 | 
					    - cd branch-master
 | 
				
			||||||
    - meson setup builddir $MESON_OPTIONS
 | 
					    - meson setup builddir $MESON_OPTIONS
 | 
				
			||||||
    - meson compile -C builddir doc/pipewire-docs
 | 
					    - meson compile -C builddir doc/pipewire-docs
 | 
				
			||||||
| 
						 | 
					@ -354,6 +452,9 @@ build_on_alpine:
 | 
				
			||||||
    - .fdo.distribution-image@alpine
 | 
					    - .fdo.distribution-image@alpine
 | 
				
			||||||
    - .build
 | 
					    - .build
 | 
				
			||||||
  stage: build
 | 
					  stage: build
 | 
				
			||||||
 | 
					  needs:
 | 
				
			||||||
 | 
					    - job: container_alpine
 | 
				
			||||||
 | 
					      artifacts: false
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    MESON_OPTIONS: "-Dsession-managers=[] -Dsnap=disabled -Dlogind=enabled -Dlogind-provider=libelogind"
 | 
					    MESON_OPTIONS: "-Dsession-managers=[] -Dsnap=disabled -Dlogind=enabled -Dlogind-provider=libelogind"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -362,13 +463,13 @@ build_all:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
    - .build_on_fedora
 | 
					    - .build_on_fedora
 | 
				
			||||||
  variables:
 | 
					  variables:
 | 
				
			||||||
    # Fedora doesn't have libfreeaptx, lc3plus, lc3, or roc
 | 
					    # Fedora doesn't have libfreeaptx, lc3plus, or roc
 | 
				
			||||||
    # libcamera has no stable API, so let's not chase that target
 | 
					    # libcamera has no stable API, so let's not chase that target
 | 
				
			||||||
    MESON_OPTIONS: >-
 | 
					    MESON_OPTIONS: >-
 | 
				
			||||||
        -Dauto_features=enabled
 | 
					        -Dauto_features=enabled
 | 
				
			||||||
        -Dbluez5-codec-aptx=disabled
 | 
					        -Dbluez5-codec-aptx=disabled
 | 
				
			||||||
        -Dbluez5-codec-lc3plus=disabled
 | 
					        -Dbluez5-codec-lc3plus=disabled
 | 
				
			||||||
        -Dbluez5-codec-lc3=disabled
 | 
					        -Dbluez5-codec-ldac-dec=disabled
 | 
				
			||||||
        -Droc=disabled
 | 
					        -Droc=disabled
 | 
				
			||||||
        -Dlibcamera=disabled
 | 
					        -Dlibcamera=disabled
 | 
				
			||||||
        -Dsession-managers=[]
 | 
					        -Dsession-managers=[]
 | 
				
			||||||
| 
						 | 
					@ -488,6 +589,9 @@ build_with_coverity:
 | 
				
			||||||
    - .fdo.suffixed-image@fedora
 | 
					    - .fdo.suffixed-image@fedora
 | 
				
			||||||
    - .build
 | 
					    - .build
 | 
				
			||||||
  stage: analysis
 | 
					  stage: analysis
 | 
				
			||||||
 | 
					  needs:
 | 
				
			||||||
 | 
					    - job: container_coverity
 | 
				
			||||||
 | 
					      artifacts: false
 | 
				
			||||||
  script:
 | 
					  script:
 | 
				
			||||||
    - export PATH=/opt/coverity/bin:$PATH
 | 
					    - export PATH=/opt/coverity/bin:$PATH
 | 
				
			||||||
    - meson setup "$BUILD_DIR" --prefix="$PREFIX"
 | 
					    - meson setup "$BUILD_DIR" --prefix="$PREFIX"
 | 
				
			||||||
| 
						 | 
					@ -563,8 +667,9 @@ check_missing_headers:
 | 
				
			||||||
    - .not_coverity
 | 
					    - .not_coverity
 | 
				
			||||||
    - .fdo.distribution-image@fedora
 | 
					    - .fdo.distribution-image@fedora
 | 
				
			||||||
  stage: analysis
 | 
					  stage: analysis
 | 
				
			||||||
  dependencies:
 | 
					  needs:
 | 
				
			||||||
    - build_on_fedora
 | 
					    - job: build_on_fedora
 | 
				
			||||||
 | 
					      artifacts: true
 | 
				
			||||||
  script:
 | 
					  script:
 | 
				
			||||||
    - export PREFIX=`find -name prefix-*`
 | 
					    - export PREFIX=`find -name prefix-*`
 | 
				
			||||||
    - ./.gitlab/ci/check_missing_headers.sh
 | 
					    - ./.gitlab/ci/check_missing_headers.sh
 | 
				
			||||||
| 
						 | 
					@ -573,18 +678,18 @@ pages:
 | 
				
			||||||
  extends:
 | 
					  extends:
 | 
				
			||||||
    - .not_coverity
 | 
					    - .not_coverity
 | 
				
			||||||
  stage: pages
 | 
					  stage: pages
 | 
				
			||||||
  dependencies:
 | 
					  needs:
 | 
				
			||||||
    - build_on_fedora_html_docs
 | 
					    - job: build_on_fedora_html_docs
 | 
				
			||||||
 | 
					      artifacts: true
 | 
				
			||||||
  script:
 | 
					  script:
 | 
				
			||||||
    - mkdir public public/1.0 public/1.2 public/devel
 | 
					    - mkdir public public/1.0 public/1.2 public/1.4 public/devel
 | 
				
			||||||
    - cp -R branch-1.0/builddir/doc/html/* public/1.0/
 | 
					    - cp -R branch-1.0/builddir/doc/html/* public/1.0/
 | 
				
			||||||
    - cp -R branch-1.2/builddir/doc/html/* public/1.2/
 | 
					    - cp -R branch-1.2/builddir/doc/html/* public/1.2/
 | 
				
			||||||
 | 
					    - cp -R branch-1.4/builddir/doc/html/* public/1.4/
 | 
				
			||||||
    - cp -R branch-master/builddir/doc/html/* public/devel/
 | 
					    - cp -R branch-master/builddir/doc/html/* public/devel/
 | 
				
			||||||
    - (cd public && ln -s 1.2/* .)
 | 
					    - (cd public && ln -s 1.4/* .)
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
    paths:
 | 
					    paths:
 | 
				
			||||||
      - public
 | 
					      - public
 | 
				
			||||||
  rules:
 | 
					  rules:
 | 
				
			||||||
    - if: $CI_COMMIT_BRANCH == 'master'
 | 
					    - if: $CI_COMMIT_BRANCH == 'master'
 | 
				
			||||||
    - if: $CI_COMMIT_BRANCH == '1.0'
 | 
					 | 
				
			||||||
    - if: $CI_COMMIT_BRANCH == '1.2'
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										63
									
								
								.gitlab/ci/setup-debian-cross-container.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								.gitlab/ci/setup-debian-cross-container.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -ex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					packages=(
 | 
				
			||||||
 | 
						# libapparmor-dev
 | 
				
			||||||
 | 
						libasound2-dev
 | 
				
			||||||
 | 
						libavahi-client-dev
 | 
				
			||||||
 | 
						libavcodec-dev
 | 
				
			||||||
 | 
						libavfilter-dev
 | 
				
			||||||
 | 
						libavformat-dev
 | 
				
			||||||
 | 
						libbluetooth-dev
 | 
				
			||||||
 | 
						libcanberra-dev
 | 
				
			||||||
 | 
						libdbus-1-dev
 | 
				
			||||||
 | 
						libebur128-dev
 | 
				
			||||||
 | 
						libfdk-aac-dev
 | 
				
			||||||
 | 
						libffado-dev
 | 
				
			||||||
 | 
						libfftw3-dev
 | 
				
			||||||
 | 
						libfreeaptx-dev
 | 
				
			||||||
 | 
						libglib2.0-dev
 | 
				
			||||||
 | 
						libgstreamer1.0-dev
 | 
				
			||||||
 | 
						libgstreamer-plugins-base1.0-dev
 | 
				
			||||||
 | 
						libjack-jackd2-dev
 | 
				
			||||||
 | 
						liblc3-dev
 | 
				
			||||||
 | 
						liblilv-dev
 | 
				
			||||||
 | 
						libmysofa-dev
 | 
				
			||||||
 | 
						libopus-dev
 | 
				
			||||||
 | 
						libpulse-dev
 | 
				
			||||||
 | 
						libreadline-dev
 | 
				
			||||||
 | 
						libsbc-dev
 | 
				
			||||||
 | 
						libsdl2-dev
 | 
				
			||||||
 | 
						# libsnapd-glib-dev
 | 
				
			||||||
 | 
						libsndfile1-dev
 | 
				
			||||||
 | 
						libspandsp-dev
 | 
				
			||||||
 | 
						libssl-dev
 | 
				
			||||||
 | 
						libsystemd-dev
 | 
				
			||||||
 | 
						libudev-dev
 | 
				
			||||||
 | 
						libusb-1.0-0-dev
 | 
				
			||||||
 | 
						libvulkan-dev
 | 
				
			||||||
 | 
						libwebrtc-audio-processing-dev
 | 
				
			||||||
 | 
						libx11-dev
 | 
				
			||||||
 | 
						modemmanager-dev
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					arch="$1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export DEBIAN_FRONTEND=noninteractive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sed -i \
 | 
				
			||||||
 | 
						's/^Components:.*$/Components: main contrib non-free non-free-firmware/' \
 | 
				
			||||||
 | 
						/etc/apt/sources.list.d/debian.sources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dpkg --add-architecture "$arch"
 | 
				
			||||||
 | 
					apt update -y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pkgs=( "crossbuild-essential-$arch" )
 | 
				
			||||||
 | 
					for pkg in "${packages[@]}"; do
 | 
				
			||||||
 | 
						pkgs+=( "$pkg:$arch" )
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					apt install -y "${pkgs[@]}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					meson env2mfile --cross --debarch "$arch" -o "/opt/meson-$arch.cross"
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ run: all
 | 
				
			||||||
	PIPEWIRE_CONFIG_DIR=$(BUILD_ROOT)/src/daemon \
 | 
						PIPEWIRE_CONFIG_DIR=$(BUILD_ROOT)/src/daemon \
 | 
				
			||||||
	ACP_PATHS_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/paths \
 | 
						ACP_PATHS_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/paths \
 | 
				
			||||||
	ACP_PROFILES_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/profile-sets \
 | 
						ACP_PROFILES_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/profile-sets \
 | 
				
			||||||
 | 
						PIPEWIRE_LOG_SYSTEMD=false \
 | 
				
			||||||
	$(DBG) $(BUILD_ROOT)/src/daemon/pipewire-uninstalled
 | 
						$(DBG) $(BUILD_ROOT)/src/daemon/pipewire-uninstalled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run-pulse: all
 | 
					run-pulse: all
 | 
				
			||||||
| 
						 | 
					@ -32,6 +33,7 @@ run-pulse: all
 | 
				
			||||||
	PIPEWIRE_CONFIG_DIR=$(BUILD_ROOT)/src/daemon \
 | 
						PIPEWIRE_CONFIG_DIR=$(BUILD_ROOT)/src/daemon \
 | 
				
			||||||
	ACP_PATHS_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/paths \
 | 
						ACP_PATHS_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/paths \
 | 
				
			||||||
	ACP_PROFILES_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/profile-sets \
 | 
						ACP_PROFILES_DIR=$(SOURCE_ROOT)/spa/plugins/alsa/mixer/profile-sets \
 | 
				
			||||||
 | 
						PIPEWIRE_LOG_SYSTEMD=false \
 | 
				
			||||||
	$(DBG) $(BUILD_ROOT)/src/daemon/pipewire-pulse
 | 
						$(DBG) $(BUILD_ROOT)/src/daemon/pipewire-pulse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gdb:
 | 
					gdb:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										310
									
								
								NEWS
									
										
									
									
									
								
							
							
						
						
									
										310
									
								
								NEWS
									
										
									
									
									
								
							| 
						 | 
					@ -1,136 +1,204 @@
 | 
				
			||||||
# PipeWire 1.4.4 (2025-05-29)
 | 
					# PipeWire 1.5.81 (2025-10-16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a quick bugfix release that is API and ABI compatible with
 | 
					This is the first 1.6 release candidate that is API and ABI
 | 
				
			||||||
previous 1.x releases.
 | 
					compatible with previous 1.4.x, 1.2.x and 1.0.x releases.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In addition to all the changes backported to 1.4.x, this release
 | 
				
			||||||
 | 
					also contains some new features:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Highlights
 | 
					## Highlights
 | 
				
			||||||
  - Provide better compatibility with 1.2 for MIDI.
 | 
					  - The link negotiation code was refactored and improved.
 | 
				
			||||||
  - Fix mpv buffer negotiation regression.
 | 
					    Applications now have more options for selecting the default
 | 
				
			||||||
  - Improve GStreamer compatibility with libcamera.
 | 
					    values and restricting the available options. The default
 | 
				
			||||||
 | 
					    negotiation code will now attempt to better match the application
 | 
				
			||||||
 | 
					    suggested values.
 | 
				
			||||||
 | 
					  - The loop now has support for locking with priority inversion. Most
 | 
				
			||||||
 | 
					    of the code was updated to use the locks instead of invoke to
 | 
				
			||||||
 | 
					    get proper concurrent updates with the loop. The Thread loop
 | 
				
			||||||
 | 
					    functionality of locks, signal and wait was moved to the SPA loop.
 | 
				
			||||||
 | 
					    This guarantees better real-time behaviour because inter-thread
 | 
				
			||||||
 | 
					    synchronization does not have to pass eventfd/epoll.
 | 
				
			||||||
 | 
					  - The control stream parser was rewritten to be safe against concurrent
 | 
				
			||||||
 | 
					    updates while parsing, which can occur when parsing shared memory.
 | 
				
			||||||
 | 
					    It also has extra checks to avoid integer overflows and undefined
 | 
				
			||||||
 | 
					    behaviour.
 | 
				
			||||||
 | 
					  - MIDI 2.0 clip support was added to the tools.
 | 
				
			||||||
 | 
					  - Bluetooth ASHA (Audio Streaming for Hearing Aid) support was added.
 | 
				
			||||||
 | 
					  - The ALSA node setup was tweaked to provide low latency with the ALSA
 | 
				
			||||||
 | 
					    Firewire driver.
 | 
				
			||||||
 | 
					  - Better support for explicit sync. It is now possible to negotiate
 | 
				
			||||||
 | 
					    extra features to know if a consumer will signal the sync objects and
 | 
				
			||||||
 | 
					    implement a fallback using a reliable transport.
 | 
				
			||||||
 | 
					  - Many bug fixes and improvements.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## PipeWire
 | 
				
			||||||
 | 
					  - Avoid process calls in disconnect in pw-stream. (#3314)
 | 
				
			||||||
 | 
					  - Disable PipeWire services for root.
 | 
				
			||||||
 | 
					  - The link negotiation was refactored and improved. Drivers now
 | 
				
			||||||
 | 
					    always have a lower priority in deciding the final format.
 | 
				
			||||||
 | 
					  - Backwards compatibility with the v0 protocol was removed.
 | 
				
			||||||
 | 
					  - pw-stream and pw-filter will now refuse to queue a buffer that
 | 
				
			||||||
 | 
					    was not dequeued before.
 | 
				
			||||||
 | 
					  - Object properties will now be updated on the global as well.
 | 
				
			||||||
 | 
					  - The priority of config overrides is correct now. (#4816)
 | 
				
			||||||
 | 
					  - Async links now correctly report 1 extra quantum of latency.
 | 
				
			||||||
 | 
					  - node.exclusive and the new port.exclusive flag are now enforced
 | 
				
			||||||
 | 
					    by PipeWire itself.
 | 
				
			||||||
 | 
					  - A new timer-queue helper was added to schedule timeouts.
 | 
				
			||||||
 | 
					  - node.terminal and node.physical properties are now copied to the
 | 
				
			||||||
 | 
					    ports to make it possible to create virtual sources and sinks
 | 
				
			||||||
 | 
					    for JACK applications.
 | 
				
			||||||
 | 
					  - Port properties will now be dynamically updated when the node
 | 
				
			||||||
 | 
					    properties they depend on are updated.
 | 
				
			||||||
 | 
					  - Passive leaf nodes are now handled better. Now they will also
 | 
				
			||||||
 | 
					    run when the peer is active. (#4915)
 | 
				
			||||||
 | 
					  - Reliable transport has been added for output ports. This can be
 | 
				
			||||||
 | 
					    used in some cases if the producer wants to ensure buffers are
 | 
				
			||||||
 | 
					    consumed by a consumer. (#4885)
 | 
				
			||||||
 | 
					  - Context properties now support rlimit.<resource> properties to
 | 
				
			||||||
 | 
					    configure rlimits. (#4047)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Modules
 | 
				
			||||||
 | 
					  - Close SyncObj fds.
 | 
				
			||||||
 | 
					  - module-combine-stream has better Latency reporting.
 | 
				
			||||||
 | 
					  - The JACK tunnel can now optionally connect ports.
 | 
				
			||||||
 | 
					  - module-loopback has better Latency reporting.
 | 
				
			||||||
 | 
					  - A Dolby Surround and Dolby Pro Logic II example filter config 
 | 
				
			||||||
 | 
					    was added.
 | 
				
			||||||
 | 
					  - Filter-chain can now resample to a specific rate before running the
 | 
				
			||||||
 | 
					    filters. This is useful when the filter-graph needs to run at a
 | 
				
			||||||
 | 
					    specific rate.
 | 
				
			||||||
 | 
					  - Avahi-poll now uses the timer-queue to schedule timeouts.
 | 
				
			||||||
 | 
					  - Modules are ported to timer-queue instead of using timerfd directly
 | 
				
			||||||
 | 
					    for non-realtime timers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## SPA
 | 
					## SPA
 | 
				
			||||||
  - Provide conversions to old style midi in the ALSA sequencer.
 | 
					  - The loop now has support for locking with priority inversion. Most
 | 
				
			||||||
  - Negotiate only to UMP when using a newer library.
 | 
					    of the code was updated to use the locks instead of invoke to
 | 
				
			||||||
  - Fix negotiation direction for buffers, prefer the converter
 | 
					    get proper concurrent updates with the loop. The Thread loop
 | 
				
			||||||
    suggestion instead of the application until we can be sure
 | 
					    functionality of locks, signal and wait was moved to the SPA loop.
 | 
				
			||||||
    applications make good suggestions.
 | 
					  - UMP to Midi 1.0 conversion was improved, some UMP events are now
 | 
				
			||||||
 | 
					    converted to multiple Midi 1.0 messages. (#4839)
 | 
				
			||||||
 | 
					  - The POD filter was refactored and improved. It is now possible to
 | 
				
			||||||
 | 
					    use the default value of the output by specifying an invalid input
 | 
				
			||||||
 | 
					    default value.
 | 
				
			||||||
 | 
					  - The POD parser was made safe for concurrent updates of the memory
 | 
				
			||||||
 | 
					    it is parsing. This is important when the POD is in shared memory
 | 
				
			||||||
 | 
					    and the parser should not access invalid memory.
 | 
				
			||||||
 | 
					  - Some hardcoded channel limits were removed and now use the global
 | 
				
			||||||
 | 
					    channel limit. More things can dynamically adapt to this global
 | 
				
			||||||
 | 
					    limit. The max number of channels was then bumped to 128.
 | 
				
			||||||
 | 
					  - The POD builder is safe to use on shared memory now and tries to
 | 
				
			||||||
 | 
					    avoid many integer overflows.
 | 
				
			||||||
 | 
					  - Most debug functions are safe to be used on shared memory.
 | 
				
			||||||
 | 
					  - User specified Commands and Events are now possible.
 | 
				
			||||||
 | 
					  - The SPA_IO_CLOCK_FLAG_DISCONT was added to spa_io_clock to signal
 | 
				
			||||||
 | 
					    a discont in the clock due to clock change.
 | 
				
			||||||
 | 
					  - AC3, DTS, EAC3, TRUEHD and MPEGH now have helper parser functions.
 | 
				
			||||||
 | 
					  - H265 was added as a video format. (#4674)
 | 
				
			||||||
 | 
					  - SPA_PARAM_PeerFormats was added to let a port know about its peer
 | 
				
			||||||
 | 
					    formats in order to better filter possible conversions.
 | 
				
			||||||
 | 
					  - More color matrices, transfer functions and color primaries.
 | 
				
			||||||
 | 
					  - The echo-canceler is enabled now.
 | 
				
			||||||
 | 
					  - Pro-Audio mode now uses 3 periods by default. This lowers the
 | 
				
			||||||
 | 
					    latency on some drivers (Firewire). The latency of Firewire is
 | 
				
			||||||
 | 
					    also reported correctly now.
 | 
				
			||||||
 | 
					  - The ALSA DLL bandwidth is configurable now.
 | 
				
			||||||
 | 
					  - The resampler now uses fixed point for the phases and is a little
 | 
				
			||||||
 | 
					    faster when updating adaptive rates.
 | 
				
			||||||
 | 
					  - The convolver is a little faster by swapping buffers instead of
 | 
				
			||||||
 | 
					    copying samples.
 | 
				
			||||||
 | 
					  - Latency and ProcessLatency support was added to filter-graph.
 | 
				
			||||||
 | 
					    (#4678)
 | 
				
			||||||
 | 
					  - Audio channel position support was added to filter-graph.
 | 
				
			||||||
 | 
					  - A new ffmpeg avfilter plugin was added to filter-graph.
 | 
				
			||||||
 | 
					  - A new ONNX filter was added to filter-graph.
 | 
				
			||||||
 | 
					  - A debug, pipe, zeroramp and noisegate filter was added to the
 | 
				
			||||||
 | 
					    filter-graph. (#4745)
 | 
				
			||||||
 | 
					  - The filter-graph lv2 plugin now supports options and state.
 | 
				
			||||||
 | 
					  - videoconvert was greatly improved.
 | 
				
			||||||
 | 
					  - The v4l2 plugin can negotiate DMABUF with modifiers.
 | 
				
			||||||
 | 
					  - Colorimetry information was added to v4l2 and libcamera.
 | 
				
			||||||
 | 
					  - Audioconvert can handle empty buffers more efficiently.
 | 
				
			||||||
 | 
					  - Improve the POD compare functions for Rectangle.
 | 
				
			||||||
 | 
					  - There is now a SPA_POD_PROP_FLAG_DROP flag to drop the property when
 | 
				
			||||||
 | 
					    the property is missing from one side.
 | 
				
			||||||
 | 
					  - A new FEATURE choice was added that is basically a flags choice with
 | 
				
			||||||
 | 
					    a FLAG_DROP property.
 | 
				
			||||||
 | 
					  - Metadata features were added. This is a way to negotiate new features
 | 
				
			||||||
 | 
					    for the metadata. (#4885)
 | 
				
			||||||
 | 
					  - DSD playback with pw-cat has been improved.
 | 
				
			||||||
 | 
					  - Compatibility and xrun prevention for the SOF driver has been
 | 
				
			||||||
 | 
					    improved. (#4489)
 | 
				
			||||||
 | 
					  - The filter-graph max plugin can now have 8 input channels.
 | 
				
			||||||
 | 
					  - Buffer Negotiation between the mixer port and the node ports is much
 | 
				
			||||||
 | 
					    improved. (#4918)
 | 
				
			||||||
 | 
					  - An offline AEC benchmark was added.
 | 
				
			||||||
 | 
					  - Channel positions are now read from HDMI ELD when possible.
 | 
				
			||||||
 | 
					  - Audioconvert and filter-graph now also support properties of Long
 | 
				
			||||||
 | 
					    and String types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## ACP
 | 
				
			||||||
 | 
					  - It's possible to disable the pro-audio profile.
 | 
				
			||||||
 | 
					  - Support for Logitech Z407 PC Speakers was improved.
 | 
				
			||||||
 | 
					  - Support for Razer BlackShark v3.
 | 
				
			||||||
 | 
					  - Fix volume rounding down causing mute. (#4890)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Tools
 | 
				
			||||||
 | 
					  - pw-cat can now play and record MIDI 2.0 Clips, which is the
 | 
				
			||||||
 | 
					    official format for storing MIDI 2.0 UMP data. pw-midi2play
 | 
				
			||||||
 | 
					    and pw-midi2record were added as aliases.
 | 
				
			||||||
 | 
					  - pw-cat can now upload sysex files. The pw-sysex alias was
 | 
				
			||||||
 | 
					    added for this.
 | 
				
			||||||
 | 
					  - The pw-link tool now has a -t option to list port latencies.
 | 
				
			||||||
 | 
					    It also has better monitor support.
 | 
				
			||||||
 | 
					  - pw-top can now clear the ERR column with the c key.
 | 
				
			||||||
 | 
					  - pw-cli now keeps the types of the variables it stores and avoid
 | 
				
			||||||
 | 
					    using wrongly typed variables that can crash things. It can now
 | 
				
			||||||
 | 
					    also list the available variables.
 | 
				
			||||||
 | 
					  - pw-dump can now output raw JSON and SPA JSON.
 | 
				
			||||||
 | 
					  - pw-dump has configurable indentation level.
 | 
				
			||||||
 | 
					  - pw-mididump can be forced to output MIDI 1.0 messages.
 | 
				
			||||||
 | 
					  - pw-profiler now uses doubles for extra precision.
 | 
				
			||||||
 | 
					  - pw-top now marks the async nodes with =.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Bluetooth
 | 
				
			||||||
 | 
					  - Telephony improvements.
 | 
				
			||||||
 | 
					  - ASHA support was added.
 | 
				
			||||||
 | 
					  - Packet loss concealment was added.
 | 
				
			||||||
 | 
					  - Improved synchronisation between LE Audio streams in the same group.
 | 
				
			||||||
 | 
					  - Improved LE Audio device compatibility.
 | 
				
			||||||
 | 
					  - LC3-24kHz voice codec was added (used by Airpods)
 | 
				
			||||||
 | 
					  - LDAC decoding support added (requires separate decoder library)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Pulse-server
 | 
				
			||||||
 | 
					  - The SUSPEND event is now correctly generated. fail-on-suspend is
 | 
				
			||||||
 | 
					    now implemented.
 | 
				
			||||||
 | 
					  - PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND is now implemented. (#4255)
 | 
				
			||||||
 | 
					    (#4726)
 | 
				
			||||||
 | 
					  - RTP streams now have stream.properties for extra configuration.
 | 
				
			||||||
 | 
					  - Timed out streams are now destroyed instead of lingering. (#4901)
 | 
				
			||||||
 | 
					  - A new help and pipewire-pulse:list-modules core message was added.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## JACK
 | 
				
			||||||
 | 
					  - Port rename callbacks are now emitted correctly.
 | 
				
			||||||
 | 
					  - Use safe POD parsing for the control sequences.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## V4l2
 | 
				
			||||||
 | 
					  - The wrapper now avoids a race while initializing PipeWire. (#4859)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## GStreamer
 | 
					## GStreamer
 | 
				
			||||||
  - Allow a minimum of 1 buffers again instead of 8. libcamera will
 | 
					  - Colorimetry support was added.
 | 
				
			||||||
    allocate only 4 buffers so we need to support this.
 | 
					  - Cursor metadata is now exposed as ROI metadata.
 | 
				
			||||||
 | 
					  - Many more updates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Docs
 | 
				
			||||||
 | 
					  - Document the client-node flow a bit more.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Older versions:
 | 
					Older versions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PipeWire 1.4.3 (2025-05-22)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This is a bugfix release that is API and ABI compatible with
 | 
					 | 
				
			||||||
previous 1.x releases.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Highlights
 | 
					 | 
				
			||||||
  - Many netjack2 improvements. The driver/manager roles were fixed,
 | 
					 | 
				
			||||||
    MIDI is written correctly and errors are handled better.
 | 
					 | 
				
			||||||
  - Improvements to UMP sysex handling.
 | 
					 | 
				
			||||||
  - More small bug fixes and improvements.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## PipeWire
 | 
					 | 
				
			||||||
  - Let all commands go to the node. This makes it possible to send
 | 
					 | 
				
			||||||
    custom commands.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Modules
 | 
					 | 
				
			||||||
  - Many netjack2 improvements. The driver/manager roles were fixed,
 | 
					 | 
				
			||||||
    MIDI is written correctly and errors are handled better.
 | 
					 | 
				
			||||||
  - Improve the filter-graph state management in filter-chain.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## SPA
 | 
					 | 
				
			||||||
  - Use default value of filter. (#4619)
 | 
					 | 
				
			||||||
  - Fix UMP program change conversion to MIDI 1.0. (#4664)
 | 
					 | 
				
			||||||
  - Skip only the first buffer for raw formats in v4l2 to avoid
 | 
					 | 
				
			||||||
    dropping important headers when dealing with encoded formats.
 | 
					 | 
				
			||||||
  - Fix ebur128 port name. (#4667)
 | 
					 | 
				
			||||||
  - Only convert UMP/MIDI, pass other controls. Fixes OSC and other
 | 
					 | 
				
			||||||
    control types in the mixer. (#4692)
 | 
					 | 
				
			||||||
  - Improve UMP sysex handling in alsa seq.
 | 
					 | 
				
			||||||
  - Improve ALSA audio.channels support. Only use this when the value
 | 
					 | 
				
			||||||
    is within the valid range.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Tools
 | 
					 | 
				
			||||||
  - debug UMP SysRT messages correctly in pw-mididump.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## JACK
 | 
					 | 
				
			||||||
  - Handle sysex in UMP better by appending the converted midi1
 | 
					 | 
				
			||||||
    sysex.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# PipeWire 1.4.2 (2025-04-14)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This is a bugfix release that is API and ABI compatible with
 | 
					 | 
				
			||||||
previous 1.x releases.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Highlights
 | 
					 | 
				
			||||||
  - Do extra checks for MIDI to avoid 100% CPU usage on older kernels.
 | 
					 | 
				
			||||||
  - Fix some potential crashes in POD builder.
 | 
					 | 
				
			||||||
  - pw-cat streaming improvements on stdout/stdin.
 | 
					 | 
				
			||||||
  - Small fixes and improvements.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## PipeWire
 | 
					 | 
				
			||||||
  - Make the service files depend on DBus to avoid startup races.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## SPA
 | 
					 | 
				
			||||||
  - Do extra checks for MIDI to avoid 100% CPU usage on older kernels.
 | 
					 | 
				
			||||||
  - Use Header metadata by default in videoadapter.
 | 
					 | 
				
			||||||
  - Handle set_format result from v4l2 better.
 | 
					 | 
				
			||||||
  - Handle crash when POD builder overflows in the filter.
 | 
					 | 
				
			||||||
  - Work around a libebur128 bug. (#4646)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Tools
 | 
					 | 
				
			||||||
  - pw-cat prefers AU format when streaming on stdout/stdin. (#4629)
 | 
					 | 
				
			||||||
  - Improve pw-cat verbose sndfile format debug.
 | 
					 | 
				
			||||||
  - Add the missing --channel-map long option to pw-loopback.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## GStreamer
 | 
					 | 
				
			||||||
  - Fix a leak in the deviceprovider. (#4616)
 | 
					 | 
				
			||||||
  - Fix negotiation and make renegotiation better.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# PipeWire 1.4.1 (2025-03-14)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This is a quick bugfix release that is API and ABI compatible with
 | 
					 | 
				
			||||||
previous 1.x releases.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Highlights
 | 
					 | 
				
			||||||
  - Handle SplitPCM wrong channels specifications. This fixes some
 | 
					 | 
				
			||||||
    problems with disappearing devices.
 | 
					 | 
				
			||||||
  - Add backwards compatibility support for when the kernel does not
 | 
					 | 
				
			||||||
    support UMP. Also fix UMP output. This restores MIDI support for
 | 
					 | 
				
			||||||
    older kernels/ALSA.
 | 
					 | 
				
			||||||
  - Fix a crash in audioconvert because the resampler was not using the
 | 
					 | 
				
			||||||
    right number of channels.
 | 
					 | 
				
			||||||
  - Some compilation fixes and small improvements.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## PipeWire
 | 
					 | 
				
			||||||
  - Don't emit events when disconnecting a stream. (#3314)
 | 
					 | 
				
			||||||
  - Fix some compilation problems. (#4603)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Modules
 | 
					 | 
				
			||||||
  - Bump the ROC requirement to version 0.4.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## SPA
 | 
					 | 
				
			||||||
  - Handle SplitPCM too few or too many channels. Add an error string
 | 
					 | 
				
			||||||
    to the device names when the UCM config has an error.
 | 
					 | 
				
			||||||
  - Add backwards compatibility support for when the kernel does not
 | 
					 | 
				
			||||||
    support UMP.
 | 
					 | 
				
			||||||
  - Configure the channels in the resampler correctly in all
 | 
					 | 
				
			||||||
    cases. (#4595)
 | 
					 | 
				
			||||||
  - Fix UMP output.
 | 
					 | 
				
			||||||
  - Use the right samplerate of the filter-graph in audioconvert in
 | 
					 | 
				
			||||||
    all cases.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Bluetooth
 | 
					 | 
				
			||||||
  - Fix a crash with an incomming call.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# PipeWire 1.4.0 (2025-03-06)
 | 
					# PipeWire 1.4.0 (2025-03-06)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is the 1.4 release that is API and ABI compatible with previous
 | 
					This is the 1.4 release that is API and ABI compatible with previous
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,7 @@ IGNORE_PREFIX          = pw_ \
 | 
				
			||||||
                         spa_ \
 | 
					                         spa_ \
 | 
				
			||||||
                         SPA_
 | 
					                         SPA_
 | 
				
			||||||
GENERATE_TREEVIEW      = YES
 | 
					GENERATE_TREEVIEW      = YES
 | 
				
			||||||
 | 
					DISABLE_INDEX          = NO
 | 
				
			||||||
SEARCHENGINE           = YES
 | 
					SEARCHENGINE           = YES
 | 
				
			||||||
GENERATE_LATEX         = NO
 | 
					GENERATE_LATEX         = NO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +41,11 @@
 | 
				
			||||||
      <tab type="globals" visible="no" title="" intro=""/>
 | 
					      <tab type="globals" visible="no" title="" intro=""/>
 | 
				
			||||||
    </tab>
 | 
					    </tab>
 | 
				
			||||||
    <tab type="examples" visible="yes" title="" intro=""/>
 | 
					    <tab type="examples" visible="yes" title="" intro=""/>
 | 
				
			||||||
 | 
					    <tab type="usergroup" title="PipeWire Versions">
 | 
				
			||||||
 | 
					      <tab type="user" url="https://docs.pipewire.org/1.2/" title="1.2.x"/>
 | 
				
			||||||
 | 
					      <tab type="user" url="https://docs.pipewire.org/1.4/" title="1.4.x"/>
 | 
				
			||||||
 | 
					      <tab type="user" url="https://docs.pipewire.org/devel/" title="Development"/>
 | 
				
			||||||
 | 
					    </tab>
 | 
				
			||||||
  </navindex>
 | 
					  </navindex>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <!-- Layout definition for a class page -->
 | 
					  <!-- Layout definition for a class page -->
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
:root {
 | 
					html {
 | 
				
			||||||
	/* --page-background-color: #729fcf; */
 | 
						/* --page-background-color: #729fcf; */
 | 
				
			||||||
	--primary-color: #729fcf;
 | 
						--primary-color: #729fcf;
 | 
				
			||||||
	--primary-dark-color: #729fcf;
 | 
						--primary-dark-color: #729fcf;
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (prefers-color-scheme: light) {
 | 
					@media (prefers-color-scheme: light) {
 | 
				
			||||||
	:root {
 | 
						html {
 | 
				
			||||||
		--code-background: #f5f5f5;
 | 
							--code-background: #f5f5f5;
 | 
				
			||||||
		--code-foreground: #333333;
 | 
							--code-foreground: #333333;
 | 
				
			||||||
		--fragment-background: #f5f5f5;
 | 
							--fragment-background: #f5f5f5;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,7 @@ POD's can contain a number of basic SPA types:
 | 
				
			||||||
- `SPA_TYPE_Bytes`: A byte array.
 | 
					- `SPA_TYPE_Bytes`: A byte array.
 | 
				
			||||||
- `SPA_TYPE_Rectangle`: A rectangle with width and height.
 | 
					- `SPA_TYPE_Rectangle`: A rectangle with width and height.
 | 
				
			||||||
- `SPA_TYPE_Fraction`: A fraction with numerator and denominator.
 | 
					- `SPA_TYPE_Fraction`: A fraction with numerator and denominator.
 | 
				
			||||||
- `SPA_TYPE_Bitmap`: An array of bits.
 | 
					- `SPA_TYPE_Bitmap`: An array of bits. Deprecated and unused.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
POD's can be grouped together in these container types:
 | 
					POD's can be grouped together in these container types:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -435,10 +435,11 @@ spa_pod_parser_get_object(&p,
 | 
				
			||||||
\endcode
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`spa_pod_get_values()` is a useful function. It returns a
 | 
					`spa_pod_get_values()` is a useful function. It returns a
 | 
				
			||||||
`struct spa_pod*` with and array of values. For normal POD's
 | 
					`struct spa_pod*` with and array of values. For invalid PODs
 | 
				
			||||||
and choice none values, it simply returns the POD and one value.
 | 
					it returns the POD and no values. For normal PODs it returns
 | 
				
			||||||
For other choice values it returns the choice type and an array
 | 
					the POD and one value. For choice values it returns the choice
 | 
				
			||||||
of values:
 | 
					type and an array of values. If the choice doesn't fit even a
 | 
				
			||||||
 | 
					single value, the array will have no values.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\code{.c}
 | 
					\code{.c}
 | 
				
			||||||
struct spa_pod *value;
 | 
					struct spa_pod *value;
 | 
				
			||||||
| 
						 | 
					@ -1019,8 +1020,9 @@ A choice contains an array of possible values.
 | 
				
			||||||
                   child2 and child3, in steps of child4 in the value array.
 | 
					                   child2 and child3, in steps of child4 in the value array.
 | 
				
			||||||
    - Enum (3)   : child1 is a default value, options are any value from
 | 
					    - Enum (3)   : child1 is a default value, options are any value from
 | 
				
			||||||
                   the value array, preferred values come first.
 | 
					                   the value array, preferred values come first.
 | 
				
			||||||
    - Flags (4)  : child1 is a default value, options are any value from
 | 
					    - Flags (4)  : only child1 is a flag value. When filtering, the flags
 | 
				
			||||||
                   the value array, preferred values come first.
 | 
					                   are AND-ed together.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- flags: must be 0
 | 
					- flags: must be 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Pod (20)
 | 
					## Pod (20)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@ ALSA client match rules.
 | 
				
			||||||
In addition, the PipeWire context configuration sections 
 | 
					In addition, the PipeWire context configuration sections 
 | 
				
			||||||
may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
					may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# STREAM PROPERTIES  @IDX@ client.conf
 | 
					# STREAM PROPERTIES  @IDX@ client.conf stream.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The client configuration files contain a stream.properties section that configures the options for client streams:
 | 
					The client configuration files contain a stream.properties section that configures the options for client streams:
 | 
				
			||||||
```css
 | 
					```css
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,7 @@ A list of object properties that can be applied to streams can be found in
 | 
				
			||||||
and
 | 
					and
 | 
				
			||||||
\ref props__audio_converter_properties "pipewire-props(7) Audio Adapter Properties"
 | 
					\ref props__audio_converter_properties "pipewire-props(7) Audio Adapter Properties"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# STREAM RULES  @IDX@ client.conf
 | 
					# STREAM RULES  @IDX@ client.conf stream.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You can add \ref pipewire_conf__match_rules "match rules, see pipewire(1)"
 | 
					You can add \ref pipewire_conf__match_rules "match rules, see pipewire(1)"
 | 
				
			||||||
to set properties for certain streams and filters.
 | 
					to set properties for certain streams and filters.
 | 
				
			||||||
| 
						 | 
					@ -127,7 +127,7 @@ stream.rules = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Will set the node.name of Firefox to "My Name".
 | 
					Will set the node.name of Firefox to "My Name".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ALSA CLIENT PROPERTIES  @IDX@ client.conf
 | 
					# ALSA CLIENT PROPERTIES  @IDX@ client.conf alsa.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
An `alsa.properties` section can be added to configure client applications
 | 
					An `alsa.properties` section can be added to configure client applications
 | 
				
			||||||
that connect via the PipeWire ALSA plugin.
 | 
					that connect via the PipeWire ALSA plugin.
 | 
				
			||||||
| 
						 | 
					@ -169,7 +169,7 @@ The number of bytes in the alsa buffer. The default is 0, which is to allow any
 | 
				
			||||||
This controls the volume curve used on the ALSA mixer. Possible values are `cubic` and
 | 
					This controls the volume curve used on the ALSA mixer. Possible values are `cubic` and
 | 
				
			||||||
`linear`. The default is to use `cubic`.
 | 
					`linear`. The default is to use `cubic`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# ALSA CLIENT RULES  @IDX@ client.conf
 | 
					# ALSA CLIENT RULES  @IDX@ client.conf alsa.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is possible to set ALSA client specific properties by using
 | 
					It is possible to set ALSA client specific properties by using
 | 
				
			||||||
\ref pipewire_conf__match_rules "Match rules, see pipewire(1)". You can
 | 
					\ref pipewire_conf__match_rules "Match rules, see pipewire(1)". You can
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ JACK client match rules.
 | 
				
			||||||
In addition, the PipeWire context configuration sections 
 | 
					In addition, the PipeWire context configuration sections 
 | 
				
			||||||
may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
					may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# JACK PROPERTIES  @IDX@ jack.conf
 | 
					# JACK PROPERTIES  @IDX@ jack.conf jack.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The configuration file can contain an extra JACK specific section called `jack.properties` like this:
 | 
					The configuration file can contain an extra JACK specific section called `jack.properties` like this:
 | 
				
			||||||
```css
 | 
					```css
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ JACK apps don't know about this flag yet and refuse to show the port.
 | 
				
			||||||
Set this to true for applications that know how to handle MIDI2 ports.
 | 
					Set this to true for applications that know how to handle MIDI2 ports.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# MATCH RULES  @IDX@ jack.conf
 | 
					# MATCH RULES  @IDX@ jack.conf jack.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`jack.rules` provides an `update-props` action that takes an object with properties that are updated
 | 
					`jack.rules` provides an `update-props` action that takes an object with properties that are updated
 | 
				
			||||||
on the client and node object of the jack client.
 | 
					on the client and node object of the jack client.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,13 +36,96 @@ type. Other properties control settings of a specific kinds of device
 | 
				
			||||||
or node (ALSA, Bluetooth, ...), and have meaning only for those
 | 
					or node (ALSA, Bluetooth, ...), and have meaning only for those
 | 
				
			||||||
objects.
 | 
					objects.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Usually, all the properties are configured in the session manager
 | 
					# CUSTOMIZING PROPERTIES  @IDX@ props
 | 
				
			||||||
configuration.  For how to configure them, see the session manager
 | 
					 | 
				
			||||||
documentation. In minimal PipeWire setups without a session manager,
 | 
					 | 
				
			||||||
they can be configured via
 | 
					 | 
				
			||||||
\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)".
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
\see [WirePlumber configuration](https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html)
 | 
					Usually, all device properties are configured in the session manager
 | 
				
			||||||
 | 
					configuration, see the session manager documentation.
 | 
				
			||||||
 | 
					Application properties are configured in
 | 
				
			||||||
 | 
					``client.conf`` (for native PipeWire and ALSA applications),
 | 
				
			||||||
 | 
					``pipewire-pulse.conf`` (for Pulseaudio applications), and
 | 
				
			||||||
 | 
					``jack.conf`` (for JACK applications).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In minimal PipeWire setups without a session manager,
 | 
				
			||||||
 | 
					the device properties can be configured via
 | 
				
			||||||
 | 
					\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)"
 | 
				
			||||||
 | 
					when creating the devices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Device configuration using WirePlumber (requires WirePlumber restart to apply).
 | 
				
			||||||
 | 
					See [WirePlumber configuration](https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html)
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					# ~/.config/wireplumber/wireplumber.conf.d/custom-props.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monitor.alsa.properties = {
 | 
				
			||||||
 | 
					  alsa.udev.expose-busy = true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monitor.alsa.rules = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { device.name = "~alsa_card.pci-.*" } ],
 | 
				
			||||||
 | 
					    actions = { update-props = { api.alsa.soft-mixer = true } }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { node.name = "alsa_output.pci-0000_03_00.1.hdmi-stereo-extra3" } ]
 | 
				
			||||||
 | 
					    actions = { update-props = { node.description = "Main Audio" } }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monitor.alsa-midi.properties = {
 | 
				
			||||||
 | 
					  api.alsa.seq.ump = true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monitor.bluez.properties = {
 | 
				
			||||||
 | 
					  bluez5.hfphsp-backend = ofono
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					monitor.bluez.rules = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { device.name = "~bluez_card.*" } ],
 | 
				
			||||||
 | 
					    actions = { update-props = { bluez5.dummy-avrcp player = true } }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Native client configuration (requires client application restart to apply).
 | 
				
			||||||
 | 
					See \ref client_conf__stream_rules "pipewire-client.conf(5)"
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					# ~/.config/pipewire/client.conf/custom-props.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stream.rules = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { application.name = "pw-play" } ]
 | 
				
			||||||
 | 
					    actions = { update-props = { node.description = "Some pw-cat stream" } }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Pulseaudio client configuration (requires \ref page_man_pipewire-pulse_1 "pipewire-pulse(1)" restart to apply).
 | 
				
			||||||
 | 
					See \ref pipewire-pulse_conf__stream_rules "pipewire-pulse.conf(5)"
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					# ~/.config/pipewire/pipewire-pulse.conf/custom-props.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stream.rules = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { application.name = "paplay" } ]
 | 
				
			||||||
 | 
					    actions = { update-props = { node.description = "Some paplay stream" } }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					JACK client configuration (requires client restart to apply).
 | 
				
			||||||
 | 
					See \ref jack_conf__match_rules "pipewire-jack.conf(5)"
 | 
				
			||||||
 | 
					```css
 | 
				
			||||||
 | 
					# ~/.config/pipewire/jack.conf/custom-props.conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jack.rules = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    matches = [ { client.name = "jack_delay" } ]
 | 
				
			||||||
 | 
					    actions = { update-props = { node.description = "Some JACK node" } }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# COMMON DEVICE PROPERTIES  @IDX@ props
 | 
					# COMMON DEVICE PROPERTIES  @IDX@ props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,12 +174,12 @@ ie. for example `device.Param.Props = { ... }` to set `Props`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ device-prop  device.product.id # integer
 | 
					@PAR@ device-prop  device.product.id # integer
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
\copydoc PW_KEY_DEVICE_PRODUCT_NAME
 | 
					\copydoc PW_KEY_DEVICE_PRODUCT_ID
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ device-prop  device.product.name # string
 | 
					@PAR@ device-prop  device.product.name # string
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
\copydoc PW_KEY_DEVICE_PRODUCT_ID
 | 
					\copydoc PW_KEY_DEVICE_PRODUCT_NAME
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ device-prop  device.class # string
 | 
					@PAR@ device-prop  device.class # string
 | 
				
			||||||
| 
						 | 
					@ -143,11 +226,14 @@ real or virtual devices.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
These contain properties to identify the node or to display the node in a GUI application.
 | 
					These contain properties to identify the node or to display the node in a GUI application.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  node.name
 | 
					@PAR@ node-prop  node.name    # string
 | 
				
			||||||
A (unique) name for the node. This is usually set on sink and sources to identify them
 | 
					A (unique) name for the node. This is usually set on sink and sources to identify them
 | 
				
			||||||
as targets for linking by the session manager.
 | 
					as targets for linking by the session manager.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  node.description
 | 
					@PAR@ node-prop  node.nick    # string
 | 
				
			||||||
 | 
					A short name for the node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  node.description    # string
 | 
				
			||||||
A human readable description of the node or stream.
 | 
					A human readable description of the node or stream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  media.name
 | 
					@PAR@ node-prop  media.name
 | 
				
			||||||
| 
						 | 
					@ -338,14 +424,14 @@ a sink or source.
 | 
				
			||||||
@PAR@ node-prop  node.exclusive = false
 | 
					@PAR@ node-prop  node.exclusive = false
 | 
				
			||||||
If this node wants to be linked exclusively to the sink/source.
 | 
					If this node wants to be linked exclusively to the sink/source.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  target.object = <node.name|object.serial>
 | 
				
			||||||
 | 
					Where the node should link to, this can be a node.name or an object.serial.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  node.target = <node.name|object.id>
 | 
					@PAR@ node-prop  node.target = <node.name|object.id>
 | 
				
			||||||
Where this node should be linked to. This can be a node.name or an object.id of a node. This property is
 | 
					Where this node should be linked to. This can be a node.name or an object.id of a node. This property is
 | 
				
			||||||
deprecated, the target.object property should be used instead, which uses the more unique object.serial as
 | 
					deprecated, the target.object property should be used instead, which uses the more unique object.serial as
 | 
				
			||||||
a possible target.
 | 
					a possible target.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  target.object = <node.name|object.serial>
 | 
					 | 
				
			||||||
Where the node should link to, this can be a node.name or an object.serial.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@PAR@ node-prop  node.dont-reconnect = false
 | 
					@PAR@ node-prop  node.dont-reconnect = false
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
When the node has a target configured and the target is destroyed, destroy the node as well.
 | 
					When the node has a target configured and the target is destroyed, destroy the node as well.
 | 
				
			||||||
| 
						 | 
					@ -355,6 +441,13 @@ Note that if a stream should appear/disappear in sync with the target, a session
 | 
				
			||||||
should be written instead.
 | 
					should be written instead.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  node.dont-fallback = false
 | 
				
			||||||
 | 
					If linking this node to its specified target does not succeed, session
 | 
				
			||||||
 | 
					manager should not fall back to linking it to the default target.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  node.dont-move = false
 | 
				
			||||||
 | 
					Whether the node target may be changed using metadata.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  node.passive = false
 | 
					@PAR@ node-prop  node.passive = false
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
This is a passive node and so it should not keep sinks/sources busy. This property makes the session manager create passive links to the sink/sources. If the node is not otherwise linked (via a non-passive link), the node and the sink it is linked to are idle (and eventually suspended).
 | 
					This is a passive node and so it should not keep sinks/sources busy. This property makes the session manager create passive links to the sink/sources. If the node is not otherwise linked (via a non-passive link), the node and the sink it is linked to are idle (and eventually suspended).
 | 
				
			||||||
| 
						 | 
					@ -371,6 +464,13 @@ Instruct the session manager to not remix the channels of a stream. Normally the
 | 
				
			||||||
@PAR@ node-prop  priority.session    # integer
 | 
					@PAR@ node-prop  priority.session    # integer
 | 
				
			||||||
The priority for selecting this node as the default source or sink.
 | 
					The priority for selecting this node as the default source or sink.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  session.suspend-timeout-seconds = 3  # float
 | 
				
			||||||
 | 
					Timeout in seconds, after which an idle node is suspended.
 | 
				
			||||||
 | 
					Value ``0`` means the node will not be suspended.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  state.restore-props = true
 | 
				
			||||||
 | 
					Whether session manager should save state for this node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Format Properties
 | 
					## Format Properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Streams and also most device nodes can be configured in a certain format with properties.
 | 
					Streams and also most device nodes can be configured in a certain format with properties.
 | 
				
			||||||
| 
						 | 
					@ -640,8 +740,12 @@ See \ref spa_param_port_config for the meaning.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Monitor properties
 | 
					## Monitor properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ monitor-prop  alsa.use-acp    # boolean
 | 
					@PAR@ monitor-prop  alsa.use-acp = true      # boolean
 | 
				
			||||||
Use \ref monitor-prop__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration.
 | 
					Use \ref monitor-prop__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration.
 | 
				
			||||||
 | 
					This autodetects available ALSA devices and configures port and hardware mixers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  alsa.use-ucm             # boolean
 | 
				
			||||||
 | 
					Enable or disable UCM for all devices. Default: unset.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ monitor-prop  alsa.udev.expose-busy    # boolean
 | 
					@PAR@ monitor-prop  alsa.udev.expose-busy    # boolean
 | 
				
			||||||
Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some
 | 
					Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some
 | 
				
			||||||
| 
						 | 
					@ -658,7 +762,7 @@ When ACP is enabled and a UCM configuration is available for a device, by
 | 
				
			||||||
default it is used instead of the ACP profiles. This option allows you to
 | 
					default it is used instead of the ACP profiles. This option allows you to
 | 
				
			||||||
disable this and use the ACP profiles instead.
 | 
					disable this and use the ACP profiles instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This option does nothing if `api.alsa.use-acp` is set to `false`.
 | 
					This option does nothing if `alsa.use-acp` is set to `false`.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ device-prop  api.alsa.soft-mixer = false  # boolean
 | 
					@PAR@ device-prop  api.alsa.soft-mixer = false  # boolean
 | 
				
			||||||
| 
						 | 
					@ -718,6 +822,13 @@ some devices.
 | 
				
			||||||
\copydoc SPA_KEY_API_ALSA_SPLIT_ENABLE
 | 
					\copydoc SPA_KEY_API_ALSA_SPLIT_ENABLE
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop api.acp.disable-pro-audio = false  # boolean
 | 
				
			||||||
 | 
					Disable the "Pro Audio" profile for this device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop api.acp.use-eld-channels = false  # boolean
 | 
				
			||||||
 | 
					Use the channel count and mapping the connected HDMI device
 | 
				
			||||||
 | 
					provides via ELD information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Node properties
 | 
					## Node properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  audio.channels    # integer
 | 
					@PAR@ node-prop  audio.channels    # integer
 | 
				
			||||||
| 
						 | 
					@ -732,6 +843,9 @@ The audio format to open the device in. By default this is "UNKNOWN", which will
 | 
				
			||||||
@PAR@ node-prop  audio.position    # JSON array of strings
 | 
					@PAR@ node-prop  audio.position    # JSON array of strings
 | 
				
			||||||
The audio position of the channels in the device. This is auto detected based on the profile. You can configure an array of channel positions, like "[ FL, FR ]".
 | 
					The audio position of the channels in the device. This is auto detected based on the profile. You can configure an array of channel positions, like "[ FL, FR ]".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  audio.layout    # string
 | 
				
			||||||
 | 
					The audio layout of the channels in the device. You can use any of the predefined layouts, like "Stereo", "5.1" etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  audio.allowed-rates    # JSON array of integers
 | 
					@PAR@ node-prop  audio.allowed-rates    # JSON array of integers
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
The allowed audio rates to open the device with. Default is "[ ]", which means the device can be opened in any supported rate.
 | 
					The allowed audio rates to open the device with. Default is "[ ]", which means the device can be opened in any supported rate.
 | 
				
			||||||
| 
						 | 
					@ -778,6 +892,12 @@ Setting this to 0 makes htimestamp never get disabled.
 | 
				
			||||||
Disable timer-based scheduling, and use IRQ for scheduling instead.
 | 
					Disable timer-based scheduling, and use IRQ for scheduling instead.
 | 
				
			||||||
The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
 | 
					The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  api.alsa.dll-bandwidth-max    # double
 | 
				
			||||||
 | 
					Sets the maximum bandwidth of the DLL (delay-locked loop) filter used to smooth out rate adjustments.
 | 
				
			||||||
 | 
					The default value may be too responsive in some scenarios.
 | 
				
			||||||
 | 
					For example, with UAC2 pitch control, the host reacts more slowly compared to local resampling,
 | 
				
			||||||
 | 
					so using a lower bandwidth helps avoid oscillations or instability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  api.alsa.auto-link = false    # boolean
 | 
					@PAR@ node-prop  api.alsa.auto-link = false    # boolean
 | 
				
			||||||
Link follower PCM devices to the driver PCM device when using IRQ-based scheduling.
 | 
					Link follower PCM devices to the driver PCM device when using IRQ-based scheduling.
 | 
				
			||||||
The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
 | 
					The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
 | 
				
			||||||
| 
						 | 
					@ -791,12 +911,18 @@ Static set the device systemic latency, in nanoseconds.
 | 
				
			||||||
@PAR@ node-prop  api.alsa.path    # string
 | 
					@PAR@ node-prop  api.alsa.path    # string
 | 
				
			||||||
UNDOCUMENTED
 | 
					UNDOCUMENTED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  api.alsa.pcm.card  # integer
 | 
				
			||||||
 | 
					Card index to open. Usually determined from `api.alsa.path`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  api.alsa.open.ucm    # boolean
 | 
					@PAR@ node-prop  api.alsa.open.ucm    # boolean
 | 
				
			||||||
Open device using UCM.
 | 
					Open device using UCM.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  api.alsa.bind-ctls    # boolean
 | 
					@PAR@ node-prop  api.alsa.bind-ctls    # boolean
 | 
				
			||||||
UNDOCUMENTED
 | 
					UNDOCUMENTED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  api.alsa.bind-ctl.NAME   # boolean
 | 
				
			||||||
 | 
					UNDOCUMENTED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  iec958.codecs    # JSON array of string
 | 
					@PAR@ node-prop  iec958.codecs    # JSON array of string
 | 
				
			||||||
Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports.
 | 
					Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports.
 | 
				
			||||||
Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD
 | 
					Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD
 | 
				
			||||||
| 
						 | 
					@ -818,6 +944,34 @@ Informative property.
 | 
				
			||||||
Informative property.
 | 
					Informative property.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  api.alsa.dsd-lsb = false  # boolean
 | 
				
			||||||
 | 
					Use LSB bit order for DSD audio output.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ALSA MIDI PROPERTIES  @IDX@ props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Node properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For ALSA MIDI in Wireplumber, MIDI bridge node properties are
 | 
				
			||||||
 | 
					configured in the monitor properties.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  api.alsa.seq.ump = true         # boolean
 | 
				
			||||||
 | 
					Use MIDI 2.0 if possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  api.alsa.seq.min-pool = 500     # integer
 | 
				
			||||||
 | 
					UNDOCUMENTED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  api.alsa.seq.max-pool = 2000    # integer
 | 
				
			||||||
 | 
					UNDOCUMENTED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  clock.name = "clock.system.monotonic"  # string
 | 
				
			||||||
 | 
					Clock to follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  api.alsa.path = "default"   # string
 | 
				
			||||||
 | 
					Sequencer device to use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  api.alsa.disable-longname = true  # boolean
 | 
				
			||||||
 | 
					If card long name should not be passed to MIDI port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# BLUETOOTH PROPERTIES  @IDX@ props
 | 
					# BLUETOOTH PROPERTIES  @IDX@ props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -963,6 +1117,26 @@ Maximum number of octets supported per codec frame for the LC3 codec (default: 4
 | 
				
			||||||
@PAR@ monitor-prop  bluez5.bap-server-capabilities.max_frames		# integer
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.max_frames		# integer
 | 
				
			||||||
Maximum number of codec frames supported per SDU for the LC3 codec (default: 2).
 | 
					Maximum number of codec frames supported per SDU for the LC3 codec (default: 2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.sink.locations		# JSON or integer
 | 
				
			||||||
 | 
					Sink audio locations of the server, as channel positions or PACS bitmask.
 | 
				
			||||||
 | 
					Example: `FL,FR`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.sink.contexts		# integer
 | 
				
			||||||
 | 
					Available sink contexts PACS bitmask of the the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.sink.supported-contexts		# integer
 | 
				
			||||||
 | 
					Supported sink contexts PACS bitmask of the the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.source.locations		# JSON or integer
 | 
				
			||||||
 | 
					Source audio locations of the server, as channel positions or PACS bitmask.
 | 
				
			||||||
 | 
					Example: `FL,FR`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.source.contexts		# integer
 | 
				
			||||||
 | 
					Available source contexts PACS bitmask of the the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ monitor-prop  bluez5.bap-server-capabilities.source.supported-contexts		# integer
 | 
				
			||||||
 | 
					Supported source contexts PACS bitmask of the the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Device properties
 | 
					## Device properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ device-prop  bluez5.auto-connect   # boolean
 | 
					@PAR@ device-prop  bluez5.auto-connect   # boolean
 | 
				
			||||||
| 
						 | 
					@ -997,6 +1171,31 @@ PipeWire Opus Pro Audio duplex encoding mode: audio, voip, lowdelay
 | 
				
			||||||
@PAR@ device-prop  bluez5.bap.cig = "auto"   # integer, or 'auto'
 | 
					@PAR@ device-prop  bluez5.bap.cig = "auto"   # integer, or 'auto'
 | 
				
			||||||
Set CIG ID for BAP unicast streams of the device.
 | 
					Set CIG ID for BAP unicast streams of the device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop  bluez5.bap.preset = "auto"  # string
 | 
				
			||||||
 | 
					BAP QoS preset name that needed to be used with vendor config.
 | 
				
			||||||
 | 
					This property is experimental.
 | 
				
			||||||
 | 
					Available: "48_2_1", ... as in the BAP specification.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop  bluez5.bap.rtn  # integer
 | 
				
			||||||
 | 
					BAP QoS preset name that needed to be used with vendor config.
 | 
				
			||||||
 | 
					This property is experimental.
 | 
				
			||||||
 | 
					Default: as per QoS preset.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop  bluez5.bap.latency  # integer
 | 
				
			||||||
 | 
					BAP QoS latency that needs to be applied for vendor defined preset
 | 
				
			||||||
 | 
					This property is experimental.
 | 
				
			||||||
 | 
					Default: as QoS preset.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop  bluez5.bap.delay = 40000 # integer
 | 
				
			||||||
 | 
					BAP QoS delay that needs to be applied for vendor defined preset
 | 
				
			||||||
 | 
					This property is experimental.
 | 
				
			||||||
 | 
					Default: as per QoS preset.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ device-prop  bluez5.framing = false # boolean
 | 
				
			||||||
 | 
					BAP QoS framing that needs to be applied for vendor defined preset
 | 
				
			||||||
 | 
					This property is experimental.
 | 
				
			||||||
 | 
					Default: as per QoS preset.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Node properties
 | 
					## Node properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ node-prop  bluez5.media-source-role   # string
 | 
					@PAR@ node-prop  bluez5.media-source-role   # string
 | 
				
			||||||
| 
						 | 
					@ -1007,6 +1206,17 @@ this instance. Available values:
 | 
				
			||||||
  - input: appear as source node.
 | 
					  - input: appear as source node.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  bluez5.decode-buffer.latency   # integer
 | 
				
			||||||
 | 
					Applies on media source nodes and defines the target amount
 | 
				
			||||||
 | 
					of samples to be buffered on the output of the decoder.
 | 
				
			||||||
 | 
					Default: 0, which means it is automatically determined.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ node-prop  node.latency-offset-msec   # string
 | 
				
			||||||
 | 
					Applies only for BLE MIDI nodes.
 | 
				
			||||||
 | 
					Latency adjustment to apply on the node. Larger values add a
 | 
				
			||||||
 | 
					constant latency, but reduces timing jitter caused by Bluetooth
 | 
				
			||||||
 | 
					transport.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PORT PROPERTIES  @IDX@ props
 | 
					# PORT PROPERTIES  @IDX@ props
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Port properties are usually not directly configurable via PipeWire
 | 
					Port properties are usually not directly configurable via PipeWire
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,7 @@ for the detailed description.
 | 
				
			||||||
In addition, the PipeWire context configuration sections 
 | 
					In addition, the PipeWire context configuration sections 
 | 
				
			||||||
may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
					may also be specified, see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# STREAM PROPERTIES  @IDX@ pipewire-pulse.conf
 | 
					# STREAM PROPERTIES  @IDX@ pipewire-pulse.conf stream.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `stream.properties` section contains properties for streams created
 | 
					The `stream.properties` section contains properties for streams created
 | 
				
			||||||
by the pipewire-pulse server.
 | 
					by the pipewire-pulse server.
 | 
				
			||||||
| 
						 | 
					@ -100,18 +100,18 @@ stream.properties = {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# STREAM RULES  @IDX@ pipewire-pulse.conf
 | 
					# STREAM RULES  @IDX@ pipewire-pulse.conf stream.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `stream.rules` section works the same as
 | 
					The `stream.rules` section works the same as
 | 
				
			||||||
\ref client_conf__stream_rules "pipewire-client.conf(5) stream.rules".
 | 
					\ref client_conf__stream_rules "pipewire-client.conf(5) stream.rules".
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PULSEAUDIO PROPERTIES  @IDX@ pipewire-pulse.conf
 | 
					# PULSEAUDIO PROPERTIES  @IDX@ pipewire-pulse.conf pulse.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For `pulse.properties` section,
 | 
					For `pulse.properties` section,
 | 
				
			||||||
see \ref page_module_protocol_pulse "libpipewire-module-protocol-pulse(7)" 
 | 
					see \ref page_module_protocol_pulse "libpipewire-module-protocol-pulse(7)" 
 | 
				
			||||||
for available options.
 | 
					for available options.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# PULSEAUDIO RULES  @IDX@ pipewire-pulse.conf
 | 
					# PULSEAUDIO RULES  @IDX@ pipewire-pulse.conf pulse.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For each client, a set of rules can be written in `pulse.rules`
 | 
					For each client, a set of rules can be written in `pulse.rules`
 | 
				
			||||||
section to configure quirks of the client or to force some pulse
 | 
					section to configure quirks of the client or to force some pulse
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,7 +140,7 @@ Array of dictionaries. Match rules for modifying device properties
 | 
				
			||||||
on the server.
 | 
					on the server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# CONTEXT PROPERTIES  @IDX@ pipewire.conf
 | 
					# CONTEXT PROPERTIES  @IDX@ pipewire.conf context.properties
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Available PipeWire properties in `context.properties` and possible
 | 
					Available PipeWire properties in `context.properties` and possible
 | 
				
			||||||
default values.
 | 
					default values.
 | 
				
			||||||
| 
						 | 
					@ -275,6 +275,20 @@ Warn about failures to lock memory.
 | 
				
			||||||
@PAR@ pipewire.conf  mem.mlock-all = false
 | 
					@PAR@ pipewire.conf  mem.mlock-all = false
 | 
				
			||||||
Try to mlock all current and future memory by the process.
 | 
					Try to mlock all current and future memory by the process.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ pipewire.conf  rlimit.nofile = 4096
 | 
				
			||||||
 | 
					Try to set the max file descriptor number resource limit of the process.
 | 
				
			||||||
 | 
					A value of -1 raises the limit to the system defined hard maximum value.
 | 
				
			||||||
 | 
					The file resource limit is usually 1024 and should only be raised if the
 | 
				
			||||||
 | 
					program does not use the select() system call. PipeWire does normally not
 | 
				
			||||||
 | 
					use select().
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PAR@ pipewire.conf  rlimit.*resource* = *value*
 | 
				
			||||||
 | 
					Set resource limits. *resource* can be one of: as, core, cpu,
 | 
				
			||||||
 | 
					data, fsize, locks, memlock, msgqueue, nice, nofile, nproc, rss, rtprio,
 | 
				
			||||||
 | 
					rttime, sigpending or stack. See the documentation of setrlimit to get the
 | 
				
			||||||
 | 
					meaning of these resources. A value of -1 will set the maximum allowed
 | 
				
			||||||
 | 
					limit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@PAR@ pipewire.conf  settings.check-quantum = false
 | 
					@PAR@ pipewire.conf  settings.check-quantum = false
 | 
				
			||||||
Check if the quantum in the settings metadata update is compatible
 | 
					Check if the quantum in the settings metadata update is compatible
 | 
				
			||||||
with the configured limits.
 | 
					with the configured limits.
 | 
				
			||||||
| 
						 | 
					@ -302,7 +316,7 @@ the `context.modules` and `context.objects` sections can declare
 | 
				
			||||||
additional conditions that control whether a module or object is loaded
 | 
					additional conditions that control whether a module or object is loaded
 | 
				
			||||||
depending on what properties are present.
 | 
					depending on what properties are present.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# SPA LIBRARIES  @IDX@ pipewire.conf
 | 
					# SPA LIBRARIES  @IDX@ pipewire.conf context.spa-libs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SPA plugins are loaded based on their factory-name. This is a well
 | 
					SPA plugins are loaded based on their factory-name. This is a well
 | 
				
			||||||
known name that uniquely describes the features that the plugin should
 | 
					known name that uniquely describes the features that the plugin should
 | 
				
			||||||
| 
						 | 
					@ -331,7 +345,7 @@ context.spa-libs = {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# MODULES  @IDX@ pipewire.conf
 | 
					# MODULES  @IDX@ pipewire.conf context.modules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PipeWire modules to be loaded. See
 | 
					PipeWire modules to be loaded. See
 | 
				
			||||||
\ref page_man_libpipewire-modules_7 "libpipewire-modules(7)".
 | 
					\ref page_man_libpipewire-modules_7 "libpipewire-modules(7)".
 | 
				
			||||||
| 
						 | 
					@ -364,7 +378,7 @@ A \ref pipewire_conf__match_rules "match rule" `matches` condition.
 | 
				
			||||||
The module is loaded only if one of the expressions in the array matches
 | 
					The module is loaded only if one of the expressions in the array matches
 | 
				
			||||||
to a context property.
 | 
					to a context property.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# CONTEXT OBJECTS  @IDX@ pipewire.conf
 | 
					# CONTEXT OBJECTS  @IDX@ pipewire.conf context.objects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `context.objects` section allows you to make some objects from factories (usually created
 | 
					The `context.objects` section allows you to make some objects from factories (usually created
 | 
				
			||||||
by loading modules in `context.modules`).
 | 
					by loading modules in `context.modules`).
 | 
				
			||||||
| 
						 | 
					@ -417,7 +431,7 @@ context.objects = [
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# COMMAND EXECUTION  @IDX@ pipewire.conf
 | 
					# COMMAND EXECUTION  @IDX@ pipewire.conf context.exec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The `context.exec` section can be used to start arbitrary commands as
 | 
					The `context.exec` section can be used to start arbitrary commands as
 | 
				
			||||||
part of the initialization of the PipeWire program.
 | 
					part of the initialization of the PipeWire program.
 | 
				
			||||||
| 
						 | 
					@ -590,7 +604,7 @@ matches = [
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# CONTEXT PROPERTIES RULES  @IDX@ pipewire.conf
 | 
					# CONTEXT PROPERTIES RULES  @IDX@ pipewire.conf context.properties.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`context.properties.rules` can be used to dynamically update the properties
 | 
					`context.properties.rules` can be used to dynamically update the properties
 | 
				
			||||||
based on other properties.
 | 
					based on other properties.
 | 
				
			||||||
| 
						 | 
					@ -614,7 +628,7 @@ context.properties.rules = [
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# NODE RULES  @IDX@ pipewire.conf
 | 
					# NODE RULES  @IDX@ pipewire.conf node.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The node.rules are evaluated every time the properties on a node are set
 | 
					The node.rules are evaluated every time the properties on a node are set
 | 
				
			||||||
or updated. This can be used on the server side to override client set
 | 
					or updated. This can be used on the server side to override client set
 | 
				
			||||||
| 
						 | 
					@ -647,7 +661,7 @@ node.rules = [
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Will set the `node.force-quantum` property of `jack_simple_client` to 512.
 | 
					Will set the `node.force-quantum` property of `jack_simple_client` to 512.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# DEVICE RULES  @IDX@ pipewire.conf
 | 
					# DEVICE RULES  @IDX@ pipewire.conf device.rules
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The device.rules are evaluated every time the properties on a device are set
 | 
					The device.rules are evaluated every time the properties on a device are set
 | 
				
			||||||
or updated. This can be used on the server side to override client set
 | 
					or updated. This can be used on the server side to override client set
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,5 +48,6 @@ See \ref page_api.
 | 
				
			||||||
- [Bluetooth, PipeWire and Whatsapp calls](https://gjhenrique.com/pipewire.html)
 | 
					- [Bluetooth, PipeWire and Whatsapp calls](https://gjhenrique.com/pipewire.html)
 | 
				
			||||||
- [Intoduction to PipeWire](https://bootlin.com/blog/an-introduction-to-pipewire/)
 | 
					- [Intoduction to PipeWire](https://bootlin.com/blog/an-introduction-to-pipewire/)
 | 
				
			||||||
- [A custom PipeWire node](https://bootlin.com/blog/a-custom-pipewire-node/)
 | 
					- [A custom PipeWire node](https://bootlin.com/blog/a-custom-pipewire-node/)
 | 
				
			||||||
 | 
					- [FOSDEM 2025 talk and slides](https://fosdem.org/2025/schedule/event/fosdem-2025-4749-pipewire-state-of-the-union/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,8 @@ The native protocol and object model is similar to
 | 
				
			||||||
serialization/deserialization of messages. This is because the data structures
 | 
					serialization/deserialization of messages. This is because the data structures
 | 
				
			||||||
in the messages are more complicated and not easily expressible in XML.
 | 
					in the messages are more complicated and not easily expressible in XML.
 | 
				
			||||||
See \ref page_module_protocol_native for details.
 | 
					See \ref page_module_protocol_native for details.
 | 
				
			||||||
 | 
					See also \ref page_native_protocol for the documentation of the protocol
 | 
				
			||||||
 | 
					messages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Extensibility
 | 
					# Extensibility
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										115
									
								
								doc/dox/internals/driver.dox
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								doc/dox/internals/driver.dox
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,115 @@
 | 
				
			||||||
 | 
					/** \page page_driver Driver architecture and workflow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This document explains how drivers are structured and how they operate.
 | 
				
			||||||
 | 
					This is useful to know both for debugging and for writing new drivers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(For details about how the graph does scheduling, which is tied to the driver,
 | 
				
			||||||
 | 
					see \ref page_scheduling ).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Clocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A driver is a node that starts graph cycles. Typically, this is accomplished
 | 
				
			||||||
 | 
					by using a timer that periodically invokes a callback, or by an interrupt.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Drivers use the monotonic system clock as the reference for timestamping. Note
 | 
				
			||||||
 | 
					that "monotonic system clock" does not refer to the \c MONOTONIC_RAW clock in
 | 
				
			||||||
 | 
					Linux, but rather, to the regular monotonic clock.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Drivers may actually be run by a custom internal clock instead of the monotonic
 | 
				
			||||||
 | 
					system clock. One example would be a sound card DAC's clock. Another would be
 | 
				
			||||||
 | 
					a network adapter with a built in PHC. Or, the driver may be using a system
 | 
				
			||||||
 | 
					clock other than the monotonic system clock. The driver then needs to perform
 | 
				
			||||||
 | 
					some sort of timestamp translation and drift compensation from that internal
 | 
				
			||||||
 | 
					clock to the monotonic clock, since it still needs to generate monotonic clock
 | 
				
			||||||
 | 
					timestamps for the beginning cycle. (More on that below.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Updates and graph cycle start
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Every time a driver starts a graph cycle, it must update the contents of the
 | 
				
			||||||
 | 
					\ref spa_io_clock instance that is assigned to them through the
 | 
				
			||||||
 | 
					\ref spa_node_methods::set_io callback. The fields of the struct must be
 | 
				
			||||||
 | 
					updated as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- \ref spa_io_clock::nsec : Must be set to the time (according to the monotonic
 | 
				
			||||||
 | 
					  system clock) when the cycle that the driver is about to trigger started. To
 | 
				
			||||||
 | 
					  minimize jitter, it is usually a good idea to increment this by a fixed amount
 | 
				
			||||||
 | 
					  except for when the driver starts and when discontinuities occur in its clock.
 | 
				
			||||||
 | 
					- \ref spa_io_clock::rate : Set to a value that can translate samples to nanoseconds.
 | 
				
			||||||
 | 
					- \ref spa_io_clock::position : Current cycle position, in samples. This is the
 | 
				
			||||||
 | 
					  ideal position of the graph cycle (this is explained in greater detail further below).
 | 
				
			||||||
 | 
					  It is incremented by the duration (in samples) at the beginning of each cycle. If
 | 
				
			||||||
 | 
					  a discontinuity is experienced by the driver that results in a discontinuity in the
 | 
				
			||||||
 | 
					  position of the old and the current cycle, consider setting the
 | 
				
			||||||
 | 
					  \ref SPA_IO_CLOCK_FLAG_DISCONT flag to inform other nodes about this.
 | 
				
			||||||
 | 
					- \ref spa_io_clock::duration : Duration of this new cycle, in samples.
 | 
				
			||||||
 | 
					- \ref spa_io_clock::rate_diff : A decimal value that is set to whatever correction
 | 
				
			||||||
 | 
					  factor the driver applied to for a drift between an internal driver clock and the
 | 
				
			||||||
 | 
					  monotonic system clock. A value above 1.0 means that the internal driver clock
 | 
				
			||||||
 | 
					  is faster than the monotonic system clock, and vice versa. Always set this to
 | 
				
			||||||
 | 
					  1.0 if the driver is directly using the monotonic clock.
 | 
				
			||||||
 | 
					- \ref spa_io_clock::next_nsec : Must be set to the time (according to the monotonic
 | 
				
			||||||
 | 
					  system clock) when the cycle that comes after the current one is to be started. In
 | 
				
			||||||
 | 
					  some cases, this may actually be in the past relative to nsec, for example, when
 | 
				
			||||||
 | 
					  some internal driver clock experienced a discontinuity. Consider setting the
 | 
				
			||||||
 | 
					  \ref SPA_IO_CLOCK_FLAG_DISCONT flag in such a case. Just like with nsec, to
 | 
				
			||||||
 | 
					  minimize jitter, it is usually a good idea to increment this by a fixed amount
 | 
				
			||||||
 | 
					  except for when the driver starts and when discontinuities occur in its clock.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The driver node signals the start of the graph cycle by calling \ref spa_node_call_ready
 | 
				
			||||||
 | 
					with the \ref SPA_STATUS_HAVE_DATA and \ref SPA_STATUS_NEED_DATA flags passed
 | 
				
			||||||
 | 
					to that function call. That call must happen inside the thread that runs the
 | 
				
			||||||
 | 
					data loop assigned to the driver node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As mentioned above, the \ref spa_io_clock::position field is the _ideal_ position
 | 
				
			||||||
 | 
					of the graph cycle, in samples. This contrasts with \ref spa_io_clock::nsec, which
 | 
				
			||||||
 | 
					is the moment in monotonic clock time when the cycle _actually_ happens. This is an
 | 
				
			||||||
 | 
					important distinction when driver is run by a clock that is different to the monotonic
 | 
				
			||||||
 | 
					clock. In that case, the \ref spa_io_clock::nsec timestamps are adjusted to match the
 | 
				
			||||||
 | 
					pace of that different clock (explained in the section below). In such a case,
 | 
				
			||||||
 | 
					\ref spa_io_clock::position still is incremented by the duration in samples. This
 | 
				
			||||||
 | 
					is important, since nodes and modules may use this field as an offset within their own
 | 
				
			||||||
 | 
					internal ring buffers or similar structures, using the position field as an offset within
 | 
				
			||||||
 | 
					said data structures. This requires the position field to advance in a continuous way.
 | 
				
			||||||
 | 
					By incrementing by the duration, this requirement is met.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Using clocks other than the monotonic clock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As mentioned earlier, the driver may be run by an internal clock that is different
 | 
				
			||||||
 | 
					to the monotonic clock. If that other clock can be directly used for scheduling
 | 
				
			||||||
 | 
					graph cycle initiations, then it is sufficient to compute the offset between that
 | 
				
			||||||
 | 
					clock and the monotonic clock (that is, offset = monotonic_clock_time - other_clock_time)
 | 
				
			||||||
 | 
					at each cycle and use that offset to translate that other clock's time to the monotonic
 | 
				
			||||||
 | 
					clock time. This is accomplished by adding that offset to the \ref spa_io_clock::nsec
 | 
				
			||||||
 | 
					and \ref spa_io_clock::next_nsec fields. For example, when the driver uses the realtime
 | 
				
			||||||
 | 
					system clock instead of the monotonic system clock, then that realtime clock can still
 | 
				
			||||||
 | 
					be used with \c timerfd to schedule callback invocations within the data loop. Then,
 | 
				
			||||||
 | 
					computing the (monotonic_clock_time - realtime_clock_time) offset is sufficient, as
 | 
				
			||||||
 | 
					mentioned, to be able to translate clock's time to monotonic time for \ref spa_io_clock::nsec
 | 
				
			||||||
 | 
					and \ref spa_io_clock::next_nsec (which require monotonic clock timestamps).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If however that other clock cannot be used for scheduling graph cycle initiations directly
 | 
				
			||||||
 | 
					(for example, because the API of that clock has no functionality to trigger callbacks),
 | 
				
			||||||
 | 
					then, in addition to the aforementioned offset, the driver has to use the monotonic clock
 | 
				
			||||||
 | 
					for triggering callbacks (usually via \c timerfd) and adjust the time when callbacks are
 | 
				
			||||||
 | 
					invoked such that they match the pace of that other clock.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As an example (clock speed difference exaggerated for sake of clarity), suppose the other
 | 
				
			||||||
 | 
					clock is twice as fast as the monotonic clock. Then the monotonic clock timestamps have
 | 
				
			||||||
 | 
					to be calculated in a manner that halves the durations between said timestamps, and the
 | 
				
			||||||
 | 
					\ref spa_io_clock::rate_diff field is set to 2.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The dummy node driver uses a DLL for this purpose. It is fed the difference between the
 | 
				
			||||||
 | 
					expected position (in samples) and the actual position (derived from the current time
 | 
				
			||||||
 | 
					of the driver's internal clock), passes the delta between these two quantities into the
 | 
				
			||||||
 | 
					DLL, and the DLL computes a correction factor (2.0 in the above example) which is used
 | 
				
			||||||
 | 
					for scaling durations between \c timerfd timeouts. This forms a control loop, since the
 | 
				
			||||||
 | 
					correction factor causes the durations between the timeouts to be adjusted such that the
 | 
				
			||||||
 | 
					difference between the expected position and the actual position reaches zero. Keep in
 | 
				
			||||||
 | 
					mind the notes above about \ref spa_io_clock::position being the ideal position of the
 | 
				
			||||||
 | 
					graph cycle, meaning that even in this case, the duration it is incremented by is
 | 
				
			||||||
 | 
					_not_ scaled by the correction factor; the duration in samples remains unchanged.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(Other popular control loop mechanisms that are suitable alternatives to the DLL are
 | 
				
			||||||
 | 
					PID controllers and Kalman filters.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,9 @@
 | 
				
			||||||
- \subpage page_library
 | 
					- \subpage page_library
 | 
				
			||||||
- \subpage page_dma_buf
 | 
					- \subpage page_dma_buf
 | 
				
			||||||
- \subpage page_scheduling
 | 
					- \subpage page_scheduling
 | 
				
			||||||
 | 
					- \subpage page_driver
 | 
				
			||||||
 | 
					- \subpage page_latency
 | 
				
			||||||
 | 
					- \subpage page_tag
 | 
				
			||||||
- \subpage page_native_protocol
 | 
					- \subpage page_native_protocol
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										282
									
								
								doc/dox/internals/latency.dox
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								doc/dox/internals/latency.dox
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,282 @@
 | 
				
			||||||
 | 
					/** \page page_latency Latency support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This document explains how the latency in the PipeWire graph is implemented.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use Cases
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A node port has a latency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Applications need to be able to query the latency of a port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Linked Nodes need to be informed of the latency of a port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## dynamically update port latencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It needs to be possible to dynamically update the latency of a port and this
 | 
				
			||||||
 | 
					should inform all linked ports/nodes of the updated latency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Linked nodes add latency to the signal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When two nodes/ports have a latency, the signal is delayed by the sum of
 | 
				
			||||||
 | 
					the nodes latencies.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Calculate the signal delay upstream and downstream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A node might need to know how much a signal was delayed since it arrived
 | 
				
			||||||
 | 
					in the node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A node might need to know how much the signal will be delayed before it
 | 
				
			||||||
 | 
					exists the graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Detect latency mismatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When a signal travels through 2 different parts of the graph with different
 | 
				
			||||||
 | 
					latencies and then eventually join, there is a latency mismatch. It should
 | 
				
			||||||
 | 
					be possible to detect this mismatch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Concepts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Port Latency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The fundamental object for implementing latency reporting in PipeWire is the
 | 
				
			||||||
 | 
					Latency object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It consists of a direction (input/output) and min/max latency values. The latency
 | 
				
			||||||
 | 
					values can express a latency relative to the graph quantum, the samplerate or in
 | 
				
			||||||
 | 
					nanoseconds. There is a mininum and maximum latency value in the Latency object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The direction of the latency object determines how the latency object propagates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- SPA_DIRECTION_OUTPUT Latency objects move from output ports downstream and contain
 | 
				
			||||||
 | 
					  the latency from all nodes upstream. An output latency received on an input port
 | 
				
			||||||
 | 
					  should instruct the node to update the output latency on its output ports related
 | 
				
			||||||
 | 
					  to this input port. This corresponds to the JackCaptureLatency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- SPA_DIRECTION_INPUT Latency objects move from input ports upstream and contain
 | 
				
			||||||
 | 
					  the latency from all nodes downstream. An input latency received on an output port
 | 
				
			||||||
 | 
					  should instruct the node to update the input latency on its input ports related
 | 
				
			||||||
 | 
					  to this output port. This corresponds to the JackPlaybackLatency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PipeWire will automatically propagate Latency objects from ports to all linked ports
 | 
				
			||||||
 | 
					in the graph. Output Latency objects on output ports are propagated to linked input
 | 
				
			||||||
 | 
					ports and input Latency objects on input ports are propagated to linked output ports.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If a port has links with multiple other ports, the Latency objects are merged by
 | 
				
			||||||
 | 
					taking the min of the min values and the max of the max values of all latency objects
 | 
				
			||||||
 | 
					on the other ports. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This way, Output Latency always describes the aggragated total upstream latency of
 | 
				
			||||||
 | 
					signal up to the port and Input latency describes the aggregated downstream latency
 | 
				
			||||||
 | 
					of the signal from the port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Node ProcessLatency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a per node property and applies to the latency introduced by the node
 | 
				
			||||||
 | 
					logic itself.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This mostly works if (almost) all data processing ports (input/output) participate in
 | 
				
			||||||
 | 
					the same data processing with the same latency, which is a common use case.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ProcessLatency is mostly used to easily calculate Output and Input Latency on ports.
 | 
				
			||||||
 | 
					We can simply add the ProcessLatency to all latency values in the ports Latency objects
 | 
				
			||||||
 | 
					to obtain the corresponding Latency object for the other ports.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Latency updates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Latency params on the ports can be updated as needed. This can happen because some upstream or
 | 
				
			||||||
 | 
					downstream latency changed or when the ProcessLatency of a node changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When the ProcessLatency changes, the procedure to notify of latency changes is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Take output latency on input port, add new ProcessLatency, set new latency on output
 | 
				
			||||||
 | 
					  port. This propagates the new latency downstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Take input latency on output port, add new ProcessLatency, set new latency on input
 | 
				
			||||||
 | 
					  port. This propagates the new latency upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PipeWire will automatically aggregate latency from links and propagate the new latencies
 | 
				
			||||||
 | 
					down and upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Async nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When a node has the node.async property set to true, it will be considered an async
 | 
				
			||||||
 | 
					node and will be scheduled differently, see scheduling.dox.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A link between a port of an async node and another port (async or not) is called an
 | 
				
			||||||
 | 
					async link and will have the link.async=true property.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					An async link will add 1 quantum of latency between the nodes it links. A special
 | 
				
			||||||
 | 
					exception is made for the output ports of the driver node, which do not add latency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The Latency param will be updated with 1 extra quantum when they travel over an async
 | 
				
			||||||
 | 
					link.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A source node with a given ProcessLatency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When we have a source with a ProcessLatency, for example, of 1024 samples:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +----------+     + Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					   |          FL ---+ Latency: [{ "direction": "input", "min-rate": 0, "max-rate": 0 } ]
 | 
				
			||||||
 | 
					   | source   +
 | 
				
			||||||
 | 
					   |          FR ---+ Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					   +----------+     + Latency: [{ "direction": "input", "min-rate": 0, "max-rate": 0 } ]
 | 
				
			||||||
 | 
					        ^
 | 
				
			||||||
 | 
					        |
 | 
				
			||||||
 | 
					 ProcessLatency: [  { "quantum": 0, "rate": 1024, "ns": 0 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Both output ports have an output latency of 1024 samples and no input latency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A sink node with a given ProcessLatency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When we have a sink with a ProcessLatency, for example, of 512 samples:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "output", "min-rate": 0, "max-rate": 0 } ]
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					     ^
 | 
				
			||||||
 | 
					     |      +----------+
 | 
				
			||||||
 | 
					     +---- FL          |
 | 
				
			||||||
 | 
					            | sink     | <- ProcessLatency: [  { "quantum": 0, "rate": 512, "ns": 0 } ]
 | 
				
			||||||
 | 
					     +---- FR          |
 | 
				
			||||||
 | 
					     |      +----------+
 | 
				
			||||||
 | 
					     v
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "output", "min-rate": 0, "max-rate": 0 } ]
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Both input ports have an input latency of 512 samples and no output latency.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A source and sink node linked together
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					With the source and sink from above, if we link the FL channels, the input latency
 | 
				
			||||||
 | 
					from the input port of the sink is propagated to the output port of the source
 | 
				
			||||||
 | 
					and the output latency of the output port is propagated to the input port of the
 | 
				
			||||||
 | 
					sink:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					               ^   
 | 
				
			||||||
 | 
					               |         Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					               |         Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					               |              |
 | 
				
			||||||
 | 
					   +----------+v              v+--------+
 | 
				
			||||||
 | 
					   |          FL ------------ FL        |
 | 
				
			||||||
 | 
					   | source   +                | sink   |
 | 
				
			||||||
 | 
					   |          FR --+          FR        |
 | 
				
			||||||
 | 
					   +----------+    |           +--------+
 | 
				
			||||||
 | 
					                   v
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "input", "min-rate": 0, "max-rate": 0 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Insert a latency node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If we place a node with a 256 sample latency in the above source-sink graph:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "input", "min-rate": 768, "max-rate": 768 } ]
 | 
				
			||||||
 | 
					               ^   
 | 
				
			||||||
 | 
					               |   Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					               |   Latency: [{ "direction": "input", "min-rate": 768, "max-rate": 768 } ]
 | 
				
			||||||
 | 
					               |              ^
 | 
				
			||||||
 | 
					               |              | Latency: [{ "direction": "output", "min-rate": 1280, "max-rate": 1280 } ]
 | 
				
			||||||
 | 
					               |              | Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					               |              |          ^           
 | 
				
			||||||
 | 
					               |              |          |           
 | 
				
			||||||
 | 
					   +----------+v              v+--------+v            +-------+
 | 
				
			||||||
 | 
					   |          FL ------------ FL        FL --------- FL       |
 | 
				
			||||||
 | 
					   | source   +                | node   |           ^ | sink  |
 | 
				
			||||||
 | 
					   |          .                |        .           | .       |
 | 
				
			||||||
 | 
					   +----------+                +--------+           | +-------+
 | 
				
			||||||
 | 
					                                                    v
 | 
				
			||||||
 | 
					                             Latency: [{ "direction": "output", "min-rate": 1280, "max-rate": 1280 } ]
 | 
				
			||||||
 | 
					                             Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See how the output latency propagates and is increased going downstream and the
 | 
				
			||||||
 | 
					input latency is increased and traveling upstream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Link a port to two port with different latencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When we introduce a sink2 with different input latency and link this to
 | 
				
			||||||
 | 
					the node FL output port, it will aggregate the two input latencies by
 | 
				
			||||||
 | 
					taking the min of min and max of max.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					   Latency: [{ "direction": "input", "min-rate": 768, "max-rate": 2304 } ]
 | 
				
			||||||
 | 
					               ^   
 | 
				
			||||||
 | 
					               |   Latency: [{ "direction": "output", "min-rate": 1024, "max-rate": 1024 } ]
 | 
				
			||||||
 | 
					               |   Latency: [{ "direction": "input", "min-rate": 768, "max-rate": 2304 } ]
 | 
				
			||||||
 | 
					               |              ^
 | 
				
			||||||
 | 
					               |              | Latency: [{ "direction": "output", "min-rate": 1280, "max-rate": 1280 } ]
 | 
				
			||||||
 | 
					               |              | Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 2048 } ]
 | 
				
			||||||
 | 
					               |              |          ^          
 | 
				
			||||||
 | 
					               |              |          |  Latency: [{ "direction": "output", "min-rate": 1280, "max-rate": 1280 } ]
 | 
				
			||||||
 | 
					               |              |          |  Latency: [{ "direction": "input", "min-rate": 512, "max-rate": 512 } ]
 | 
				
			||||||
 | 
					               |              |          |          ^
 | 
				
			||||||
 | 
					               |              |          |          |
 | 
				
			||||||
 | 
					   +----------+v              v+--------+v          v +-------+
 | 
				
			||||||
 | 
					   |          FL ------------ FL        FL --------- FL       |
 | 
				
			||||||
 | 
					   | source   +                | node   |  \          | sink  |
 | 
				
			||||||
 | 
					   |          .                |        .   \         .       |
 | 
				
			||||||
 | 
					   +----------+                +--------+    \        +-------+
 | 
				
			||||||
 | 
					                                              \
 | 
				
			||||||
 | 
					                                               \      +-------+
 | 
				
			||||||
 | 
											+--- FL       |
 | 
				
			||||||
 | 
					                                                    ^ | sink2 |
 | 
				
			||||||
 | 
											    | .       .
 | 
				
			||||||
 | 
					                                                    | +-------+
 | 
				
			||||||
 | 
					                                                    v
 | 
				
			||||||
 | 
					                             Latency: [{ "direction": "output", "min-rate": 1280, "max-rate": 1280 } ]
 | 
				
			||||||
 | 
					                             Latency: [{ "direction": "input", "min-rate": 2048, "max-rate": 2048 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The source node now knows that its output signal will be delayed between 768 amd 2304 samples
 | 
				
			||||||
 | 
					depending on the path in the graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We also see that node.FL has different min/max-rate input latencies. This information can be
 | 
				
			||||||
 | 
					used to insert a delay node to align the latencies again. For example, if we delay the signal
 | 
				
			||||||
 | 
					between node.FL and FL.sink with 1536 samples, the latencies will be aligned again.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## An async output stream and sink node linked together
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The sink has 1 quantum of Input latency. The stream has no output latency. When the Input latency
 | 
				
			||||||
 | 
					travels over the async link 1 quantum of latency is added and the Input latency on the stream is
 | 
				
			||||||
 | 
					now 2 quanta. Similar for the stream Output latency that receives an additional 1 quantum of
 | 
				
			||||||
 | 
					latency when it arrives in the sink over the async link.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "output", "min-quantum": 0, "max-quantum": 0 } ]
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "input", "min-quantum": 2, "max-quantum": 2 } ]
 | 
				
			||||||
 | 
					               ^
 | 
				
			||||||
 | 
					               |         Latency: [{ "direction": "output", "min-quantum": 1, "max-quantum": 1 } ]
 | 
				
			||||||
 | 
					               |         Latency: [{ "direction": "input", "min-quantum": 1, "max-quantum": 1 } ]
 | 
				
			||||||
 | 
					               |              |
 | 
				
			||||||
 | 
					   +----------+v              v+--------+
 | 
				
			||||||
 | 
					   | async    FL ------------ FL        |
 | 
				
			||||||
 | 
					   | stream   +                | sink   |
 | 
				
			||||||
 | 
					   |          FR --+          FR        |
 | 
				
			||||||
 | 
					   +----------+    |           +--------+
 | 
				
			||||||
 | 
					                   v
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "output", "min-quantum": 0, "max-quantum": 0 } ]
 | 
				
			||||||
 | 
					      Latency: [{ "direction": "input", "min-quantum": 0, "max-quantum": 0 } ]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
| 
						 | 
					@ -92,6 +92,9 @@ The media session will check the permissions on `/dev/snd/seq` before
 | 
				
			||||||
attempting to create this node. It will also use inotify to wait
 | 
					attempting to create this node. It will also use inotify to wait
 | 
				
			||||||
until the sequencer device node is accessible.
 | 
					until the sequencer device node is accessible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Currently, the session manager does not try to link control messages
 | 
				
			||||||
 | 
					automatically.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## JACK
 | 
					## JACK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
JACK assumes all `"application/control"` ports are MIDI ports.
 | 
					JACK assumes all `"application/control"` ports are MIDI ports.
 | 
				
			||||||
| 
						 | 
					@ -102,11 +105,12 @@ filtering out the \ref SPA_CONTROL_Midi, \ref SPA_CONTROL_OSC and
 | 
				
			||||||
converted to control messages in a similar way.
 | 
					converted to control messages in a similar way.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Normally, all MIDI and UMP messages are converted to MIDI1 jack events unless
 | 
					Normally, all MIDI and UMP messages are converted to MIDI1 jack events unless
 | 
				
			||||||
the JACK port was created with an explcit "32 bits raw UMP" format, in which
 | 
					the JACK port was created with an explcit "32 bit raw UMP" format or with
 | 
				
			||||||
case the raw UMP is passed to the JACK application directly. For output ports,
 | 
					the JackPortIsMIDI2 flag, in which case the raw UMP is passed to the JACK
 | 
				
			||||||
 | 
					application directly. For output ports,
 | 
				
			||||||
the JACK events are assumed to be MIDI1 and converted to UMP unless the port
 | 
					the JACK events are assumed to be MIDI1 and converted to UMP unless the port
 | 
				
			||||||
has the "32 bit raw UMP" format, in which case the UMP messages are simply
 | 
					has the "32 bit raw UMP" format or the JackPortIsMIDI2 flag, in which case
 | 
				
			||||||
passed on.
 | 
					the UMP messages are simply passed on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There is a 1 to 1 mapping between the JACK events and control
 | 
					There is a 1 to 1 mapping between the JACK events and control
 | 
				
			||||||
messages so there is no information loss or need for complicated
 | 
					messages so there is no information loss or need for complicated
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -712,7 +712,7 @@ The info event is emitted when binding or when the device information changed.
 | 
				
			||||||
      ): props
 | 
					      ): props
 | 
				
			||||||
      Struct(
 | 
					      Struct(
 | 
				
			||||||
         Int: n_params
 | 
					         Int: n_params
 | 
				
			||||||
	 ( Int: id
 | 
						 ( Id: id
 | 
				
			||||||
	   Int: flags )*
 | 
						   Int: flags )*
 | 
				
			||||||
      ): param_info
 | 
					      ): param_info
 | 
				
			||||||
   )
 | 
					   )
 | 
				
			||||||
| 
						 | 
					@ -1091,6 +1091,77 @@ It creates a server Node that can be controlled from a client. Processing will h
 | 
				
			||||||
in the client. It is used by pw-stream and pw-filter to implement the PipeWire media
 | 
					in the client. It is used by pw-stream and pw-filter to implement the PipeWire media
 | 
				
			||||||
processing nodes.
 | 
					processing nodes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To create a client-node, one must first connect to the server and then make a
 | 
				
			||||||
 | 
					ClientNode proxy and do Core::CreateObject with the client-node factory.
 | 
				
			||||||
 | 
					This will create a server side ClientNode resource that can be controlled with the
 | 
				
			||||||
 | 
					proxy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After the proxy is set up, the conversation between client and server goes as
 | 
				
			||||||
 | 
					follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   client                                    server
 | 
				
			||||||
 | 
					     |                                         |
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |        ClientNode::Update               | send initial node configuration
 | 
				
			||||||
 | 
					     |                                         |
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       Core::AddMem                      | memory for node activation
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetActivation         | the node activation
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::Transport             | the node transport
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetIO                 | clock IO
 | 
				
			||||||
 | 
					     |                                         |
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |       ClientNode::SetActive(true)       | set the node active
 | 
				
			||||||
 | 
					     |                                         |
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetParam              | optional volume restore/settings
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetParam              | optional PortConfig if needed
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |       ClientNode::Update                | Upload changed params
 | 
				
			||||||
 | 
					     |                                         |
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |       ClientNode::PortUpdate            | config for each port
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::PortSetMixInfo        | mixer inputs for each linked port
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::PortSetParam          | Latency of the ports
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetActivation         | activation of port peers
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |       ClientNode::PortUpdate            | Ack port updates
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::PortSetParam          | formats of the ports
 | 
				
			||||||
 | 
					     |---------------------------------------->|
 | 
				
			||||||
 | 
					     |       ClientNode::PortUpdate            | Ack port format update
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       Core::AddMem                      | memory for the port buffers
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::PortUseBuffers        | buffers for a port
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       Core::AddMem                      | memory for driver activation
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetActivation         | the driver activation
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::SetIO                 | driver Position IO
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       Core::AddMem                      | memory for port IO
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::PortSetIO             | buffers/async-buffers port IO
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					     |<----------------------------------------|
 | 
				
			||||||
 | 
					     |       ClientNode::Command               | Start command
 | 
				
			||||||
 | 
					     .                                         .
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## ClientNode methods
 | 
					## ClientNode methods
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### ClientNode::GetNode (Opcode 1)
 | 
					### ClientNode::GetNode (Opcode 1)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,26 +2,26 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This document tries to explain how the PipeWire graph is scheduled.
 | 
					This document tries to explain how the PipeWire graph is scheduled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Graph are constructed from linked nodes together with their ports. This
 | 
					Graphs are constructed from linked nodes together with their ports. This
 | 
				
			||||||
results in a dependency graph between nodes. Special care is taken for
 | 
					results in a dependency graph between nodes. Special care is taken for
 | 
				
			||||||
loopback links so that the graph remains a directed graph.
 | 
					loopback links so that the graph remains a directed graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Processing threads
 | 
					# Processing threads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The server (and clients) have two processing threads:
 | 
					The server (and clients) has two processing threads:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- A main thread that will do all IPC with clients and server and configures the
 | 
					- A main thread that will do all IPC with clients and server and configure the
 | 
				
			||||||
  nodes in the graph for processing.
 | 
					  nodes in the graph for processing.
 | 
				
			||||||
- A (or more) data processing thread that only does the data processing.
 | 
					- One (or more) data processing threads that only do the data processing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The data processing threads are given realtime priority and are designed to
 | 
					The data processing threads are given realtime priority and are designed to
 | 
				
			||||||
run with as little overhead as possible. All of the node resources such as
 | 
					run with as little overhead as possible. All of the node resources such as
 | 
				
			||||||
buffers, io areas and metadata will be set up in shared memory before the
 | 
					buffers, I/O areas and metadata will be set up in shared memory before the
 | 
				
			||||||
node is scheduled to run.
 | 
					node is scheduled to run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This document describes the processing that happens in the data processing
 | 
					This document describes the processing that happens in the data processing
 | 
				
			||||||
thread after the main-thread has configured it.
 | 
					thread after the main thread has configured it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Nodes
 | 
					# Nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ Each node also has:
 | 
				
			||||||
  +-v---------+
 | 
					  +-v---------+
 | 
				
			||||||
    activation {
 | 
					    activation {
 | 
				
			||||||
      status:OK,        // bitmask of NEED_DATA, HAVE_DATA or OK
 | 
					      status:OK,        // bitmask of NEED_DATA, HAVE_DATA or OK
 | 
				
			||||||
      pending:0,	// number of unsatisfied dependencies to be able to run
 | 
					      pending:0,	// number of unsatisfied dependencies needed to be able to run
 | 
				
			||||||
      required:0        // number of dependencies with other nodes
 | 
					      required:0        // number of dependencies with other nodes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ Each node also has:
 | 
				
			||||||
The activation record has the following information:
 | 
					The activation record has the following information:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 - processing state and pending dependencies. As long as there are pending dependencies
 | 
					 - processing state and pending dependencies. As long as there are pending dependencies
 | 
				
			||||||
   the node can not be processed. This is the only relevant information for actually
 | 
					   the node cannot be processed. This is the only relevant information for actually
 | 
				
			||||||
   scheduling the graph and is shown in the above illustration.
 | 
					   scheduling the graph and is shown in the above illustration.
 | 
				
			||||||
 - Current status of the node and profiling info (TRIGGERED, AWAKE, FINISHED, timestamps
 | 
					 - Current status of the node and profiling info (TRIGGERED, AWAKE, FINISHED, timestamps
 | 
				
			||||||
   when the node changed state).
 | 
					   when the node changed state).
 | 
				
			||||||
| 
						 | 
					@ -152,14 +152,15 @@ will then:
 | 
				
			||||||
 - Check the previous cycle. Did it complete? Mark xrun on unfinished nodes.
 | 
					 - Check the previous cycle. Did it complete? Mark xrun on unfinished nodes.
 | 
				
			||||||
 - Perform reposition requests if any, timebase changes, etc..
 | 
					 - Perform reposition requests if any, timebase changes, etc..
 | 
				
			||||||
 - The pending counter of each follower node is set to the required field.
 | 
					 - The pending counter of each follower node is set to the required field.
 | 
				
			||||||
 | 
					 - Update the cycle counter in the driver activation io.
 | 
				
			||||||
 - It then loops over all targets of the driver and atomically decrements the required
 | 
					 - It then loops over all targets of the driver and atomically decrements the required
 | 
				
			||||||
   field of the activation record. When the required field is 0, the eventfd is signaled
 | 
					   field of the activation record. When the required field is 0, the eventfd is signaled
 | 
				
			||||||
   and the node can be scheduled.
 | 
					   and the node can be scheduled.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In our example above, Node A and B will have their pending state decremented. Node A
 | 
					In our example above, nodes A and B will have their pending state decremented. Node A
 | 
				
			||||||
will be 0 and will be triggered first (node B has 2 pending dependencies to start with and
 | 
					will be 0 and will be triggered first (node B has 2 pending dependencies to start with and
 | 
				
			||||||
will not be triggered yet). The driver itself also has 2 dependencies left and will not
 | 
					will not be triggered yet). The driver itself also has 2 dependencies left and will not
 | 
				
			||||||
be triggered (complete) yet.
 | 
					be triggered (completed) yet.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Scheduling node A
 | 
					## Scheduling node A
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,7 +172,7 @@ After processing, node A goes through the list of targets and decrements each pe
 | 
				
			||||||
field (node A has a reference to B and the driver).
 | 
					field (node A has a reference to B and the driver).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In our above example, the driver is decremented (from 2 to 1) but is not yet triggered.
 | 
					In our above example, the driver is decremented (from 2 to 1) but is not yet triggered.
 | 
				
			||||||
node B is decremented (from 1 to 0) and is triggered by writing to the eventfd.
 | 
					Node B is decremented (from 1 to 0) and is triggered by writing to the eventfd.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Scheduling node B
 | 
					## Scheduling node B
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -184,11 +185,131 @@ driver (from 1 to 0) and triggers the driver.
 | 
				
			||||||
The graph always completes after the driver is triggered and scheduled. All required
 | 
					The graph always completes after the driver is triggered and scheduled. All required
 | 
				
			||||||
fields from all the nodes in the target list of the driver are now 0.
 | 
					fields from all the nodes in the target list of the driver are now 0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The driver calculates some stats about cpu time etc.
 | 
					The driver calculates some stats about CPU time etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Remote nodes.
 | 
					# Async scheduling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For remote nodes, the eventfd and the activation is transferred from the server
 | 
					When a node has the node.async property set to true, it will be considered an async
 | 
				
			||||||
 | 
					node and will be scheduled differently.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Async nodes don't increment the pending counter of their peers and the upstream peers
 | 
				
			||||||
 | 
					also don't increment the async node pending counters. Only the driver increments the
 | 
				
			||||||
 | 
					pending counter to the async node.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This means that the async nodes do not depend on any other node and also are not a
 | 
				
			||||||
 | 
					dependency for other nodes. This also means that the async nodes can be scheduled as
 | 
				
			||||||
 | 
					soon as the driver has started the graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The completion of the async node does not influence the completion of the graph in
 | 
				
			||||||
 | 
					any way and async nodes are therefore interesting when real-time performance can not
 | 
				
			||||||
 | 
					be guaranteed, for example when the processing threads are not running with a real-time
 | 
				
			||||||
 | 
					priority.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A link between a port of an async node and another port (async or not) is called an
 | 
				
			||||||
 | 
					async link and will have the link.async=true property.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Because async nodes then run concurrently with other nodes, a method must be in place
 | 
				
			||||||
 | 
					to avoid concurrent access to buffer data. This is done by sending a spa_io_async_buffers
 | 
				
			||||||
 | 
					I/O to the (mixer) ports of an async link. The spa_io_async_buffers has 2 spa_io_buffer
 | 
				
			||||||
 | 
					slots.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The driver will increment a cycle counter for each cycle that it starts. Output ports
 | 
				
			||||||
 | 
					will write to the spa_io_async_buffers (cycle+1)&1 slot and input ports will read from
 | 
				
			||||||
 | 
					(cycle&1) slots. This way the async node will always consume the output of the previous
 | 
				
			||||||
 | 
					cycle and will provide data for the next cycle. They will therefore always add 1 cycle
 | 
				
			||||||
 | 
					of latency in the graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A special exception is made for the output ports of the driver node. When the driver is
 | 
				
			||||||
 | 
					started, the output port buffers are copied to the previous cycle spa_io_buffer slot.
 | 
				
			||||||
 | 
					This way, the async nodes will immediately pick up the new data from the driver source.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Because there are 2 buffers in flight on the spa_io_async_buffers I/O area, the link needs
 | 
				
			||||||
 | 
					to negotiate at least 2 buffers for this to work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A, B, C are async nodes and have async links between their ports. The async
 | 
				
			||||||
 | 
					link has the spa_io_async_buffers with 2 slots (named 0 and 1) below. All the
 | 
				
			||||||
 | 
					slots are empty.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					   | A      |          |  B    |          |    C  |
 | 
				
			||||||
 | 
					   |        0 -(   )-> 0       0 -(   )-> 0       |
 | 
				
			||||||
 | 
					   |        1  (   )   1       1  (   )   1       |
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cycle 0: A produces a buffer AB0 on the output port in the (cycle+1)&1 slot (1).
 | 
				
			||||||
 | 
					         B consumes slot cycle&1 (0) with the empty buffer and produces BC0 in slot 1
 | 
				
			||||||
 | 
					         C consumes slot cycle&1 (0) with the empty buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					   | A      |          |  B    |          |    C  |
 | 
				
			||||||
 | 
					   |  (AB0) 0 -(   )-> 0 (   ) 0 -(   )-> 0 (   ) |
 | 
				
			||||||
 | 
					   |        1  (AB0)   1       1  (BC0)   1       |
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cycle 1: A produces a buffer AB1 on the output port in the (cycle+1)&1 slot (0).
 | 
				
			||||||
 | 
					         B consumes slot cycle&1 (1) with buffer AB0 and produces BC1 in slot 0
 | 
				
			||||||
 | 
					         C consumes slot cycle&1 (1) with buffer BC0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					   | A      |          |  B    |          |    C  |
 | 
				
			||||||
 | 
					   |  (AB1) 0 -(AB1)-> 0 (AB0) 0 -(BC1)-> 0 (BC0) |
 | 
				
			||||||
 | 
					   |        1  (AB0)   1       1  (BC0)   1       |
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cycle 2: A produces a buffer AB2 on the output port in the (cycle+1)&1 slot (1).
 | 
				
			||||||
 | 
					         B consumes slot cycle&1 (0) with buffer AB1 and produces BC2 in slot 1
 | 
				
			||||||
 | 
					         C consumes slot cycle&1 (0) with buffer BC1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					   | A      |          |  B    |          |    C  |
 | 
				
			||||||
 | 
					   |  (AB2) 0 -(AB1)-> 0 (AB1) 0 -(BC1)-> 0 (BC1) |
 | 
				
			||||||
 | 
					   |        1  (AB2)   1       1  (BC2)   1       |
 | 
				
			||||||
 | 
					   +--------+          +-------+          +-------+
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each async link adds 1 cycle of latency to the chain. Notice how AB0 from cycle 0,
 | 
				
			||||||
 | 
					produces BC1 in cycle 1, which arrives in node C at cycle 2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Latency reporting
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Because the latency is really introduced by the links, the additional cycle of
 | 
				
			||||||
 | 
					latency is added when the SPA_PARAM_Latency is copied between the output and
 | 
				
			||||||
 | 
					input ports of a link.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It is possible for a sync node A to be linked to another sync node D and an
 | 
				
			||||||
 | 
					async node B:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					   +--------+          +-------+
 | 
				
			||||||
 | 
					   | A      |          |  B    |
 | 
				
			||||||
 | 
					   |  (AB1) 0 -(AB1)-> 0 (AB0) 0 ...
 | 
				
			||||||
 | 
					   |        1 \(AB0)   1       1
 | 
				
			||||||
 | 
					   +--------+  \       +-------+
 | 
				
			||||||
 | 
					                \
 | 
				
			||||||
 | 
					                 \          +-------+
 | 
				
			||||||
 | 
					                  \         |  D    |
 | 
				
			||||||
 | 
					                   -(AB1)-> 0 (AB1) |
 | 
				
			||||||
 | 
					                            |       |
 | 
				
			||||||
 | 
					                            +-------+
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The output latency on A's output port is what A reports. When it is copied to the
 | 
				
			||||||
 | 
					input port of B, 1 cycle is added and when it is copied to D, nothing is added.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Remote nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For remote nodes, the eventfd and the activation are transferred from the server
 | 
				
			||||||
to the client.
 | 
					to the client.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This means that writing to the remote client eventfd will wake the client directly
 | 
					This means that writing to the remote client eventfd will wake the client directly
 | 
				
			||||||
| 
						 | 
					@ -198,7 +319,7 @@ All remote clients also get the activation and eventfd of the peer and driver th
 | 
				
			||||||
are linked to and can directly trigger peers and drivers without going to the
 | 
					are linked to and can directly trigger peers and drivers without going to the
 | 
				
			||||||
server first.
 | 
					server first.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Remote driver nodes.
 | 
					## Remote driver nodes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Remote drivers start the graph cycle directly without going to the server first.
 | 
					Remote drivers start the graph cycle directly without going to the server first.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +327,8 @@ After they complete (and only when the profiler is active), they will trigger an
 | 
				
			||||||
extra eventfd to signal the server that the graph completed. This is used by the
 | 
					extra eventfd to signal the server that the graph completed. This is used by the
 | 
				
			||||||
server to generate the profiler info.
 | 
					server to generate the profiler info.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Lazy scheduling
 | 
					
 | 
				
			||||||
 | 
					# Lazy scheduling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Normally, a driver will wake up the graph and all the followers need to process
 | 
					Normally, a driver will wake up the graph and all the followers need to process
 | 
				
			||||||
the data in sync. There are cases where:
 | 
					the data in sync. There are cases where:
 | 
				
			||||||
| 
						 | 
					@ -228,7 +350,7 @@ When the graph is started or partially controlled by RequestProcess events and
 | 
				
			||||||
commands we say we have lazy scheduling. The driver is not always scheduling according
 | 
					commands we say we have lazy scheduling. The driver is not always scheduling according
 | 
				
			||||||
to its own rhythm but also depending on the follower.
 | 
					to its own rhythm but also depending on the follower.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We can't just enable lazy scheduling when no follower will emit RequestProcess events
 | 
					We cannot just enable lazy scheduling when no follower will emit RequestProcess events
 | 
				
			||||||
or when no driver will listen for RequestProcess commands. Two new node properties are
 | 
					or when no driver will listen for RequestProcess commands. Two new node properties are
 | 
				
			||||||
defined:
 | 
					defined:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -243,9 +365,9 @@ defined:
 | 
				
			||||||
  >1 means request events as a follower are supported with increasing preference
 | 
					  >1 means request events as a follower are supported with increasing preference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 We can only enable lazy scheduling when both the driver and (at least one) follower
 | 
					 We can only enable lazy scheduling when both the driver and (at least one) follower
 | 
				
			||||||
 has the node.supports-lazy and node.supports-request property respectively.
 | 
					 have the node.supports-lazy and node.supports-request properties respectively.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 Node can end up as a driver (is_driver()) and lazy scheduling can be enabled (is_lazy()),
 | 
					 Nodes can end up as a driver (is_driver()) and lazy scheduling can be enabled (is_lazy()),
 | 
				
			||||||
 which results in the following cases:
 | 
					 which results in the following cases:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  driver producer
 | 
					  driver producer
 | 
				
			||||||
| 
						 | 
					@ -302,7 +424,7 @@ Some use cases:
 | 
				
			||||||
    consumer
 | 
					    consumer
 | 
				
			||||||
      - node.driver = false
 | 
					      - node.driver = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    -> producer selected as driver, consumer is simple follower.
 | 
					    -> producer selected as driver, consumer is a simple follower.
 | 
				
			||||||
       lazy scheduling inactive (no lazy driver or no request follower)
 | 
					       lazy scheduling inactive (no lazy driver or no request follower)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										70
									
								
								doc/dox/internals/tag.dox
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								doc/dox/internals/tag.dox
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,70 @@
 | 
				
			||||||
 | 
					/** \page page_tag Tag support
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This document explains how stream specific metadata is transported in
 | 
				
			||||||
 | 
					the PipeWire graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The metadata is a dictionary of string key/value pairs with information
 | 
				
			||||||
 | 
					such as the author, track, copyright, album information etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use Cases
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## A stream/node/port has some metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Applications need to be able to query the Tag of a port/node/stream.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Linked Nodes need to be informed of the upstream and downstream tags.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## dynamically update tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It needs to be possible to dynamically update the tags of a port/node/stream
 | 
				
			||||||
 | 
					and this should inform all linked ports/nodes of the updated tags.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Aggregate tags upstream and downstream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A node might need to know all the upstream and downstream tags. Each node can
 | 
				
			||||||
 | 
					add or remove metadata in the Tag param.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A mixer node might need to combine the Tags of the two input streams and
 | 
				
			||||||
 | 
					generate a combined tag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Concepts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Port Tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The fundamental object for implementing metadata reporting in PipeWire is the
 | 
				
			||||||
 | 
					Tag object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It consists of a direction (input/output) and one or more generic dictionaries
 | 
				
			||||||
 | 
					with string key/value pairs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The direction of the tag object determines how the object propagates in the graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- SPA_DIRECTION_OUTPUT Tag objects move from output ports downstream and contain
 | 
				
			||||||
 | 
					  the metadata from all nodes upstream. An output tag received on an input port
 | 
				
			||||||
 | 
					  should instruct the node to update the output tag on its output ports related
 | 
				
			||||||
 | 
					  to this input port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- SPA_DIRECTION_INPUT Tag objects move from input ports upstream and contain
 | 
				
			||||||
 | 
					  the metadata from all nodes downstream. An input tag received on an output port
 | 
				
			||||||
 | 
					  should instruct the node to update the input tag on its input ports related
 | 
				
			||||||
 | 
					  to this output port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PipeWire will automatically propagate Tag objects from ports to all linked ports
 | 
				
			||||||
 | 
					in the graph. Output Tag objects on output ports are propagated to linked input
 | 
				
			||||||
 | 
					ports and input Tag objects on input ports are propagated to linked output ports.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If a port has links with multiple other ports, the Tag objects are merged by
 | 
				
			||||||
 | 
					appending the dictionaties to the Tag param. Intermediate nodes or sinks are allowed
 | 
				
			||||||
 | 
					to take the multiple dictionaries in a Tag and combine them into one dictionary if
 | 
				
			||||||
 | 
					they would like to do so.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This way, Output Tag always describes the aggragated total upstream metadata of
 | 
				
			||||||
 | 
					signal up to the port and Input tag describes the aggregated downstream metadata
 | 
				
			||||||
 | 
					of the signal from the port.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tag updates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Tag params on the ports can be updated as needed. This can happen because some upstream or
 | 
				
			||||||
 | 
					downstream Tag changed or when the metadata of a node/port/stream changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,10 @@ Play and record media with PipeWire
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**pw-midirecord** \[*options*\] \[*FILE* \| -\]
 | 
					**pw-midirecord** \[*options*\] \[*FILE* \| -\]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**pw-midi2play** \[*options*\] \[*FILE* \| -\]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**pw-midi2record** \[*options*\] \[*FILE* \| -\]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**pw-dsdplay** \[*options*\] \[*FILE* \| -\]
 | 
					**pw-dsdplay** \[*options*\] \[*FILE* \| -\]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# DESCRIPTION
 | 
					# DESCRIPTION
 | 
				
			||||||
| 
						 | 
					@ -24,10 +28,10 @@ supported by `libsndfile` for PCM capture and playback. When capturing
 | 
				
			||||||
PCM, the filename extension is used to guess the file format with the
 | 
					PCM, the filename extension is used to guess the file format with the
 | 
				
			||||||
WAV file format as the default.
 | 
					WAV file format as the default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It understands standard MIDI files for playback and recording. This tool
 | 
					It understands standard MIDI files and MIDI 2.0 clip files for playback
 | 
				
			||||||
will not render MIDI files, it will simply make the MIDI events
 | 
					and recording. This tool will not render MIDI files, it will simply make
 | 
				
			||||||
available to the graph. You need a MIDI renderer such as qsynth,
 | 
					the MIDI events available to the graph. You need a MIDI renderer such as
 | 
				
			||||||
timidity or a hardware MIDI rendered to hear the MIDI.
 | 
					qsynth, timidity or a hardware MIDI renderer to hear the MIDI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DSD playback is supported with the DSF file format. This tool will only
 | 
					DSD playback is supported with the DSF file format. This tool will only
 | 
				
			||||||
work with native DSD capable hardware and will produce an error when no
 | 
					work with native DSD capable hardware and will produce an error when no
 | 
				
			||||||
| 
						 | 
					@ -53,13 +57,13 @@ connection is made to the default PipeWire instance.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par -p | \--playback
 | 
					\par -p | \--playback
 | 
				
			||||||
Playback mode. Read data from the specified file, and play it back. If
 | 
					Playback mode. Read data from the specified file, and play it back. If
 | 
				
			||||||
the tool is called under the name **pw-play** or **pw-midiplay** this is
 | 
					the tool is called under the name **pw-play**, **pw-midiplay** or
 | 
				
			||||||
the default.
 | 
					**pw-midi2play** this is the default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par -r | \--record
 | 
					\par -r | \--record
 | 
				
			||||||
Recording mode. Capture data and write it to the specified file. If the
 | 
					Recording mode. Capture data and write it to the specified file. If the
 | 
				
			||||||
tool is called under the name **pw-record** or **pw-midirecord** this is
 | 
					tool is called under the name **pw-record**, **pw-midirecord** or
 | 
				
			||||||
the default.
 | 
					**pw-midi2record** this is the default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par -m | \--midi
 | 
					\par -m | \--midi
 | 
				
			||||||
MIDI mode. *FILE* is a MIDI file. If the tool is called under the name
 | 
					MIDI mode. *FILE* is a MIDI file. If the tool is called under the name
 | 
				
			||||||
| 
						 | 
					@ -69,6 +73,14 @@ simply provide the MIDI events in the graph. You need a separate MIDI
 | 
				
			||||||
renderer such as qsynth, timidity or a hardware renderer to hear the
 | 
					renderer such as qsynth, timidity or a hardware renderer to hear the
 | 
				
			||||||
MIDI.
 | 
					MIDI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\par -c | \--midi-clip
 | 
				
			||||||
 | 
					MIDI 2.0 clip mode. *FILE* is a MIDI 2.0 clip file. If the tool is called
 | 
				
			||||||
 | 
					under the name **pw-midi2play** or **pw-midi2record** this is the default.
 | 
				
			||||||
 | 
					Note that this program will *not* render the MIDI events into audible
 | 
				
			||||||
 | 
					samples, it will simply provide the MIDI events in the graph. You need a
 | 
				
			||||||
 | 
					separate MIDI renderer such as qsynth, timidity or a hardware renderer to
 | 
				
			||||||
 | 
					hear the MIDI.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par -d | \--dsd
 | 
					\par -d | \--dsd
 | 
				
			||||||
DSD mode. *FILE* is a DSF file. If the tool is called under the name
 | 
					DSD mode. *FILE* is a DSF file. If the tool is called under the name
 | 
				
			||||||
**pw-dsdplay** this is the default. Note that this program will *not*
 | 
					**pw-dsdplay** this is the default. Note that this program will *not*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,10 @@ for many commands.
 | 
				
			||||||
\par quit | q
 | 
					\par quit | q
 | 
				
			||||||
Exit from **pw-cli**
 | 
					Exit from **pw-cli**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\par list-vars
 | 
				
			||||||
 | 
					List all currently known variables and their type. Some commands create
 | 
				
			||||||
 | 
					objects that are identified with a variable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# MODULE MANAGEMENT
 | 
					# MODULE MANAGEMENT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Modules are loaded and unloaded in the local instance, thus the pw-cli
 | 
					Modules are loaded and unloaded in the local instance, thus the pw-cli
 | 
				
			||||||
| 
						 | 
					@ -48,12 +52,12 @@ For most modules it is OK to be loaded more than once.
 | 
				
			||||||
This command returns a module variable that can be used to unload the
 | 
					This command returns a module variable that can be used to unload the
 | 
				
			||||||
module.
 | 
					module.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The locally module is *not* visible in the remote instance. It is not
 | 
					The local module is *not* visible in the remote instance. It is not
 | 
				
			||||||
possible in PipeWire to load modules in a remote instance.
 | 
					possible in PipeWire to load modules in a remote instance.
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par unload-module *module-var*
 | 
					\par unload-module *module-var*
 | 
				
			||||||
Unload a module, specified either by its variable.
 | 
					Unload a module, specified by its variable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# OBJECT INTROSPECTION
 | 
					# OBJECT INTROSPECTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@ The PipeWire Link Command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# SYNOPSIS
 | 
					# SYNOPSIS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**pw-link** \[*options*\] -o-l \[*out-pattern*\] \[*in-pattern*\]
 | 
					**pw-link** \[*options*\] -o|-i|-l|-t \[*out-pattern*\] \[*in-pattern*\]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**pw-link** \[*options*\] *output* *input*
 | 
					**pw-link** \[*options*\] *output* *input*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,9 @@ List input ports
 | 
				
			||||||
\par -l | \--links
 | 
					\par -l | \--links
 | 
				
			||||||
List links
 | 
					List links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\par -t | \--latency
 | 
				
			||||||
 | 
					List port latencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\par -m | \--monitor
 | 
					\par -m | \--monitor
 | 
				
			||||||
Monitor links and ports. **pw-link** will not exit but monitor and print
 | 
					Monitor links and ports. **pw-link** will not exit but monitor and print
 | 
				
			||||||
new and destroyed ports or links.
 | 
					new and destroyed ports or links.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ node and device statistics.
 | 
				
			||||||
A hierarchical view is shown of Driver nodes and follower nodes. The
 | 
					A hierarchical view is shown of Driver nodes and follower nodes. The
 | 
				
			||||||
Driver nodes are actively using a timer to schedule dataflow in the
 | 
					Driver nodes are actively using a timer to schedule dataflow in the
 | 
				
			||||||
followers. The followers of a driver node as shown below their driver
 | 
					followers. The followers of a driver node as shown below their driver
 | 
				
			||||||
with a + sign in a tree-like representation.
 | 
					with a + sign (or = for async nodes) in a tree-like representation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The columns presented are as follows:
 | 
					The columns presented are as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,10 +173,20 @@ For Video formats, the layout is \<pixelformat\>
 | 
				
			||||||
\parblock
 | 
					\parblock
 | 
				
			||||||
Name assigned to the device/node, as found in *pw-dump* node.name
 | 
					Name assigned to the device/node, as found in *pw-dump* node.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Names are prefixed by *+* when they are linked to a driver (entry
 | 
					Names are prefixed by *+*/*=* when they are linked to a driver (entry
 | 
				
			||||||
above with no +)
 | 
					above with no +/=)
 | 
				
			||||||
\endparblock
 | 
					\endparblock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# COMMANDS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following keys can be used in the interactive mode:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\par q
 | 
				
			||||||
 | 
					Quit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\par c
 | 
				
			||||||
 | 
					Clear the ERR counters. This does *not* clear the counters globally,
 | 
				
			||||||
 | 
					it will only reset the counters in this instance of *pw-top*.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# OPTIONS
 | 
					# OPTIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,12 +9,12 @@ PipeWire API step-by-step with simple short examples.
 | 
				
			||||||
- \subpage page_tutorial4
 | 
					- \subpage page_tutorial4
 | 
				
			||||||
- \subpage page_tutorial5
 | 
					- \subpage page_tutorial5
 | 
				
			||||||
- \subpage page_tutorial6
 | 
					- \subpage page_tutorial6
 | 
				
			||||||
 | 
					- \subpage page_tutorial7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# More Example Programs
 | 
					# More Example Programs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- \ref audio-src.c "": \snippet{doc} audio-src.c title
 | 
					- \ref audio-src.c "": \snippet{doc} audio-src.c title
 | 
				
			||||||
- \ref audio-dsp-filter.c "": \snippet{doc} audio-dsp-filter.c title
 | 
					 | 
				
			||||||
- \ref video-play.c "": \snippet{doc} video-play.c title
 | 
					- \ref video-play.c "": \snippet{doc} video-play.c title
 | 
				
			||||||
- \subpage page_examples
 | 
					- \subpage page_examples
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
/** \page page_tutorial6 Tutorial - Part 6: Binding Objects
 | 
					/** \page page_tutorial6 Tutorial - Part 6: Binding Objects
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\ref page_tutorial5 | \ref page_tutorial "Index"
 | 
					\ref page_tutorial5 | \ref page_tutorial "Index" | \ref page_tutorial7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In this tutorial we show how to bind to an object so that we can
 | 
					In this tutorial we show how to bind to an object so that we can
 | 
				
			||||||
receive events and call methods on the object.
 | 
					receive events and call methods on the object.
 | 
				
			||||||
| 
						 | 
					@ -64,6 +64,6 @@ you created. Otherwise, they will be leaked:
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
\endcode
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\ref page_tutorial5 | \ref page_tutorial "Index"
 | 
					\ref page_tutorial5 | \ref page_tutorial "Index" | \ref page_tutorial7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										242
									
								
								doc/dox/tutorial/tutorial7.dox
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								doc/dox/tutorial/tutorial7.dox
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,242 @@
 | 
				
			||||||
 | 
					/** \page page_tutorial7 Tutorial - Part 7: Creating an Audio DSP Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ref page_tutorial6 | \ref page_tutorial "Index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In this tutorial we show how to use \ref pw_filter "pw_filter" to create
 | 
				
			||||||
 | 
					a real-time audio processing filter. This is useful for implementing audio
 | 
				
			||||||
 | 
					effects, equalizers, analyzers, and other DSP applications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Let's take a look at the code before we break it down:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\snippet tutorial7.c code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Save as tutorial7.c and compile with:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gcc -Wall tutorial7.c -o tutorial7 -lm $(pkg-config --cflags --libs libpipewire-0.3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Overview
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unlike \ref pw_stream "pw_stream" which is designed for applications that
 | 
				
			||||||
 | 
					produce or consume audio data, \ref pw_filter "pw_filter" is designed for
 | 
				
			||||||
 | 
					applications that process existing audio streams. Filters have both input
 | 
				
			||||||
 | 
					and output ports and operate in the DSP domain using 32-bit floating point
 | 
				
			||||||
 | 
					samples.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Setting up the Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We start with the usual boilerplate and define our data structure:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					struct data {
 | 
				
			||||||
 | 
						struct pw_main_loop *loop;
 | 
				
			||||||
 | 
						struct pw_filter *filter;
 | 
				
			||||||
 | 
						struct port *in_port;
 | 
				
			||||||
 | 
						struct port *out_port;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The filter object manages both input and output ports. Each port represents
 | 
				
			||||||
 | 
					an audio channel that can be connected to other applications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Creating the Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					data.filter = pw_filter_new_simple(
 | 
				
			||||||
 | 
							pw_main_loop_get_loop(data.loop),
 | 
				
			||||||
 | 
							"audio-filter",
 | 
				
			||||||
 | 
							pw_properties_new(
 | 
				
			||||||
 | 
								PW_KEY_MEDIA_TYPE, "Audio",
 | 
				
			||||||
 | 
								PW_KEY_MEDIA_CATEGORY, "Filter",
 | 
				
			||||||
 | 
								PW_KEY_MEDIA_ROLE, "DSP",
 | 
				
			||||||
 | 
								NULL),
 | 
				
			||||||
 | 
							&filter_events,
 | 
				
			||||||
 | 
							&data);
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					We use `pw_filter_new_simple()` which automatically manages the core connection
 | 
				
			||||||
 | 
					for us. The properties are important:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `PW_KEY_MEDIA_TYPE`: "Audio" indicates this is an audio filter
 | 
				
			||||||
 | 
					- `PW_KEY_MEDIA_CATEGORY`: "Filter" tells the session manager this processes audio
 | 
				
			||||||
 | 
					- `PW_KEY_MEDIA_ROLE`: "DSP" indicates this is for audio processing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Adding Ports
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Next we add input and output ports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					data.in_port = pw_filter_add_port(data.filter,
 | 
				
			||||||
 | 
							PW_DIRECTION_INPUT,
 | 
				
			||||||
 | 
							PW_FILTER_PORT_FLAG_MAP_BUFFERS,
 | 
				
			||||||
 | 
							sizeof(struct port),
 | 
				
			||||||
 | 
							pw_properties_new(
 | 
				
			||||||
 | 
								PW_KEY_FORMAT_DSP, "32 bit float mono audio",
 | 
				
			||||||
 | 
								PW_KEY_PORT_NAME, "input",
 | 
				
			||||||
 | 
								NULL),
 | 
				
			||||||
 | 
							NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					data.out_port = pw_filter_add_port(data.filter,
 | 
				
			||||||
 | 
							PW_DIRECTION_OUTPUT,
 | 
				
			||||||
 | 
							PW_FILTER_PORT_FLAG_MAP_BUFFERS,
 | 
				
			||||||
 | 
							sizeof(struct port),
 | 
				
			||||||
 | 
							pw_properties_new(
 | 
				
			||||||
 | 
								PW_KEY_FORMAT_DSP, "32 bit float mono audio",
 | 
				
			||||||
 | 
								PW_KEY_PORT_NAME, "output",
 | 
				
			||||||
 | 
								NULL),
 | 
				
			||||||
 | 
							NULL, 0);
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Key points about filter ports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `PW_DIRECTION_INPUT` and `PW_DIRECTION_OUTPUT` specify the port direction
 | 
				
			||||||
 | 
					- `PW_FILTER_PORT_FLAG_MAP_BUFFERS` allows direct memory access to buffers
 | 
				
			||||||
 | 
					- `PW_KEY_FORMAT_DSP` indicates this uses 32-bit float DSP format
 | 
				
			||||||
 | 
					- DSP ports work with normalized floating-point samples (typically -1.0 to 1.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Setting Process Latency
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					params[n_params++] = spa_process_latency_build(&b,
 | 
				
			||||||
 | 
							SPA_PARAM_ProcessLatency,
 | 
				
			||||||
 | 
							&SPA_PROCESS_LATENCY_INFO_INIT(
 | 
				
			||||||
 | 
								.ns = 10 * SPA_NSEC_PER_MSEC
 | 
				
			||||||
 | 
							));
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This tells PipeWire that our filter adds 10 milliseconds of processing latency.
 | 
				
			||||||
 | 
					This information helps the audio system maintain proper timing and latency
 | 
				
			||||||
 | 
					compensation throughout the audio graph.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Connecting the Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					if (pw_filter_connect(data.filter,
 | 
				
			||||||
 | 
								PW_FILTER_FLAG_RT_PROCESS,
 | 
				
			||||||
 | 
								params, n_params) < 0) {
 | 
				
			||||||
 | 
						fprintf(stderr, "can't connect\n");
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `PW_FILTER_FLAG_RT_PROCESS` flag ensures our process callback runs in the
 | 
				
			||||||
 | 
					real-time audio thread. This is crucial for low-latency audio processing but
 | 
				
			||||||
 | 
					means our process function must be real-time safe (no allocations, file I/O,
 | 
				
			||||||
 | 
					or blocking operations).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## The Process Callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The heart of the filter is the process callback:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\snippet tutorial7.c on_process
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The process function is called for each audio buffer and works as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Get the number of samples to process from `position->clock.duration`
 | 
				
			||||||
 | 
					2. Get input and output buffer pointers using `pw_filter_get_dsp_buffer()`
 | 
				
			||||||
 | 
					3. Process the audio data (here we just copy input to output)
 | 
				
			||||||
 | 
					4. The framework handles queueing the processed buffers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Key Points about DSP Processing:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- **Float Format**: DSP buffers use 32-bit float samples, typically normalized to [-1.0, 1.0]
 | 
				
			||||||
 | 
					- **Real-time Safe**: The process function runs in the audio thread and must be real-time safe
 | 
				
			||||||
 | 
					- **Buffer Management**: `pw_filter_get_dsp_buffer()` handles the buffer lifecycle automatically
 | 
				
			||||||
 | 
					- **Sample-accurate**: Processing happens at the audio sample rate with precise timing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Advanced Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This example shows a simple passthrough, but you can implement any audio processing:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\code{.c}
 | 
				
			||||||
 | 
					/* Example: Simple volume control */
 | 
				
			||||||
 | 
					for (uint32_t i = 0; i < n_samples; i++) {
 | 
				
			||||||
 | 
					    out[i] = in[i] * 0.5f;  // Reduce volume by half
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Example: Simple high-pass filter */
 | 
				
			||||||
 | 
					static float last_sample = 0.0f;
 | 
				
			||||||
 | 
					float alpha = 0.99f;
 | 
				
			||||||
 | 
					for (uint32_t i = 0; i < n_samples; i++) {
 | 
				
			||||||
 | 
					    out[i] = alpha * (out[i] + in[i] - last_sample);
 | 
				
			||||||
 | 
					    last_sample = in[i];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Comparison with pw_stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| Feature | pw_stream | pw_filter |
 | 
				
			||||||
 | 
					|---------|-----------|-----------|
 | 
				
			||||||
 | 
					| **Use case** | Audio playback/recording | Audio processing/effects |
 | 
				
			||||||
 | 
					| **Data format** | Various (S16, S32, etc.) | 32-bit float DSP |
 | 
				
			||||||
 | 
					| **Ports** | Single direction | Input and output |
 | 
				
			||||||
 | 
					| **Buffer management** | Manual queue/dequeue | Automatic via get_dsp_buffer |
 | 
				
			||||||
 | 
					| **Typical apps** | Media players, recorders | Equalizers, effects, analyzers |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Connecting and Linking the Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Manual Linking Options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Filters require manual connection by design. You can connect them using:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Using pw-link command line:
 | 
				
			||||||
 | 
					\code{.sh}
 | 
				
			||||||
 | 
					# List output ports (sources)
 | 
				
			||||||
 | 
					pw-link -o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# List input ports (sinks)
 | 
				
			||||||
 | 
					pw-link -i
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# List existing connections
 | 
				
			||||||
 | 
					pw-link -l
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Connect a source to filter input
 | 
				
			||||||
 | 
					pw-link "source_app:output_FL" "audio-filter:input"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Connect filter output to sink
 | 
				
			||||||
 | 
					pw-link "audio-filter:output" "sink_app:input_FL"
 | 
				
			||||||
 | 
					\endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Understanding Filter Auto-Connection Behavior
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Important**: Unlike audio sources and sinks, filters are **not automatically connected** by WirePlumber. This is by design because filters are meant to be explicitly inserted into audio chains where needed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Why filters don't auto-connect**:
 | 
				
			||||||
 | 
					- Filters process existing audio streams rather than generate/consume them
 | 
				
			||||||
 | 
					- Auto-connecting filters could create unwanted audio processing
 | 
				
			||||||
 | 
					- Filters typically require specific placement in the audio graph
 | 
				
			||||||
 | 
					- Manual connection gives users control over when/where effects are applied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Testing the Filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The filter requires manual connection to test. Here's the recommended workflow:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. **Start an audio source** (e.g., `pw-play music.wav`)
 | 
				
			||||||
 | 
					2. **Run your filter** (`./tutorial7`)
 | 
				
			||||||
 | 
					3. **Check available ports**:
 | 
				
			||||||
 | 
					   ```sh
 | 
				
			||||||
 | 
					   # List output ports
 | 
				
			||||||
 | 
					   pw-link -o | grep -E "(pw-play|audio-filter)"
 | 
				
			||||||
 | 
					   # List input ports
 | 
				
			||||||
 | 
					   pw-link -i | grep -E "(audio-filter|playback)"
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					4. **Connect the audio chain manually**:
 | 
				
			||||||
 | 
					   ```sh
 | 
				
			||||||
 | 
					   # Connect source -> filter -> sink
 | 
				
			||||||
 | 
					   pw-link "pw-play:output_FL" "audio-filter:input"
 | 
				
			||||||
 | 
					   pw-link "audio-filter:output" "alsa_output.pci-0000_00_1f.3.analog-stereo:playback_FL"
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You should hear the audio pass through your filter. Modify the process function
 | 
				
			||||||
 | 
					to add effects like volume changes, filtering, or other audio processing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Alternative: Use a patchbay tool**
 | 
				
			||||||
 | 
					- **Helvum**: `flatpak install flathub org.pipewire.Helvum`
 | 
				
			||||||
 | 
					- **qpwgraph**: Available in most Linux distributions
 | 
				
			||||||
 | 
					- **Carla**: Full-featured audio plugin host
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These tools provide graphical interfaces for connecting PipeWire nodes and are ideal for experimenting with filter placement.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\ref page_tutorial6 | \ref page_tutorial "Index"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										152
									
								
								doc/examples/tutorial7.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								doc/examples/tutorial7.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,152 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					  [title]
 | 
				
			||||||
 | 
					  \ref page_tutorial7
 | 
				
			||||||
 | 
					  [title]
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					/* [code] */
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/latency-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <pipewire/pipewire.h>
 | 
				
			||||||
 | 
					#include <pipewire/filter.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct port {
 | 
				
			||||||
 | 
						struct data *data;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct data {
 | 
				
			||||||
 | 
						struct pw_main_loop *loop;
 | 
				
			||||||
 | 
						struct pw_filter *filter;
 | 
				
			||||||
 | 
						struct port *in_port;
 | 
				
			||||||
 | 
						struct port *out_port;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* [on_process] */
 | 
				
			||||||
 | 
					static void on_process(void *userdata, struct spa_io_position *position)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct data *data = userdata;
 | 
				
			||||||
 | 
						float *in, *out;
 | 
				
			||||||
 | 
						uint32_t n_samples = position->clock.duration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_log_trace("do process %d", n_samples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						in = pw_filter_get_dsp_buffer(data->in_port, n_samples);
 | 
				
			||||||
 | 
						out = pw_filter_get_dsp_buffer(data->out_port, n_samples);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (in == NULL || out == NULL)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Simple passthrough - copy input to output.
 | 
				
			||||||
 | 
						 * Here you could implement any audio processing:
 | 
				
			||||||
 | 
						 * - Filters (lowpass, highpass, bandpass)
 | 
				
			||||||
 | 
						 * - Effects (reverb, delay, distortion)
 | 
				
			||||||
 | 
						 * - Dynamic processing (compressor, limiter)
 | 
				
			||||||
 | 
						 * - Equalization
 | 
				
			||||||
 | 
						 * - etc.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						memcpy(out, in, n_samples * sizeof(float));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/* [on_process] */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct pw_filter_events filter_events = {
 | 
				
			||||||
 | 
						PW_VERSION_FILTER_EVENTS,
 | 
				
			||||||
 | 
						.process = on_process,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void do_quit(void *userdata, int signal_number)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct data *data = userdata;
 | 
				
			||||||
 | 
						pw_main_loop_quit(data->loop);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct data data = { 0, };
 | 
				
			||||||
 | 
						const struct spa_pod *params[1];
 | 
				
			||||||
 | 
						uint32_t n_params = 0;
 | 
				
			||||||
 | 
						uint8_t buffer[1024];
 | 
				
			||||||
 | 
						struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_init(&argc, &argv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* make a main loop. If you already have another main loop, you can add
 | 
				
			||||||
 | 
						 * the fd of this pipewire mainloop to it. */
 | 
				
			||||||
 | 
						data.loop = pw_main_loop_new(NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_loop_add_signal(pw_main_loop_get_loop(data.loop), SIGINT, do_quit, &data);
 | 
				
			||||||
 | 
						pw_loop_add_signal(pw_main_loop_get_loop(data.loop), SIGTERM, do_quit, &data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Create a simple filter, the simple filter manages the core and remote
 | 
				
			||||||
 | 
						 * objects for you if you don't need to deal with them.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * Pass your events and a user_data pointer as the last arguments. This
 | 
				
			||||||
 | 
						 * will inform you about the filter state. The most important event
 | 
				
			||||||
 | 
						 * you need to listen to is the process event where you need to process
 | 
				
			||||||
 | 
						 * the data.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						data.filter = pw_filter_new_simple(
 | 
				
			||||||
 | 
								pw_main_loop_get_loop(data.loop),
 | 
				
			||||||
 | 
								"audio-filter",
 | 
				
			||||||
 | 
								pw_properties_new(
 | 
				
			||||||
 | 
									PW_KEY_MEDIA_TYPE, "Audio",
 | 
				
			||||||
 | 
									PW_KEY_MEDIA_CATEGORY, "Filter",
 | 
				
			||||||
 | 
									PW_KEY_MEDIA_ROLE, "DSP",
 | 
				
			||||||
 | 
									NULL),
 | 
				
			||||||
 | 
								&filter_events,
 | 
				
			||||||
 | 
								&data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* make an audio DSP input port */
 | 
				
			||||||
 | 
						data.in_port = pw_filter_add_port(data.filter,
 | 
				
			||||||
 | 
								PW_DIRECTION_INPUT,
 | 
				
			||||||
 | 
								PW_FILTER_PORT_FLAG_MAP_BUFFERS,
 | 
				
			||||||
 | 
								sizeof(struct port),
 | 
				
			||||||
 | 
								pw_properties_new(
 | 
				
			||||||
 | 
									PW_KEY_FORMAT_DSP, "32 bit float mono audio",
 | 
				
			||||||
 | 
									PW_KEY_PORT_NAME, "input",
 | 
				
			||||||
 | 
									NULL),
 | 
				
			||||||
 | 
								NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* make an audio DSP output port */
 | 
				
			||||||
 | 
						data.out_port = pw_filter_add_port(data.filter,
 | 
				
			||||||
 | 
								PW_DIRECTION_OUTPUT,
 | 
				
			||||||
 | 
								PW_FILTER_PORT_FLAG_MAP_BUFFERS,
 | 
				
			||||||
 | 
								sizeof(struct port),
 | 
				
			||||||
 | 
								pw_properties_new(
 | 
				
			||||||
 | 
									PW_KEY_FORMAT_DSP, "32 bit float mono audio",
 | 
				
			||||||
 | 
									PW_KEY_PORT_NAME, "output",
 | 
				
			||||||
 | 
									NULL),
 | 
				
			||||||
 | 
								NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Set processing latency information */
 | 
				
			||||||
 | 
						params[n_params++] = spa_process_latency_build(&b,
 | 
				
			||||||
 | 
								SPA_PARAM_ProcessLatency,
 | 
				
			||||||
 | 
								&SPA_PROCESS_LATENCY_INFO_INIT(
 | 
				
			||||||
 | 
									.ns = 10 * SPA_NSEC_PER_MSEC
 | 
				
			||||||
 | 
								));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Now connect this filter. We ask that our process function is
 | 
				
			||||||
 | 
						 * called in a realtime thread. */
 | 
				
			||||||
 | 
						if (pw_filter_connect(data.filter,
 | 
				
			||||||
 | 
									PW_FILTER_FLAG_RT_PROCESS,
 | 
				
			||||||
 | 
									params, n_params) < 0) {
 | 
				
			||||||
 | 
							fprintf(stderr, "can't connect\n");
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* and wait while we let things run */
 | 
				
			||||||
 | 
						pw_main_loop_run(data.loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pw_filter_destroy(data.filter);
 | 
				
			||||||
 | 
						pw_main_loop_destroy(data.loop);
 | 
				
			||||||
 | 
						pw_deinit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/* [code] */
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ Assumes BUILD_DIR environment variable is set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    containing all index items from the specified section.
 | 
					    containing all index items from the specified section.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Section title    @IDX@ <section>
 | 
					# Section title    @IDX@ <section> [<alternative index name>]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   Adds the section title to the index, and expands to an anchor
 | 
					   Adds the section title to the index, and expands to an anchor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ def index_key(section, name):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BUILD_DIR = os.environ["BUILD_DIR"]
 | 
					BUILD_DIR = os.environ["BUILD_DIR"]
 | 
				
			||||||
PAR_RE = r"^@PAR@\s+([^\s]*)[ \t]+(\S+)(.*)$"
 | 
					PAR_RE = r"^@PAR@\s+([^\s]*)[ \t]+(\S+)(.*)$"
 | 
				
			||||||
IDX_RE = r"^(#+)(.*)@IDX@[ \t]+(\S+)[ \t]*$"
 | 
					IDX_RE = r"^(#+)(.*)@IDX@[ \t]+(\S+)([ \t]+\S+)?[ \t]*$"
 | 
				
			||||||
SECREF_RE = r"^@SECREF@[ \t]+([^\n]*)[ \t]*$"
 | 
					SECREF_RE = r"^@SECREF@[ \t]+([^\n]*)[ \t]*$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,10 +71,16 @@ def main(args):
 | 
				
			||||||
        level = m.group(1)
 | 
					        level = m.group(1)
 | 
				
			||||||
        title = name = m.group(2).strip()
 | 
					        title = name = m.group(2).strip()
 | 
				
			||||||
        section = m.group(3)
 | 
					        section = m.group(3)
 | 
				
			||||||
 | 
					        alt = m.group(4)
 | 
				
			||||||
        if title == title.upper():
 | 
					        if title == title.upper():
 | 
				
			||||||
            name = name.capitalize()
 | 
					            name = name.capitalize()
 | 
				
			||||||
        key = index_key(section, name)
 | 
					        key = index_key(section, name)
 | 
				
			||||||
        return f"{level} {title} {{#{key}}}"
 | 
					        text = f"{level} {title} {{#{key}}}"
 | 
				
			||||||
 | 
					        if alt and alt.strip():
 | 
				
			||||||
 | 
					            alt_key = index_key(section, alt.strip())
 | 
				
			||||||
 | 
					            if alt_key != key:
 | 
				
			||||||
 | 
					                text += f"\n\\anchor {alt_key}"
 | 
				
			||||||
 | 
					        return text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def secref(m):
 | 
					    def secref(m):
 | 
				
			||||||
        import os
 | 
					        import os
 | 
				
			||||||
| 
						 | 
					@ -148,9 +154,12 @@ def load_index(sections, text):
 | 
				
			||||||
    def idx(m):
 | 
					    def idx(m):
 | 
				
			||||||
        name = m.group(2).strip()
 | 
					        name = m.group(2).strip()
 | 
				
			||||||
        section = m.group(3)
 | 
					        section = m.group(3)
 | 
				
			||||||
 | 
					        alt = m.group(4)
 | 
				
			||||||
        if name == name.upper():
 | 
					        if name == name.upper():
 | 
				
			||||||
            name = name.capitalize()
 | 
					            name = name.capitalize()
 | 
				
			||||||
        sections.setdefault(section, []).append(name)
 | 
					        sections.setdefault(section, []).append(name)
 | 
				
			||||||
 | 
					        if alt and alt.strip():
 | 
				
			||||||
 | 
					            sections.setdefault(section, []).append(alt.strip())
 | 
				
			||||||
        return ""
 | 
					        return ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    text = re.sub(PAR_RE, par, text, flags=re.M)
 | 
					    text = re.sub(PAR_RE, par, text, flags=re.M)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +58,8 @@ extra_docs = [
 | 
				
			||||||
  'dox/internals/index.dox',
 | 
					  'dox/internals/index.dox',
 | 
				
			||||||
  'dox/internals/design.dox',
 | 
					  'dox/internals/design.dox',
 | 
				
			||||||
  'dox/internals/access.dox',
 | 
					  'dox/internals/access.dox',
 | 
				
			||||||
 | 
					  'dox/internals/latency.dox',
 | 
				
			||||||
 | 
					  'dox/internals/tag.dox',
 | 
				
			||||||
  'dox/internals/midi.dox',
 | 
					  'dox/internals/midi.dox',
 | 
				
			||||||
  'dox/internals/portal.dox',
 | 
					  'dox/internals/portal.dox',
 | 
				
			||||||
  'dox/internals/daemon.dox',
 | 
					  'dox/internals/daemon.dox',
 | 
				
			||||||
| 
						 | 
					@ -66,6 +68,7 @@ extra_docs = [
 | 
				
			||||||
  'dox/internals/objects.dox',
 | 
					  'dox/internals/objects.dox',
 | 
				
			||||||
  'dox/internals/audio.dox',
 | 
					  'dox/internals/audio.dox',
 | 
				
			||||||
  'dox/internals/scheduling.dox',
 | 
					  'dox/internals/scheduling.dox',
 | 
				
			||||||
 | 
					  'dox/internals/driver.dox',
 | 
				
			||||||
  'dox/internals/protocol.dox',
 | 
					  'dox/internals/protocol.dox',
 | 
				
			||||||
  'dox/internals/pulseaudio.dox',
 | 
					  'dox/internals/pulseaudio.dox',
 | 
				
			||||||
  'dox/internals/dma-buf.dox',
 | 
					  'dox/internals/dma-buf.dox',
 | 
				
			||||||
| 
						 | 
					@ -76,6 +79,7 @@ extra_docs = [
 | 
				
			||||||
  'dox/tutorial/tutorial4.dox',
 | 
					  'dox/tutorial/tutorial4.dox',
 | 
				
			||||||
  'dox/tutorial/tutorial5.dox',
 | 
					  'dox/tutorial/tutorial5.dox',
 | 
				
			||||||
  'dox/tutorial/tutorial6.dox',
 | 
					  'dox/tutorial/tutorial6.dox',
 | 
				
			||||||
 | 
					  'dox/tutorial/tutorial7.dox',
 | 
				
			||||||
  'dox/api/index.dox',
 | 
					  'dox/api/index.dox',
 | 
				
			||||||
  'dox/api/spa-index.dox',
 | 
					  'dox/api/spa-index.dox',
 | 
				
			||||||
  'dox/api/spa-plugins.dox',
 | 
					  'dox/api/spa-plugins.dox',
 | 
				
			||||||
| 
						 | 
					@ -170,6 +174,7 @@ example_files = [
 | 
				
			||||||
  'tutorial4.c',
 | 
					  'tutorial4.c',
 | 
				
			||||||
  'tutorial5.c',
 | 
					  'tutorial5.c',
 | 
				
			||||||
  'tutorial6.c',
 | 
					  'tutorial6.c',
 | 
				
			||||||
 | 
					  'tutorial7.c',
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
example_dep_files = []
 | 
					example_dep_files = []
 | 
				
			||||||
foreach h : example_files
 | 
					foreach h : example_files
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,7 @@ This determines the ordering of items in Doxygen sidebar.
 | 
				
			||||||
\addtogroup pw_protocol
 | 
					\addtogroup pw_protocol
 | 
				
			||||||
\addtogroup pw_resource
 | 
					\addtogroup pw_resource
 | 
				
			||||||
\addtogroup pw_thread_loop
 | 
					\addtogroup pw_thread_loop
 | 
				
			||||||
 | 
					\addtogroup pw_timer_queue
 | 
				
			||||||
\addtogroup pw_work_queue
 | 
					\addtogroup pw_work_queue
 | 
				
			||||||
\}
 | 
					\}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										41
									
								
								meson.build
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								meson.build
									
										
									
									
									
								
							| 
						 | 
					@ -1,10 +1,10 @@
 | 
				
			||||||
project('pipewire', ['c' ],
 | 
					project('pipewire', ['c' ],
 | 
				
			||||||
  version : '1.4.4',
 | 
					  version : '1.5.81',
 | 
				
			||||||
  license : [ 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ],
 | 
					  license : [ 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ],
 | 
				
			||||||
  meson_version : '>= 0.61.1',
 | 
					  meson_version : '>= 0.61.1',
 | 
				
			||||||
  default_options : [ 'warning_level=3',
 | 
					  default_options : [ 'warning_level=3',
 | 
				
			||||||
                      'c_std=gnu11',
 | 
					                      'c_std=gnu11',
 | 
				
			||||||
                      'cpp_std=c++17',
 | 
					                      'cpp_std=c++20',
 | 
				
			||||||
                      'b_pie=true',
 | 
					                      'b_pie=true',
 | 
				
			||||||
                      #'b_sanitize=address,undefined',
 | 
					                      #'b_sanitize=address,undefined',
 | 
				
			||||||
                      'buildtype=debugoptimized' ])
 | 
					                      'buildtype=debugoptimized' ])
 | 
				
			||||||
| 
						 | 
					@ -81,6 +81,7 @@ pkgconfig = import('pkgconfig')
 | 
				
			||||||
common_flags = [
 | 
					common_flags = [
 | 
				
			||||||
  '-fvisibility=hidden',
 | 
					  '-fvisibility=hidden',
 | 
				
			||||||
  '-fno-strict-aliasing',
 | 
					  '-fno-strict-aliasing',
 | 
				
			||||||
 | 
					  '-fno-strict-overflow',
 | 
				
			||||||
  '-Werror=suggest-attribute=format',
 | 
					  '-Werror=suggest-attribute=format',
 | 
				
			||||||
  '-Wsign-compare',
 | 
					  '-Wsign-compare',
 | 
				
			||||||
  '-Wpointer-arith',
 | 
					  '-Wpointer-arith',
 | 
				
			||||||
| 
						 | 
					@ -114,10 +115,11 @@ cc_flags = common_flags + [
 | 
				
			||||||
  '-Werror=old-style-definition',
 | 
					  '-Werror=old-style-definition',
 | 
				
			||||||
  '-Werror=missing-parameter-type',
 | 
					  '-Werror=missing-parameter-type',
 | 
				
			||||||
  '-Werror=strict-prototypes',
 | 
					  '-Werror=strict-prototypes',
 | 
				
			||||||
 | 
					  '-DSPA_AUDIO_MAX_CHANNELS=128u',
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
add_project_arguments(cc.get_supported_arguments(cc_flags), language: 'c')
 | 
					add_project_arguments(cc.get_supported_arguments(cc_flags), language: 'c')
 | 
				
			||||||
 | 
					add_project_arguments(cc_native.get_supported_arguments(cc_flags),
 | 
				
			||||||
cc_flags_native = cc_native.get_supported_arguments(cc_flags)
 | 
					                      language: 'c', native: true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
have_cpp = add_languages('cpp', native: false, required : false)
 | 
					have_cpp = add_languages('cpp', native: false, required : false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -277,11 +279,9 @@ endforeach
 | 
				
			||||||
cdata.set('HAVE_PIDFD_OPEN',
 | 
					cdata.set('HAVE_PIDFD_OPEN',
 | 
				
			||||||
          cc.get_define('SYS_pidfd_open', prefix: '#include <sys/syscall.h>') != '')
 | 
					          cc.get_define('SYS_pidfd_open', prefix: '#include <sys/syscall.h>') != '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
systemd = dependency('systemd', required: get_option('systemd'))
 | 
					systemd_dep = dependency('libsystemd', required: get_option('libsystemd'))
 | 
				
			||||||
systemd_dep = dependency('libsystemd',required: get_option('systemd'))
 | 
					 | 
				
			||||||
summary({'systemd conf data': systemd.found()}, bool_yn: true)
 | 
					 | 
				
			||||||
summary({'libsystemd': systemd_dep.found()}, bool_yn: true)
 | 
					summary({'libsystemd': systemd_dep.found()}, bool_yn: true)
 | 
				
			||||||
cdata.set('HAVE_SYSTEMD', systemd.found() and systemd_dep.found())
 | 
					cdata.set('HAVE_SYSTEMD', systemd_dep.found())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
logind_dep = dependency(get_option('logind-provider'), required: get_option('logind'))
 | 
					logind_dep = dependency(get_option('logind-provider'), required: get_option('logind'))
 | 
				
			||||||
summary({'logind': logind_dep.found()}, bool_yn: true)
 | 
					summary({'logind': logind_dep.found()}, bool_yn: true)
 | 
				
			||||||
| 
						 | 
					@ -321,7 +321,7 @@ cdata.set('HAVE_DBUS', dbus_dep.found())
 | 
				
			||||||
sdl_dep = dependency('sdl2', required : get_option('sdl2'))
 | 
					sdl_dep = dependency('sdl2', required : get_option('sdl2'))
 | 
				
			||||||
summary({'SDL2 (video examples)': sdl_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
					summary({'SDL2 (video examples)': sdl_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
				
			||||||
drm_dep = dependency('libdrm', required : false)
 | 
					drm_dep = dependency('libdrm', required : false)
 | 
				
			||||||
fftw_dep = dependency('fftw3f', required : false)
 | 
					fftw_dep = dependency('fftw3f', required : get_option('fftw'))
 | 
				
			||||||
summary({'fftw3f (filter-chain convolver)': fftw_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
					summary({'fftw3f (filter-chain convolver)': fftw_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
				
			||||||
cdata.set('HAVE_FFTW', fftw_dep.found())
 | 
					cdata.set('HAVE_FFTW', fftw_dep.found())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -340,12 +340,23 @@ endif
 | 
				
			||||||
pw_cat_ffmpeg = get_option('pw-cat-ffmpeg')
 | 
					pw_cat_ffmpeg = get_option('pw-cat-ffmpeg')
 | 
				
			||||||
ffmpeg = get_option('ffmpeg')
 | 
					ffmpeg = get_option('ffmpeg')
 | 
				
			||||||
if pw_cat_ffmpeg.allowed() or ffmpeg.allowed()
 | 
					if pw_cat_ffmpeg.allowed() or ffmpeg.allowed()
 | 
				
			||||||
 | 
					  # libswscale is only used by videoconvert. FFmpeg might however be used for
 | 
				
			||||||
 | 
					  # compressed audio (both for decoding said compressed audio and for parsing
 | 
				
			||||||
 | 
					  # it in pw-cat). If users only care about audio, then libswscale would still
 | 
				
			||||||
 | 
					  # become a requirement if its required flag is defined only by FFmpeg options.
 | 
				
			||||||
 | 
					  # Make the videoconvert option a factor in swscale_dep as well to avoid this.
 | 
				
			||||||
 | 
					  videoconvert = get_option('videoconvert')
 | 
				
			||||||
  avcodec_dep = dependency('libavcodec', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
 | 
					  avcodec_dep = dependency('libavcodec', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
 | 
				
			||||||
  avformat_dep = dependency('libavformat', required: pw_cat_ffmpeg.enabled())
 | 
					  avformat_dep = dependency('libavformat', required: pw_cat_ffmpeg.enabled())
 | 
				
			||||||
 | 
					  avfilter_dep = dependency('libavfilter', required: ffmpeg.enabled())
 | 
				
			||||||
  avutil_dep = dependency('libavutil', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
 | 
					  avutil_dep = dependency('libavutil', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
 | 
				
			||||||
  swscale_dep = dependency('libswscale', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
 | 
					  swscale_dep = dependency('libswscale', required: (pw_cat_ffmpeg.enabled() or ffmpeg.enabled()) and videoconvert.enabled())
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
  avcodec_dep = dependency('', required: false)
 | 
					  avcodec_dep = dependency('', required: false)
 | 
				
			||||||
 | 
					  avformat_dep = dependency('', required: false)
 | 
				
			||||||
 | 
					  avfilter_dep = dependency('', required: false)
 | 
				
			||||||
 | 
					  avutil_dep = dependency('', required: false)
 | 
				
			||||||
 | 
					  swscale_dep = dependency('', required: false)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
cdata.set('HAVE_PW_CAT_FFMPEG_INTEGRATION', pw_cat_ffmpeg.allowed())
 | 
					cdata.set('HAVE_PW_CAT_FFMPEG_INTEGRATION', pw_cat_ffmpeg.allowed())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -380,9 +391,6 @@ libusb_dep = dependency('libusb-1.0', required : get_option('libusb'))
 | 
				
			||||||
summary({'libusb (Bluetooth quirks)': libusb_dep.found()}, bool_yn: true, section: 'Backend')
 | 
					summary({'libusb (Bluetooth quirks)': libusb_dep.found()}, bool_yn: true, section: 'Backend')
 | 
				
			||||||
cdata.set('HAVE_LIBUSB', libusb_dep.found())
 | 
					cdata.set('HAVE_LIBUSB', libusb_dep.found())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cap_lib = dependency('libcap', required : false)
 | 
					 | 
				
			||||||
cdata.set('HAVE_LIBCAP', cap_lib.found())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
glib2_dep = dependency('glib-2.0', required : get_option('flatpak'))
 | 
					glib2_dep = dependency('glib-2.0', required : get_option('flatpak'))
 | 
				
			||||||
summary({'GLib-2.0 (Flatpak support)': glib2_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
					summary({'GLib-2.0 (Flatpak support)': glib2_dep.found()}, bool_yn: true, section: 'Misc dependencies')
 | 
				
			||||||
flatpak_support = glib2_dep.found()
 | 
					flatpak_support = glib2_dep.found()
 | 
				
			||||||
| 
						 | 
					@ -410,6 +418,7 @@ gst_deps_def = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gst_dep = []
 | 
					gst_dep = []
 | 
				
			||||||
gst_dma_drm_found = false
 | 
					gst_dma_drm_found = false
 | 
				
			||||||
 | 
					gst_shm_allocator_found = false
 | 
				
			||||||
foreach depname, kwargs: gst_deps_def
 | 
					foreach depname, kwargs: gst_deps_def
 | 
				
			||||||
  dep = dependency(depname, required: gst_option, kwargs: kwargs)
 | 
					  dep = dependency(depname, required: gst_option, kwargs: kwargs)
 | 
				
			||||||
  summary({depname: dep.found()}, bool_yn: true, section: 'GStreamer modules')
 | 
					  summary({depname: dep.found()}, bool_yn: true, section: 'GStreamer modules')
 | 
				
			||||||
| 
						 | 
					@ -425,9 +434,13 @@ foreach depname, kwargs: gst_deps_def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if depname == 'gstreamer-allocators-1.0' and dep.version().version_compare('>= 1.23.1')
 | 
					  if depname == 'gstreamer-allocators-1.0' and dep.version().version_compare('>= 1.23.1')
 | 
				
			||||||
    gst_dma_drm_found = true
 | 
					    gst_dma_drm_found = true
 | 
				
			||||||
 | 
					    gst_shm_allocator_found = true
 | 
				
			||||||
  endif
 | 
					  endif
 | 
				
			||||||
endforeach
 | 
					endforeach
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					summary({'gstreamer SHM allocator': gst_shm_allocator_found}, bool_yn: true, section: 'Backend')
 | 
				
			||||||
 | 
					cdata.set('HAVE_GSTREAMER_SHM_ALLOCATOR', gst_shm_allocator_found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This code relies on the array being empty if any dependency was not found
 | 
					# This code relies on the array being empty if any dependency was not found
 | 
				
			||||||
gst_dp_found = gst_dep.length() > 0
 | 
					gst_dp_found = gst_dep.length() > 0
 | 
				
			||||||
summary({'gstreamer-device-provider': gst_dp_found}, bool_yn: true, section: 'Backend')
 | 
					summary({'gstreamer-device-provider': gst_dp_found}, bool_yn: true, section: 'Backend')
 | 
				
			||||||
| 
						 | 
					@ -621,6 +634,8 @@ devenv.prepend('GST_PLUGIN_PATH', builddir / 'src'/ 'gst')
 | 
				
			||||||
devenv.prepend('ALSA_PLUGIN_DIR', builddir / 'pipewire-alsa' / 'alsa-plugins')
 | 
					devenv.prepend('ALSA_PLUGIN_DIR', builddir / 'pipewire-alsa' / 'alsa-plugins')
 | 
				
			||||||
devenv.prepend('LD_LIBRARY_PATH', builddir / 'pipewire-jack' / 'src')
 | 
					devenv.prepend('LD_LIBRARY_PATH', builddir / 'pipewire-jack' / 'src')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					devenv.set('PIPEWIRE_LOG_SYSTEMD', 'false')
 | 
				
			||||||
devenv.set('PW_UNINSTALLED', '1')
 | 
					devenv.set('PW_UNINSTALLED', '1')
 | 
				
			||||||
 | 
					devenv.set('PW_BUILDDIR', meson.project_build_root())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
meson.add_devenv(devenv)
 | 
					meson.add_devenv(devenv)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,8 @@ option('gstreamer-device-provider',
 | 
				
			||||||
       description: 'Build GStreamer device provider plugin',
 | 
					       description: 'Build GStreamer device provider plugin',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
       value: 'auto')
 | 
					       value: 'auto')
 | 
				
			||||||
option('systemd',
 | 
					option('libsystemd',
 | 
				
			||||||
       description: 'Enable systemd integration',
 | 
					       description: 'Enable code that depends on libsystemd',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
       value: 'auto')
 | 
					       value: 'auto')
 | 
				
			||||||
option('logind',
 | 
					option('logind',
 | 
				
			||||||
| 
						 | 
					@ -48,9 +48,9 @@ option('systemd-system-service',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
       value: 'disabled')
 | 
					       value: 'disabled')
 | 
				
			||||||
option('systemd-user-service',
 | 
					option('systemd-user-service',
 | 
				
			||||||
       description: 'Install systemd user service file (ignored without systemd)',
 | 
					       description: 'Install systemd user service file',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
       value: 'enabled')
 | 
					       value: 'auto')
 | 
				
			||||||
option('selinux',
 | 
					option('selinux',
 | 
				
			||||||
       description: 'Enable SELinux integration',
 | 
					       description: 'Enable SELinux integration',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
| 
						 | 
					@ -129,6 +129,10 @@ option('bluez5-codec-ldac',
 | 
				
			||||||
        description: 'Enable LDAC Sony open source codec implementation',
 | 
					        description: 'Enable LDAC Sony open source codec implementation',
 | 
				
			||||||
        type: 'feature',
 | 
					        type: 'feature',
 | 
				
			||||||
        value: 'auto')
 | 
					        value: 'auto')
 | 
				
			||||||
 | 
					option('bluez5-codec-ldac-dec',
 | 
				
			||||||
 | 
					        description: 'Enable LDAC Sony open source codec decoding',
 | 
				
			||||||
 | 
					        type: 'feature',
 | 
				
			||||||
 | 
					        value: 'auto')
 | 
				
			||||||
option('bluez5-codec-aac',
 | 
					option('bluez5-codec-aac',
 | 
				
			||||||
        description: 'Enable Fraunhofer FDK AAC open source codec implementation',
 | 
					        description: 'Enable Fraunhofer FDK AAC open source codec implementation',
 | 
				
			||||||
        type: 'feature',
 | 
					        type: 'feature',
 | 
				
			||||||
| 
						 | 
					@ -149,6 +153,10 @@ option('bluez5-codec-g722',
 | 
				
			||||||
        description: 'Enable G722 open source codec implementation',
 | 
					        description: 'Enable G722 open source codec implementation',
 | 
				
			||||||
        type: 'feature',
 | 
					        type: 'feature',
 | 
				
			||||||
        value: 'auto')
 | 
					        value: 'auto')
 | 
				
			||||||
 | 
					option('bluez5-plc-spandsp',
 | 
				
			||||||
 | 
					        description: 'Enable SpanDSP for packet loss concealment',
 | 
				
			||||||
 | 
					        type: 'feature',
 | 
				
			||||||
 | 
					        value: 'auto')
 | 
				
			||||||
option('control',
 | 
					option('control',
 | 
				
			||||||
       description: 'Enable control spa plugin integration',
 | 
					       description: 'Enable control spa plugin integration',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
| 
						 | 
					@ -379,3 +387,11 @@ option('ebur128',
 | 
				
			||||||
       description: 'Enable code that depends on ebur128',
 | 
					       description: 'Enable code that depends on ebur128',
 | 
				
			||||||
       type: 'feature',
 | 
					       type: 'feature',
 | 
				
			||||||
       value: 'auto')
 | 
					       value: 'auto')
 | 
				
			||||||
 | 
					option('fftw',
 | 
				
			||||||
 | 
					       description: 'Enable code that depends on fftw',
 | 
				
			||||||
 | 
					       type: 'feature',
 | 
				
			||||||
 | 
					       value: 'auto')
 | 
				
			||||||
 | 
					option('onnxruntime',
 | 
				
			||||||
 | 
					       description: 'Enable code that depends on onnxruntime',
 | 
				
			||||||
 | 
					       type: 'feature',
 | 
				
			||||||
 | 
					       value: 'auto')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,9 +22,11 @@ PW_LOG_TOPIC_STATIC(alsa_log_topic, "alsa.ctl");
 | 
				
			||||||
#define VOLUME_MIN ((uint32_t) 0U)
 | 
					#define VOLUME_MIN ((uint32_t) 0U)
 | 
				
			||||||
#define VOLUME_MAX ((uint32_t) 0x10000U)
 | 
					#define VOLUME_MAX ((uint32_t) 0x10000U)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_CHANNELS	SPA_AUDIO_MAX_CHANNELS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct volume {
 | 
					struct volume {
 | 
				
			||||||
	uint32_t channels;
 | 
						uint32_t channels;
 | 
				
			||||||
	long values[SPA_AUDIO_MAX_CHANNELS];
 | 
						long values[MAX_CHANNELS];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -498,7 +500,7 @@ static struct spa_pod *build_volume_mute(struct spa_pod_builder *b, struct volum
 | 
				
			||||||
	spa_pod_builder_push_object(b, &f[0],
 | 
						spa_pod_builder_push_object(b, &f[0],
 | 
				
			||||||
			SPA_TYPE_OBJECT_Props, SPA_PARAM_Props);
 | 
								SPA_TYPE_OBJECT_Props, SPA_PARAM_Props);
 | 
				
			||||||
	if (volume) {
 | 
						if (volume) {
 | 
				
			||||||
		float volumes[SPA_AUDIO_MAX_CHANNELS];
 | 
							float volumes[MAX_CHANNELS];
 | 
				
			||||||
		uint32_t i, n_volumes = 0;
 | 
							uint32_t i, n_volumes = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		n_volumes = volume->channels;
 | 
							n_volumes = volume->channels;
 | 
				
			||||||
| 
						 | 
					@ -850,11 +852,11 @@ static void parse_props(struct global *g, const struct spa_pod *param, bool devi
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case SPA_PROP_channelVolumes:
 | 
							case SPA_PROP_channelVolumes:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			float volumes[SPA_AUDIO_MAX_CHANNELS];
 | 
								float volumes[MAX_CHANNELS];
 | 
				
			||||||
			uint32_t n_volumes, i;
 | 
								uint32_t n_volumes, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
 | 
								n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
 | 
				
			||||||
					volumes, SPA_AUDIO_MAX_CHANNELS);
 | 
										volumes, SPA_N_ELEMENTS(volumes));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			g->node.channel_volume.channels = n_volumes;
 | 
								g->node.channel_volume.channels = n_volumes;
 | 
				
			||||||
			for (i = 0; i < n_volumes; i++)
 | 
								for (i = 0; i < n_volumes; i++)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,8 +30,8 @@ PW_LOG_TOPIC_STATIC(alsa_log_topic, "alsa.pcm");
 | 
				
			||||||
#define MIN_BUFFERS	2u
 | 
					#define MIN_BUFFERS	2u
 | 
				
			||||||
#define MAX_BUFFERS	64u
 | 
					#define MAX_BUFFERS	64u
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_CHANNELS	64
 | 
					 | 
				
			||||||
#define MAX_RATE	(48000*8)
 | 
					#define MAX_RATE	(48000*8)
 | 
				
			||||||
 | 
					#define MAX_CHANNELS	SPA_AUDIO_MAX_CHANNELS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MIN_PERIOD	64
 | 
					#define MIN_PERIOD	64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -617,6 +617,7 @@ static int snd_pcm_pipewire_stop(snd_pcm_ioplug_t *io)
 | 
				
			||||||
	if (pw->activated && pw->stream != NULL) {
 | 
						if (pw->activated && pw->stream != NULL) {
 | 
				
			||||||
		pw_stream_set_active(pw->stream, false);
 | 
							pw_stream_set_active(pw->stream, false);
 | 
				
			||||||
		pw->activated = false;
 | 
							pw->activated = false;
 | 
				
			||||||
 | 
							pw_thread_loop_signal(pw->main_loop, false);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pw_thread_loop_unlock(pw->main_loop);
 | 
						pw_thread_loop_unlock(pw->main_loop);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -642,7 +643,7 @@ static int snd_pcm_pipewire_pause(snd_pcm_ioplug_t * io, int enable)
 | 
				
			||||||
#define _FORMAT_BE(p, fmt)  p ? SPA_AUDIO_FORMAT_UNKNOWN : SPA_AUDIO_FORMAT_ ## fmt ## _OE
 | 
					#define _FORMAT_BE(p, fmt)  p ? SPA_AUDIO_FORMAT_UNKNOWN : SPA_AUDIO_FORMAT_ ## fmt ## _OE
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int set_default_channels(uint32_t channels, uint32_t position[SPA_AUDIO_MAX_CHANNELS])
 | 
					static int set_default_channels(uint32_t channels, uint32_t position[MAX_CHANNELS])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	switch (channels) {
 | 
						switch (channels) {
 | 
				
			||||||
	case 8:
 | 
						case 8:
 | 
				
			||||||
| 
						 | 
					@ -915,12 +916,16 @@ static int snd_pcm_pipewire_set_chmap(snd_pcm_ioplug_t * io,
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (map->channels > MAX_CHANNELS)
 | 
				
			||||||
 | 
							return -ENOTSUP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < map->channels; i++) {
 | 
						for (i = 0; i < map->channels; i++) {
 | 
				
			||||||
 | 
							char buf[8];
 | 
				
			||||||
		position[i] = chmap_to_channel(map->pos[i]);
 | 
							position[i] = chmap_to_channel(map->pos[i]);
 | 
				
			||||||
		pw_log_debug("map %d: %s / %s", i,
 | 
							pw_log_debug("map %d: %s / %s", i,
 | 
				
			||||||
				snd_pcm_chmap_name(map->pos[i]),
 | 
									snd_pcm_chmap_name(map->pos[i]),
 | 
				
			||||||
				spa_debug_type_find_short_name(spa_type_audio_channel,
 | 
									spa_type_audio_channel_make_short_name(position[i],
 | 
				
			||||||
					position[i]));
 | 
										buf, sizeof(buf), "UNK"));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,7 @@ struct notify {
 | 
				
			||||||
#define NOTIFY_TYPE_SHUTDOWN		((7<<4)|NOTIFY_ACTIVE_FLAG)
 | 
					#define NOTIFY_TYPE_SHUTDOWN		((7<<4)|NOTIFY_ACTIVE_FLAG)
 | 
				
			||||||
#define NOTIFY_TYPE_LATENCY		((8<<4)|NOTIFY_ACTIVE_FLAG)
 | 
					#define NOTIFY_TYPE_LATENCY		((8<<4)|NOTIFY_ACTIVE_FLAG)
 | 
				
			||||||
#define NOTIFY_TYPE_TOTAL_LATENCY	((9<<4)|NOTIFY_ACTIVE_FLAG)
 | 
					#define NOTIFY_TYPE_TOTAL_LATENCY	((9<<4)|NOTIFY_ACTIVE_FLAG)
 | 
				
			||||||
 | 
					#define NOTIFY_TYPE_PORT_RENAME		((10<<4)|NOTIFY_ACTIVE_FLAG)
 | 
				
			||||||
	int type;
 | 
						int type;
 | 
				
			||||||
	struct object *object;
 | 
						struct object *object;
 | 
				
			||||||
	int arg1;
 | 
						int arg1;
 | 
				
			||||||
| 
						 | 
					@ -171,6 +172,7 @@ struct object {
 | 
				
			||||||
		} port_link;
 | 
							} port_link;
 | 
				
			||||||
		struct {
 | 
							struct {
 | 
				
			||||||
			unsigned long flags;
 | 
								unsigned long flags;
 | 
				
			||||||
 | 
								char old_name[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
			char name[REAL_JACK_PORT_NAME_SIZE+1];
 | 
								char name[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
			char alias1[REAL_JACK_PORT_NAME_SIZE+1];
 | 
								char alias1[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
			char alias2[REAL_JACK_PORT_NAME_SIZE+1];
 | 
								char alias2[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
| 
						 | 
					@ -231,6 +233,13 @@ struct buffer {
 | 
				
			||||||
	uint32_t n_mem;
 | 
						uint32_t n_mem;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct mix_info {
 | 
				
			||||||
 | 
						struct spa_pod_parser parser;
 | 
				
			||||||
 | 
						struct spa_pod_frame frame;
 | 
				
			||||||
 | 
						struct spa_pod_control control;
 | 
				
			||||||
 | 
						const void *control_body;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct mix {
 | 
					struct mix {
 | 
				
			||||||
	struct spa_list link;
 | 
						struct spa_list link;
 | 
				
			||||||
	struct spa_list port_link;
 | 
						struct spa_list port_link;
 | 
				
			||||||
| 
						 | 
					@ -245,6 +254,8 @@ struct mix {
 | 
				
			||||||
	struct buffer buffers[MAX_BUFFERS];
 | 
						struct buffer buffers[MAX_BUFFERS];
 | 
				
			||||||
	uint32_t n_buffers;
 | 
						uint32_t n_buffers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct mix_info mix_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int to_free:1;
 | 
						unsigned int to_free:1;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -626,8 +637,8 @@ do_mix_set_io(struct spa_loop *loop, bool async, uint32_t seq,
 | 
				
			||||||
static inline void mix_set_io(struct mix *mix, void *data, size_t size)
 | 
					static inline void mix_set_io(struct mix *mix, void *data, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct io_info info = { .mix = mix, .data = data, .size = size };
 | 
						struct io_info info = { .mix = mix, .data = data, .size = size };
 | 
				
			||||||
	pw_data_loop_invoke(mix->port->client->loop,
 | 
						pw_loop_locked(mix->port->client->loop->loop,
 | 
				
			||||||
		do_mix_set_io, SPA_ID_INVALID, &info, sizeof(info), false, NULL);
 | 
							do_mix_set_io, SPA_ID_INVALID, &info, sizeof(info), NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void init_mix(struct mix *mix, uint32_t mix_id, struct port *port, uint32_t peer_id)
 | 
					static void init_mix(struct mix *mix, uint32_t mix_id, struct port *port, uint32_t peer_id)
 | 
				
			||||||
| 
						 | 
					@ -1083,6 +1094,16 @@ static void on_notify_event(void *data, uint64_t count)
 | 
				
			||||||
					notify->arg1,
 | 
										notify->arg1,
 | 
				
			||||||
					c->portregistration_arg);
 | 
										c->portregistration_arg);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
							case NOTIFY_TYPE_PORT_RENAME:
 | 
				
			||||||
 | 
								if (o->registered != notify->arg1)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								pw_log_debug("%p: port rename %u %s->%s", c, o->serial,
 | 
				
			||||||
 | 
										o->port.old_name, o->port.name);
 | 
				
			||||||
 | 
								do_callback(c, rename_callback, c->active,
 | 
				
			||||||
 | 
										o->serial,
 | 
				
			||||||
 | 
										o->port.old_name, o->port.name,
 | 
				
			||||||
 | 
										c->rename_arg);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case NOTIFY_TYPE_CONNECT:
 | 
							case NOTIFY_TYPE_CONNECT:
 | 
				
			||||||
			if (o->registered == notify->arg1)
 | 
								if (o->registered == notify->arg1)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
| 
						 | 
					@ -1183,6 +1204,9 @@ static int queue_notify(struct client *c, int type, struct object *o, int arg1,
 | 
				
			||||||
		emit = c->portregistration_callback != NULL && o != NULL;
 | 
							emit = c->portregistration_callback != NULL && o != NULL;
 | 
				
			||||||
		o->visible = arg1;
 | 
							o->visible = arg1;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case NOTIFY_TYPE_PORT_RENAME:
 | 
				
			||||||
 | 
							emit = c->rename_callback != NULL && o != NULL;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case NOTIFY_TYPE_CONNECT:
 | 
						case NOTIFY_TYPE_CONNECT:
 | 
				
			||||||
		emit = c->connect_callback != NULL && o != NULL;
 | 
							emit = c->connect_callback != NULL && o != NULL;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					@ -1477,7 +1501,8 @@ static inline int event_compare(uint8_t s1, uint8_t s2)
 | 
				
			||||||
	return priotab[(s2>>4) & 7] - priotab[(s1>>4) & 7];
 | 
						return priotab[(s2>>4) & 7] - priotab[(s1>>4) & 7];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int event_sort(struct spa_pod_control *a, struct spa_pod_control *b)
 | 
					static inline int event_sort(struct spa_pod_control *a, const void *abody,
 | 
				
			||||||
 | 
							struct spa_pod_control *b, const void *bbody)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (a->offset < b->offset)
 | 
						if (a->offset < b->offset)
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
| 
						 | 
					@ -1488,18 +1513,18 @@ static inline int event_sort(struct spa_pod_control *a, struct spa_pod_control *
 | 
				
			||||||
	switch(a->type) {
 | 
						switch(a->type) {
 | 
				
			||||||
	case SPA_CONTROL_Midi:
 | 
						case SPA_CONTROL_Midi:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint8_t *sa = SPA_POD_BODY(&a->value), *sb = SPA_POD_BODY(&b->value);
 | 
							const uint8_t *sa = abody, *sb = bbody;
 | 
				
			||||||
		if (SPA_POD_BODY_SIZE(&a->value) < 1 || SPA_POD_BODY_SIZE(&b->value) < 1)
 | 
							if (SPA_POD_BODY_SIZE(&a->value) < 1 || SPA_POD_BODY_SIZE(&b->value) < 1)
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		return event_compare(sa[0], sb[0]);
 | 
							return event_compare(sa[0], sb[0]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_CONTROL_UMP:
 | 
						case SPA_CONTROL_UMP:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint32_t *sa = SPA_POD_BODY(&a->value), *sb = SPA_POD_BODY(&b->value);
 | 
							const uint32_t *sa = abody, *sb = bbody;
 | 
				
			||||||
		if (SPA_POD_BODY_SIZE(&a->value) < 4 || SPA_POD_BODY_SIZE(&b->value) < 4)
 | 
							if (SPA_POD_BODY_SIZE(&a->value) < 4 || SPA_POD_BODY_SIZE(&b->value) < 4)
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		if ((sa[0] >> 28) != 2 || (sa[0] >> 28) != 4 ||
 | 
							if (((sa[0] >> 28) != 2 && (sa[0] >> 28) != 4) ||
 | 
				
			||||||
		    (sb[0] >> 28) != 2 || (sb[0] >> 28) != 4)
 | 
							    ((sb[0] >> 28) != 2 && (sb[0] >> 28) != 4))
 | 
				
			||||||
			return 0;
 | 
								return 0;
 | 
				
			||||||
		return event_compare(sa[0] >> 16, sb[0] >> 16);
 | 
							return event_compare(sa[0] >> 16, sb[0] >> 16);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1583,56 +1608,54 @@ static inline int midi_event_write(void *port_buffer,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void convert_to_event(struct spa_pod_sequence **seq, uint32_t n_seq, void *midi, bool fix, uint32_t type)
 | 
					static void convert_to_event(struct mix_info **mix, uint32_t n_mix, void *midi, bool fix, uint32_t type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct spa_pod_control *c[n_seq];
 | 
					 | 
				
			||||||
	uint64_t state = 0;
 | 
					 | 
				
			||||||
	uint32_t i;
 | 
						uint32_t i;
 | 
				
			||||||
	int res = 0;
 | 
						int res = 0;
 | 
				
			||||||
	bool in_sysex = false;
 | 
						bool in_sysex = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < n_seq; i++)
 | 
					 | 
				
			||||||
		c[i] = spa_pod_control_first(&seq[i]->body);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	while (true) {
 | 
						while (true) {
 | 
				
			||||||
		struct spa_pod_control *next = NULL;
 | 
							struct mix_info *next = NULL;
 | 
				
			||||||
		uint32_t next_index = 0;
 | 
							uint32_t next_index = 0;
 | 
				
			||||||
 | 
							struct spa_pod_control *control;
 | 
				
			||||||
 | 
							size_t size;
 | 
				
			||||||
 | 
							uint8_t *data;
 | 
				
			||||||
 | 
							uint64_t state = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (i = 0; i < n_seq; i++) {
 | 
							for (i = 0; i < n_mix; i++) {
 | 
				
			||||||
			if (!spa_pod_control_is_inside(&seq[i]->body,
 | 
								struct mix_info *m = mix[i];
 | 
				
			||||||
						SPA_POD_BODY_SIZE(seq[i]), c[i]))
 | 
								if (next == NULL || event_sort(&m->control, m->control_body,
 | 
				
			||||||
				continue;
 | 
											&next->control, next->control_body) <= 0) {
 | 
				
			||||||
 | 
									next = m;
 | 
				
			||||||
			if (next == NULL || event_sort(c[i], next) <= 0) {
 | 
					 | 
				
			||||||
				next = c[i];
 | 
					 | 
				
			||||||
				next_index = i;
 | 
									next_index = i;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (SPA_UNLIKELY(next == NULL))
 | 
							if (SPA_UNLIKELY(next == NULL))
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch(next->type) {
 | 
							control = &next->control;
 | 
				
			||||||
 | 
							data = (uint8_t*)next->control_body;
 | 
				
			||||||
 | 
							size = SPA_POD_BODY_SIZE(&control->value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch(control->type) {
 | 
				
			||||||
		case SPA_CONTROL_OSC:
 | 
							case SPA_CONTROL_OSC:
 | 
				
			||||||
			if (!TYPE_ID_CAN_OSC(type))
 | 
								if (!TYPE_ID_CAN_OSC(type))
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			SPA_FALLTHROUGH;
 | 
								SPA_FALLTHROUGH;
 | 
				
			||||||
		case SPA_CONTROL_Midi:
 | 
							case SPA_CONTROL_Midi:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			uint8_t *data = SPA_POD_BODY(&next->value);
 | 
					 | 
				
			||||||
			size_t size = SPA_POD_BODY_SIZE(&next->value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (type == TYPE_ID_UMP) {
 | 
								if (type == TYPE_ID_UMP) {
 | 
				
			||||||
				while (size > 0) {
 | 
									while (size > 0) {
 | 
				
			||||||
					uint32_t ump[4];
 | 
										uint32_t ump[4];
 | 
				
			||||||
					int ump_size = spa_ump_from_midi(&data, &size, ump, sizeof(ump), 0, &state);
 | 
										int ump_size = spa_ump_from_midi(&data, &size, ump, sizeof(ump), 0, &state);
 | 
				
			||||||
					if (ump_size <= 0)
 | 
										if (ump_size <= 0)
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
					if ((res = midi_event_write(midi, next->offset,
 | 
										if ((res = midi_event_write(midi, control->offset,
 | 
				
			||||||
								(uint8_t*)ump, ump_size, false)) < 0)
 | 
													(uint8_t*)ump, ump_size, false)) < 0)
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				res = midi_event_write(midi, next->offset, data, size, fix);
 | 
									res = midi_event_write(midi, control->offset, data, size, fix);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (res < 0)
 | 
								if (res < 0)
 | 
				
			||||||
				pw_log_warn("midi %p: can't write event: %s", midi,
 | 
									pw_log_warn("midi %p: can't write event: %s", midi,
 | 
				
			||||||
| 
						 | 
					@ -1641,38 +1664,43 @@ static void convert_to_event(struct spa_pod_sequence **seq, uint32_t n_seq, void
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		case SPA_CONTROL_UMP:
 | 
							case SPA_CONTROL_UMP:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			void *data = SPA_POD_BODY(&next->value);
 | 
					 | 
				
			||||||
			size_t size = SPA_POD_BODY_SIZE(&next->value);
 | 
					 | 
				
			||||||
			uint8_t ev[32];
 | 
					 | 
				
			||||||
			bool was_sysex = in_sysex;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (type == TYPE_ID_MIDI) {
 | 
								if (type == TYPE_ID_MIDI) {
 | 
				
			||||||
				int ev_size = spa_ump_to_midi(data, size, ev, sizeof(ev));
 | 
									uint8_t ev[32];
 | 
				
			||||||
 | 
									const uint32_t *d = (uint32_t*)data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									while (size > 0) {
 | 
				
			||||||
 | 
										bool was_sysex = in_sysex;
 | 
				
			||||||
 | 
										int ev_size = spa_ump_to_midi(&d, &size, ev, sizeof(ev), &state);
 | 
				
			||||||
					if (ev_size <= 0)
 | 
										if (ev_size <= 0)
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				size = ev_size;
 | 
					 | 
				
			||||||
				data = ev;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if (!in_sysex && ev[0] == 0xf0)
 | 
										if (!in_sysex && ev[0] == 0xf0)
 | 
				
			||||||
						in_sysex = true;
 | 
											in_sysex = true;
 | 
				
			||||||
					if (in_sysex && ev[ev_size-1] == 0xf7)
 | 
										if (in_sysex && ev[ev_size-1] == 0xf7)
 | 
				
			||||||
						in_sysex = false;
 | 
											in_sysex = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			} else if (type != TYPE_ID_UMP)
 | 
										if (was_sysex)
 | 
				
			||||||
 | 
											res = midi_event_append(midi, ev, ev_size);
 | 
				
			||||||
 | 
										else
 | 
				
			||||||
 | 
											res = midi_event_write(midi, control->offset, ev, ev_size, fix);
 | 
				
			||||||
 | 
										if (res < 0)
 | 
				
			||||||
						break;
 | 
											break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (was_sysex)
 | 
									}
 | 
				
			||||||
				res = midi_event_append(midi, data, size);
 | 
								} else if (type == TYPE_ID_UMP) {
 | 
				
			||||||
			else
 | 
									res = midi_event_write(midi, control->offset, data, size, fix);
 | 
				
			||||||
				res = midi_event_write(midi, next->offset, data, size, fix);
 | 
								}
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (res < 0)
 | 
								if (res < 0)
 | 
				
			||||||
				pw_log_warn("midi %p: can't write event: %s", midi,
 | 
									pw_log_warn("midi %p: can't write event: %s", midi,
 | 
				
			||||||
						spa_strerror(res));
 | 
											spa_strerror(res));
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		c[next_index] = spa_pod_control_next(c[next_index]);
 | 
							if (spa_pod_parser_get_control_body(&next->parser,
 | 
				
			||||||
 | 
										&next->control, &next->control_body) < 0) {
 | 
				
			||||||
 | 
								spa_pod_parser_pop(&next->parser, &next->frame);
 | 
				
			||||||
 | 
								mix[next_index] = mix[--n_mix];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2496,16 +2524,16 @@ static int client_node_command(void *data, const struct spa_command *command)
 | 
				
			||||||
	case SPA_NODE_COMMAND_Suspend:
 | 
						case SPA_NODE_COMMAND_Suspend:
 | 
				
			||||||
	case SPA_NODE_COMMAND_Pause:
 | 
						case SPA_NODE_COMMAND_Pause:
 | 
				
			||||||
		if (c->started) {
 | 
							if (c->started) {
 | 
				
			||||||
			pw_data_loop_invoke(c->loop,
 | 
								pw_loop_locked(c->loop->loop,
 | 
				
			||||||
				do_unprepare_client, SPA_ID_INVALID, NULL, 0, false, c);
 | 
									do_unprepare_client, SPA_ID_INVALID, NULL, 0, c);
 | 
				
			||||||
			c->started = false;
 | 
								c->started = false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case SPA_NODE_COMMAND_Start:
 | 
						case SPA_NODE_COMMAND_Start:
 | 
				
			||||||
		if (!c->started) {
 | 
							if (!c->started) {
 | 
				
			||||||
			pw_data_loop_invoke(c->loop,
 | 
								pw_loop_locked(c->loop->loop,
 | 
				
			||||||
				do_prepare_client, SPA_ID_INVALID, NULL, 0, false, c);
 | 
									do_prepare_client, SPA_ID_INVALID, NULL, 0, c);
 | 
				
			||||||
			c->started = true;
 | 
								c->started = true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
| 
						 | 
					@ -2549,28 +2577,11 @@ static int param_enum_format(struct client *c, struct port *p,
 | 
				
			||||||
	case TYPE_ID_UMP:
 | 
						case TYPE_ID_UMP:
 | 
				
			||||||
	case TYPE_ID_OSC:
 | 
						case TYPE_ID_OSC:
 | 
				
			||||||
	case TYPE_ID_MIDI:
 | 
						case TYPE_ID_MIDI:
 | 
				
			||||||
	{
 | 
							*param = spa_pod_builder_add_object(b,
 | 
				
			||||||
		struct spa_pod_frame f;
 | 
								SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
 | 
				
			||||||
		int32_t types = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		spa_pod_builder_push_object(b, &f,
 | 
					 | 
				
			||||||
			SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat);
 | 
					 | 
				
			||||||
		spa_pod_builder_add(b,
 | 
					 | 
				
			||||||
			SPA_FORMAT_mediaType,      SPA_POD_Id(SPA_MEDIA_TYPE_application),
 | 
								SPA_FORMAT_mediaType,      SPA_POD_Id(SPA_MEDIA_TYPE_application),
 | 
				
			||||||
			SPA_FORMAT_mediaSubtype,   SPA_POD_Id(SPA_MEDIA_SUBTYPE_control),
 | 
								SPA_FORMAT_mediaSubtype,   SPA_POD_Id(SPA_MEDIA_SUBTYPE_control));
 | 
				
			||||||
			0);
 | 
					 | 
				
			||||||
		if (p->object->port.type_id == TYPE_ID_UMP)
 | 
					 | 
				
			||||||
			types |= 1u<<SPA_CONTROL_UMP;
 | 
					 | 
				
			||||||
		if (p->object->port.type_id == TYPE_ID_OSC)
 | 
					 | 
				
			||||||
			types |= 1u<<SPA_CONTROL_OSC;
 | 
					 | 
				
			||||||
		if (types != 0)
 | 
					 | 
				
			||||||
			spa_pod_builder_add(b,
 | 
					 | 
				
			||||||
				SPA_FORMAT_CONTROL_types,  SPA_POD_CHOICE_FLAGS_Int(types),
 | 
					 | 
				
			||||||
				0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		*param = spa_pod_builder_pop(b, &f);
 | 
					 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	case TYPE_ID_VIDEO:
 | 
						case TYPE_ID_VIDEO:
 | 
				
			||||||
		*param = spa_pod_builder_add_object(b,
 | 
							*param = spa_pod_builder_add_object(b,
 | 
				
			||||||
			SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
 | 
								SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
 | 
				
			||||||
| 
						 | 
					@ -3296,8 +3307,8 @@ static int client_node_set_activation(void *data,
 | 
				
			||||||
		link->trigger = link->activation->server_version < 1 ? trigger_link_v0 : trigger_link_v1;
 | 
							link->trigger = link->activation->server_version < 1 ? trigger_link_v0 : trigger_link_v1;
 | 
				
			||||||
		spa_list_append(&c->links, &link->link);
 | 
							spa_list_append(&c->links, &link->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pw_data_loop_invoke(c->loop,
 | 
							pw_loop_locked(c->loop->loop,
 | 
				
			||||||
                       do_add_link, SPA_ID_INVALID, NULL, 0, false, link);
 | 
					                       do_add_link, SPA_ID_INVALID, NULL, 0, link);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
		link = find_activation(&c->links, node_id);
 | 
							link = find_activation(&c->links, node_id);
 | 
				
			||||||
| 
						 | 
					@ -3307,8 +3318,8 @@ static int client_node_set_activation(void *data,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		spa_list_remove(&link->link);
 | 
							spa_list_remove(&link->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pw_data_loop_invoke(c->loop,
 | 
							pw_loop_locked(c->loop->loop,
 | 
				
			||||||
                       do_remove_link, SPA_ID_INVALID, NULL, 0, false, link);
 | 
					                       do_remove_link, SPA_ID_INVALID, NULL, 0, link);
 | 
				
			||||||
		queue_free_link(c, link);
 | 
							queue_free_link(c, link);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3674,6 +3685,67 @@ static const struct pw_node_events node_events = {
 | 
				
			||||||
	.info = node_info,
 | 
						.info = node_info,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FILTER_NAME	" ()[].:*$"
 | 
				
			||||||
 | 
					#define FILTER_PORT	" ()[].*$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void filter_name(char *str, const char *filter, char filter_char)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char *p;
 | 
				
			||||||
 | 
						for (p = str; *p; p++) {
 | 
				
			||||||
 | 
							if (strchr(filter, *p) != NULL)
 | 
				
			||||||
 | 
								*p = filter_char;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int update_port_name(struct object *o, const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct object *ot = o->port.node, *op;
 | 
				
			||||||
 | 
						struct client *c = o->client;
 | 
				
			||||||
 | 
						char tmp[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
 | 
						char port_name[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (o->port.is_monitor && !c->merge_monitor)
 | 
				
			||||||
 | 
							snprintf(tmp, sizeof(tmp), "%.*s%s:%s",
 | 
				
			||||||
 | 
								(int)(JACK_CLIENT_NAME_SIZE-(sizeof(MONITOR_EXT)-1)),
 | 
				
			||||||
 | 
								ot->node.name, MONITOR_EXT, name);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							snprintf(tmp, sizeof(tmp), "%s:%s", ot->node.name, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (c->filter_name)
 | 
				
			||||||
 | 
							filter_name(tmp, FILTER_PORT, c->filter_char);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						op = find_port_by_name(c, tmp);
 | 
				
			||||||
 | 
						if (op != NULL && op != o)
 | 
				
			||||||
 | 
							snprintf(port_name, sizeof(port_name), "%.*s-%u",
 | 
				
			||||||
 | 
									(int)(sizeof(tmp)-11), tmp, o->serial);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							snprintf(port_name, sizeof(port_name), "%s", tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (spa_streq(port_name, o->port.name))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						strcpy(o->port.old_name, o->port.name);
 | 
				
			||||||
 | 
						strcpy(o->port.name, port_name);
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void port_info(void *data, const struct pw_port_info *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct object *o = data;
 | 
				
			||||||
 | 
						struct client *c = o->client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (info->change_mask & PW_PORT_CHANGE_MASK_PROPS) {
 | 
				
			||||||
 | 
							const char *str = spa_dict_lookup(info->props, PW_KEY_PORT_NAME);
 | 
				
			||||||
 | 
							if (str != NULL) {
 | 
				
			||||||
 | 
								if (update_port_name(o, str) > 0) {
 | 
				
			||||||
 | 
									pw_log_info("%p: port rename %u %s->%s", c, o->serial,
 | 
				
			||||||
 | 
											o->port.old_name, o->port.name);
 | 
				
			||||||
 | 
									queue_notify(c, NOTIFY_TYPE_PORT_RENAME, o, 1, NULL);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void port_param(void *data, int seq,
 | 
					static void port_param(void *data, int seq,
 | 
				
			||||||
			uint32_t id, uint32_t index, uint32_t next,
 | 
								uint32_t id, uint32_t index, uint32_t next,
 | 
				
			||||||
			const struct spa_pod *param)
 | 
								const struct spa_pod *param)
 | 
				
			||||||
| 
						 | 
					@ -3696,27 +3768,16 @@ static void port_param(void *data, int seq,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct pw_port_events port_events = {
 | 
					static const struct pw_port_events port_events = {
 | 
				
			||||||
	PW_VERSION_PORT_EVENTS,
 | 
						PW_VERSION_PORT_EVENTS,
 | 
				
			||||||
 | 
						.info = port_info,
 | 
				
			||||||
	.param = port_param,
 | 
						.param = port_param,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define FILTER_NAME	" ()[].:*$"
 | 
					 | 
				
			||||||
#define FILTER_PORT	" ()[].*$"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void filter_name(char *str, const char *filter, char filter_char)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	char *p;
 | 
					 | 
				
			||||||
	for (p = str; *p; p++) {
 | 
					 | 
				
			||||||
		if (strchr(filter, *p) != NULL)
 | 
					 | 
				
			||||||
			*p = filter_char;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void registry_event_global(void *data, uint32_t id,
 | 
					static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
                                  uint32_t permissions, const char *type, uint32_t version,
 | 
					                                  uint32_t permissions, const char *type, uint32_t version,
 | 
				
			||||||
                                  const struct spa_dict *props)
 | 
					                                  const struct spa_dict *props)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct client *c = (struct client *) data;
 | 
						struct client *c = (struct client *) data;
 | 
				
			||||||
	struct object *o, *ot, *op;
 | 
						struct object *o, *ot;
 | 
				
			||||||
	const char *str;
 | 
						const char *str;
 | 
				
			||||||
	bool do_emit = true, do_sync = false;
 | 
						bool do_emit = true, do_sync = false;
 | 
				
			||||||
	uint32_t serial;
 | 
						uint32_t serial;
 | 
				
			||||||
| 
						 | 
					@ -3782,6 +3843,8 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (str == NULL)
 | 
							if (str == NULL)
 | 
				
			||||||
			str = node_name;
 | 
								str = node_name;
 | 
				
			||||||
 | 
							if (str == NULL)
 | 
				
			||||||
 | 
								str = spa_dict_lookup(props, PW_KEY_OBJECT_PATH);
 | 
				
			||||||
		if (str == NULL)
 | 
							if (str == NULL)
 | 
				
			||||||
			str = "node";
 | 
								str = "node";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3837,6 +3900,7 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
		uint32_t node_id;
 | 
							uint32_t node_id;
 | 
				
			||||||
		bool is_monitor = false;
 | 
							bool is_monitor = false;
 | 
				
			||||||
		char tmp[REAL_JACK_PORT_NAME_SIZE+1];
 | 
							char tmp[REAL_JACK_PORT_NAME_SIZE+1];
 | 
				
			||||||
 | 
							const char *name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((str = spa_dict_lookup(props, PW_KEY_FORMAT_DSP)) == NULL)
 | 
							if ((str = spa_dict_lookup(props, PW_KEY_FORMAT_DSP)) == NULL)
 | 
				
			||||||
			str = "other";
 | 
								str = "other";
 | 
				
			||||||
| 
						 | 
					@ -3852,7 +3916,7 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
		    spa_strstartswith(str, "jack:flags:"))
 | 
							    spa_strstartswith(str, "jack:flags:"))
 | 
				
			||||||
			flags = atoi(str+11);
 | 
								flags = atoi(str+11);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ((str = spa_dict_lookup(props, PW_KEY_PORT_NAME)) == NULL)
 | 
							if ((name = spa_dict_lookup(props, PW_KEY_PORT_NAME)) == NULL)
 | 
				
			||||||
			goto exit;
 | 
								goto exit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (type_id == TYPE_ID_UMP && c->flag_midi2)
 | 
							if (type_id == TYPE_ID_UMP && c->flag_midi2)
 | 
				
			||||||
| 
						 | 
					@ -3888,7 +3952,7 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		o = NULL;
 | 
							o = NULL;
 | 
				
			||||||
		if (node_id == c->node_id) {
 | 
							if (node_id == c->node_id) {
 | 
				
			||||||
			snprintf(tmp, sizeof(tmp), "%s:%s", c->name, str);
 | 
								snprintf(tmp, sizeof(tmp), "%s:%s", c->name, name);
 | 
				
			||||||
			o = find_port_by_name(c, tmp);
 | 
								o = find_port_by_name(c, tmp);
 | 
				
			||||||
			if (o != NULL)
 | 
								if (o != NULL)
 | 
				
			||||||
				pw_log_info("%p: %s found our port %p", c, tmp, o);
 | 
									pw_log_info("%p: %s found our port %p", c, tmp, o);
 | 
				
			||||||
| 
						 | 
					@ -3906,6 +3970,7 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
			o->port.node = ot;
 | 
								o->port.node = ot;
 | 
				
			||||||
			o->port.latency[SPA_DIRECTION_INPUT] = SPA_LATENCY_INFO(SPA_DIRECTION_INPUT);
 | 
								o->port.latency[SPA_DIRECTION_INPUT] = SPA_LATENCY_INFO(SPA_DIRECTION_INPUT);
 | 
				
			||||||
			o->port.latency[SPA_DIRECTION_OUTPUT] = SPA_LATENCY_INFO(SPA_DIRECTION_OUTPUT);
 | 
								o->port.latency[SPA_DIRECTION_OUTPUT] = SPA_LATENCY_INFO(SPA_DIRECTION_OUTPUT);
 | 
				
			||||||
 | 
								o->port.type_id = type_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			do_emit = node_is_active(c, ot);
 | 
								do_emit = node_is_active(c, ot);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3927,27 +3992,12 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
			pthread_mutex_lock(&c->context.lock);
 | 
								pthread_mutex_lock(&c->context.lock);
 | 
				
			||||||
			spa_list_append(&c->context.objects, &o->link);
 | 
								spa_list_append(&c->context.objects, &o->link);
 | 
				
			||||||
			pthread_mutex_unlock(&c->context.lock);
 | 
								pthread_mutex_unlock(&c->context.lock);
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (is_monitor && !c->merge_monitor)
 | 
					 | 
				
			||||||
				snprintf(tmp, sizeof(tmp), "%.*s%s:%s",
 | 
					 | 
				
			||||||
					(int)(JACK_CLIENT_NAME_SIZE-(sizeof(MONITOR_EXT)-1)),
 | 
					 | 
				
			||||||
					ot->node.name, MONITOR_EXT, str);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				snprintf(tmp, sizeof(tmp), "%s:%s", ot->node.name, str);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (c->filter_name)
 | 
					 | 
				
			||||||
				filter_name(tmp, FILTER_PORT, c->filter_char);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			op = find_port_by_name(c, tmp);
 | 
					 | 
				
			||||||
			if (op != NULL)
 | 
					 | 
				
			||||||
				snprintf(o->port.name, sizeof(o->port.name), "%.*s-%u",
 | 
					 | 
				
			||||||
						(int)(sizeof(tmp)-11), tmp, serial);
 | 
					 | 
				
			||||||
			else
 | 
					 | 
				
			||||||
				snprintf(o->port.name, sizeof(o->port.name), "%s", tmp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			o->port.type_id = type_id;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							o->port.flags = flags;
 | 
				
			||||||
 | 
							o->port.node_id = node_id;
 | 
				
			||||||
 | 
							o->port.is_monitor = is_monitor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (c->fill_aliases) {
 | 
							if (c->fill_aliases) {
 | 
				
			||||||
			if ((str = spa_dict_lookup(props, PW_KEY_OBJECT_PATH)) != NULL)
 | 
								if ((str = spa_dict_lookup(props, PW_KEY_OBJECT_PATH)) != NULL)
 | 
				
			||||||
				snprintf(o->port.alias1, sizeof(o->port.alias1), "%s", str);
 | 
									snprintf(o->port.alias1, sizeof(o->port.alias1), "%s", str);
 | 
				
			||||||
| 
						 | 
					@ -3955,7 +4005,6 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
			if ((str = spa_dict_lookup(props, PW_KEY_PORT_ALIAS)) != NULL)
 | 
								if ((str = spa_dict_lookup(props, PW_KEY_PORT_ALIAS)) != NULL)
 | 
				
			||||||
				snprintf(o->port.alias2, sizeof(o->port.alias2), "%s", str);
 | 
									snprintf(o->port.alias2, sizeof(o->port.alias2), "%s", str);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if ((str = spa_dict_lookup(props, PW_KEY_PORT_ID)) != NULL) {
 | 
							if ((str = spa_dict_lookup(props, PW_KEY_PORT_ID)) != NULL) {
 | 
				
			||||||
			o->port.system_id = atoi(str);
 | 
								o->port.system_id = atoi(str);
 | 
				
			||||||
			snprintf(o->port.system, sizeof(o->port.system), "system:%s_%d",
 | 
								snprintf(o->port.system, sizeof(o->port.system), "system:%s_%d",
 | 
				
			||||||
| 
						 | 
					@ -3964,9 +4013,8 @@ static void registry_event_global(void *data, uint32_t id,
 | 
				
			||||||
					o->port.system_id+1);
 | 
										o->port.system_id+1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		o->port.flags = flags;
 | 
							if (node_id != c->node_id)
 | 
				
			||||||
		o->port.node_id = node_id;
 | 
								update_port_name(o, name);
 | 
				
			||||||
		o->port.is_monitor = is_monitor;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pw_log_debug("%p: %p add port %d name:%s %d", c, o, id,
 | 
							pw_log_debug("%p: %p add port %d name:%s %d", c, o, id,
 | 
				
			||||||
				o->port.name, type_id);
 | 
									o->port.name, type_id);
 | 
				
			||||||
| 
						 | 
					@ -5755,13 +5803,15 @@ static void *get_buffer_input_midi(struct port *p, jack_nframes_t frames)
 | 
				
			||||||
	struct mix *mix;
 | 
						struct mix *mix;
 | 
				
			||||||
	void *ptr = p->emptyptr;
 | 
						void *ptr = p->emptyptr;
 | 
				
			||||||
	struct midi_buffer *mb = (struct midi_buffer*)midi_scratch;
 | 
						struct midi_buffer *mb = (struct midi_buffer*)midi_scratch;
 | 
				
			||||||
	struct spa_pod_sequence *seq[MAX_MIX];
 | 
						struct mix_info *mix_info[MAX_MIX];
 | 
				
			||||||
	uint32_t n_seq = 0;
 | 
						uint32_t n_mix_info = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_list_for_each(mix, &p->mix, port_link) {
 | 
						spa_list_for_each(mix, &p->mix, port_link) {
 | 
				
			||||||
		struct spa_data *d;
 | 
							struct spa_data *d;
 | 
				
			||||||
		struct buffer *b;
 | 
							struct buffer *b;
 | 
				
			||||||
		void *pod;
 | 
							struct mix_info *mi = &mix->mix_info;
 | 
				
			||||||
 | 
							struct spa_pod_sequence seq;
 | 
				
			||||||
 | 
							const void *seq_body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (mix->id == SPA_ID_INVALID)
 | 
							if (mix->id == SPA_ID_INVALID)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
| 
						 | 
					@ -5773,21 +5823,24 @@ static void *get_buffer_input_midi(struct port *p, jack_nframes_t frames)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		d = &b->datas[0];
 | 
							d = &b->datas[0];
 | 
				
			||||||
 | 
							spa_pod_parser_init_from_data(&mi->parser, d->data, d->maxsize,
 | 
				
			||||||
		if ((pod = spa_pod_from_data(d->data, d->maxsize, d->chunk->offset, d->chunk->size)) == NULL)
 | 
									d->chunk->offset, d->chunk->size);
 | 
				
			||||||
 | 
							if (spa_pod_parser_push_sequence_body(&mi->parser,
 | 
				
			||||||
 | 
										&mi->frame, &seq, &seq_body) < 0)
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
		if (!spa_pod_is_sequence(pod))
 | 
					                if (spa_pod_parser_get_control_body(&mi->parser,
 | 
				
			||||||
 | 
					                                        &mi->control, &mi->control_body) < 0)
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		seq[n_seq++] = pod;
 | 
							mix_info[n_mix_info++] = mi;
 | 
				
			||||||
		if (n_seq == MAX_MIX)
 | 
							if (n_mix_info == MAX_MIX)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	midi_init_buffer(mb, MIDI_SCRATCH_FRAMES, frames);
 | 
						midi_init_buffer(mb, MIDI_SCRATCH_FRAMES, frames);
 | 
				
			||||||
	/* first convert to a thread local scratch buffer, then memcpy into
 | 
						/* first convert to a thread local scratch buffer, then memcpy into
 | 
				
			||||||
	 * the per port buffer. This makes it possible to call this function concurrently
 | 
						 * the per port buffer. This makes it possible to call this function concurrently
 | 
				
			||||||
	 * but also have different pointers per port */
 | 
						 * but also have different pointers per port */
 | 
				
			||||||
	convert_to_event(seq, n_seq, mb, p->client->fix_midi_events, p->object->port.type_id);
 | 
						convert_to_event(mix_info, n_mix_info, mb, p->client->fix_midi_events, p->object->port.type_id);
 | 
				
			||||||
	memcpy(ptr, mb, sizeof(struct midi_buffer) + (mb->event_count
 | 
						memcpy(ptr, mb, sizeof(struct midi_buffer) + (mb->event_count
 | 
				
			||||||
                              * sizeof(struct midi_event)));
 | 
					                              * sizeof(struct midi_event)));
 | 
				
			||||||
	if (mb->write_pos > 0) {
 | 
						if (mb->write_pos > 0) {
 | 
				
			||||||
| 
						 | 
					@ -5854,21 +5907,26 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
 | 
				
			||||||
			goto done;
 | 
								goto done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (TYPE_ID_IS_EVENT(o->port.type_id)) {
 | 
							if (TYPE_ID_IS_EVENT(o->port.type_id)) {
 | 
				
			||||||
			struct spa_pod_sequence *seq[1];
 | 
								struct mix_info *mix_info[1], mi;
 | 
				
			||||||
			struct spa_data *d;
 | 
								struct spa_data *d;
 | 
				
			||||||
			void *pod;
 | 
								struct spa_pod_sequence seq;
 | 
				
			||||||
 | 
								const void *seq_body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ptr = midi_scratch;
 | 
								ptr = midi_scratch;
 | 
				
			||||||
			midi_init_buffer(ptr, MIDI_SCRATCH_FRAMES, frames);
 | 
								midi_init_buffer(ptr, MIDI_SCRATCH_FRAMES, frames);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			d = &b->datas[0];
 | 
								d = &b->datas[0];
 | 
				
			||||||
			if ((pod = spa_pod_from_data(d->data, d->maxsize,
 | 
								spa_pod_parser_init_from_data(&mi.parser, d->data, d->maxsize,
 | 
				
			||||||
							d->chunk->offset, d->chunk->size)) == NULL)
 | 
										d->chunk->offset, d->chunk->size);
 | 
				
			||||||
 | 
								if (spa_pod_parser_push_sequence_body(&mi.parser,
 | 
				
			||||||
 | 
											&mi.frame, &seq, &seq_body) < 0)
 | 
				
			||||||
				goto done;
 | 
									goto done;
 | 
				
			||||||
			if (!spa_pod_is_sequence(pod))
 | 
						                if (spa_pod_parser_get_control_body(&mi.parser,
 | 
				
			||||||
 | 
						                                        &mi.control, &mi.control_body) < 0)
 | 
				
			||||||
				goto done;
 | 
									goto done;
 | 
				
			||||||
			seq[0] = pod;
 | 
					
 | 
				
			||||||
			convert_to_event(seq, 1, ptr, c->fix_midi_events, o->port.type_id);
 | 
								mix_info[0] = &mi;
 | 
				
			||||||
 | 
								convert_to_event(mix_info, 1, ptr, c->fix_midi_events, o->port.type_id);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			ptr = get_buffer_data(b, frames);
 | 
								ptr = get_buffer_data(b, frames);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -772,6 +772,19 @@ static int v4l2_dup(int oldfd)
 | 
				
			||||||
	return do_dup(oldfd, FD_MAP_DUP);
 | 
						return do_dup(oldfd, FD_MAP_DUP);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Deferred PipeWire init (called on first device access) */
 | 
				
			||||||
 | 
					static void pipewire_init_func(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						pw_init(NULL, NULL);
 | 
				
			||||||
 | 
						PW_LOG_TOPIC_INIT(v4l2_log_topic);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void ensure_pipewire_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static pthread_once_t pipewire_once = PTHREAD_ONCE_INIT;
 | 
				
			||||||
 | 
						pthread_once(&pipewire_once, pipewire_init_func);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int v4l2_openat(int dirfd, const char *path, int oflag, mode_t mode)
 | 
					static int v4l2_openat(int dirfd, const char *path, int oflag, mode_t mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int res, flags;
 | 
						int res, flags;
 | 
				
			||||||
| 
						 | 
					@ -795,6 +808,8 @@ static int v4l2_openat(int dirfd, const char *path, int oflag, mode_t mode)
 | 
				
			||||||
	if (passthrough)
 | 
						if (passthrough)
 | 
				
			||||||
		return globals.old_fops.openat(dirfd, path, oflag, mode);
 | 
							return globals.old_fops.openat(dirfd, path, oflag, mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ensure_pipewire_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pw_log_info("path:%s oflag:%d mode:%d", path, oflag, mode);
 | 
						pw_log_info("path:%s oflag:%d mode:%d", path, oflag, mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((file = find_file_by_dev(dev_id)) != NULL) {
 | 
						if ((file = find_file_by_dev(dev_id)) != NULL) {
 | 
				
			||||||
| 
						 | 
					@ -1385,7 +1400,6 @@ static int vidioc_enum_framesizes(struct file *file, struct v4l2_frmsizeenum *ar
 | 
				
			||||||
	spa_list_for_each(p, &g->param_list, link) {
 | 
						spa_list_for_each(p, &g->param_list, link) {
 | 
				
			||||||
		const struct format_info *fi;
 | 
							const struct format_info *fi;
 | 
				
			||||||
		uint32_t media_type, media_subtype, format;
 | 
							uint32_t media_type, media_subtype, format;
 | 
				
			||||||
		struct spa_rectangle size;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (p->id != SPA_PARAM_EnumFormat || p->param == NULL)
 | 
							if (p->id != SPA_PARAM_EnumFormat || p->param == NULL)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
| 
						 | 
					@ -1409,22 +1423,96 @@ static int vidioc_enum_framesizes(struct file *file, struct v4l2_frmsizeenum *ar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (fi->fourcc != arg->pixel_format)
 | 
							if (fi->fourcc != arg->pixel_format)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		if (spa_pod_parse_object(p->param,
 | 
					
 | 
				
			||||||
				SPA_TYPE_OBJECT_Format, NULL,
 | 
							const struct spa_pod_prop *size_prop = spa_pod_find_prop(p->param, NULL, SPA_FORMAT_VIDEO_size);
 | 
				
			||||||
				SPA_FORMAT_VIDEO_size, SPA_POD_Rectangle(&size)) < 0)
 | 
							if (!size_prop)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		arg->type = V4L2_FRMSIZE_TYPE_DISCRETE;
 | 
							uint32_t n_sizes, choice;
 | 
				
			||||||
		arg->discrete.width = size.width;
 | 
							const struct spa_pod *size_pods = spa_pod_get_values(&size_prop->value, &n_sizes, &choice);
 | 
				
			||||||
		arg->discrete.height = size.height;
 | 
							if (!size_pods || n_sizes <= 0)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const struct spa_rectangle *sizes = SPA_POD_BODY_CONST(size_pods);
 | 
				
			||||||
 | 
							if (size_pods->type != SPA_TYPE_Rectangle || size_pods->size != sizeof(*sizes))
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							switch (choice) {
 | 
				
			||||||
 | 
							case SPA_CHOICE_Enum:
 | 
				
			||||||
 | 
								n_sizes -= 1;
 | 
				
			||||||
 | 
								sizes += 1;
 | 
				
			||||||
 | 
								SPA_FALLTHROUGH;
 | 
				
			||||||
 | 
							case SPA_CHOICE_None:
 | 
				
			||||||
 | 
								arg->type = V4L2_FRMSIZE_TYPE_DISCRETE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for (size_t i = 0; i < n_sizes; i++, count++) {
 | 
				
			||||||
 | 
									arg->discrete.width = sizes[i].width;
 | 
				
			||||||
 | 
									arg->discrete.height = sizes[i].height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									pw_log_debug("count:%u %.4s %ux%u", count, (char*)&fi->fourcc,
 | 
				
			||||||
 | 
											arg->discrete.width, arg->discrete.height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pw_log_debug("count:%d %.4s %dx%d", count, (char*)&fi->fourcc,
 | 
					 | 
				
			||||||
				size.width, size.height);
 | 
					 | 
				
			||||||
				if (count == arg->index) {
 | 
									if (count == arg->index) {
 | 
				
			||||||
					found = true;
 | 
										found = true;
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SPA_CHOICE_Range:
 | 
				
			||||||
 | 
								if (n_sizes < 3)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								arg->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
 | 
				
			||||||
 | 
								arg->stepwise.min_width = sizes[1].width;
 | 
				
			||||||
 | 
								arg->stepwise.min_height = sizes[1].height;
 | 
				
			||||||
 | 
								arg->stepwise.max_width = sizes[2].width;
 | 
				
			||||||
 | 
								arg->stepwise.max_height = sizes[2].height;
 | 
				
			||||||
 | 
								arg->stepwise.step_width = arg->stepwise.step_height = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								pw_log_debug("count:%u %.4s (%ux%u)-(%ux%u)", count, (char*)&fi->fourcc,
 | 
				
			||||||
 | 
										arg->stepwise.min_width, arg->stepwise.min_height,
 | 
				
			||||||
 | 
										arg->stepwise.max_width, arg->stepwise.max_height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (count == arg->index) {
 | 
				
			||||||
 | 
									found = true;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			count++;
 | 
								count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SPA_CHOICE_Step:
 | 
				
			||||||
 | 
								if (n_sizes < 4)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								arg->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
 | 
				
			||||||
 | 
								arg->stepwise.min_width = sizes[1].width;
 | 
				
			||||||
 | 
								arg->stepwise.min_height = sizes[1].height;
 | 
				
			||||||
 | 
								arg->stepwise.max_width = sizes[2].width;
 | 
				
			||||||
 | 
								arg->stepwise.max_height = sizes[2].height;
 | 
				
			||||||
 | 
								arg->stepwise.step_width = sizes[3].width;
 | 
				
			||||||
 | 
								arg->stepwise.step_height = sizes[3].height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								pw_log_debug("count:%u %.4s (%ux%u)-(%ux%u)/(+%u,%u)", count, (char*)&fi->fourcc,
 | 
				
			||||||
 | 
										arg->stepwise.min_width, arg->stepwise.min_height,
 | 
				
			||||||
 | 
										arg->stepwise.min_width, arg->stepwise.min_height,
 | 
				
			||||||
 | 
										arg->stepwise.step_width, arg->stepwise.step_height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (count == arg->index) {
 | 
				
			||||||
 | 
									found = true;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								count++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (found)
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pw_thread_loop_unlock(file->loop);
 | 
						pw_thread_loop_unlock(file->loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2100,7 +2188,7 @@ static struct {
 | 
				
			||||||
	{ V4L2_CID_SATURATION, SPA_PROP_saturation },
 | 
						{ V4L2_CID_SATURATION, SPA_PROP_saturation },
 | 
				
			||||||
	{ V4L2_CID_HUE, SPA_PROP_hue },
 | 
						{ V4L2_CID_HUE, SPA_PROP_hue },
 | 
				
			||||||
	{ V4L2_CID_GAMMA, SPA_PROP_gamma },
 | 
						{ V4L2_CID_GAMMA, SPA_PROP_gamma },
 | 
				
			||||||
	{ V4L2_CID_EXPOSURE, SPA_PROP_exposure },
 | 
						{ V4L2_CID_EXPOSURE_ABSOLUTE, SPA_PROP_exposure },
 | 
				
			||||||
	{ V4L2_CID_GAIN, SPA_PROP_gain },
 | 
						{ V4L2_CID_GAIN, SPA_PROP_gain },
 | 
				
			||||||
	{ V4L2_CID_SHARPNESS, SPA_PROP_sharpness },
 | 
						{ V4L2_CID_SHARPNESS, SPA_PROP_sharpness },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -2311,6 +2399,8 @@ static int vidioc_s_ctrl(struct file *file, struct v4l2_control *arg)
 | 
				
			||||||
			struct spa_pod_frame f[1];
 | 
								struct spa_pod_frame f[1];
 | 
				
			||||||
			struct spa_pod *param;
 | 
								struct spa_pod *param;
 | 
				
			||||||
			pod = spa_pod_get_values(type, &n_vals, &choice);
 | 
								pod = spa_pod_get_values(type, &n_vals, &choice);
 | 
				
			||||||
 | 
								if (n_vals < 1)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			spa_pod_builder_push_object(&b, &f[0],
 | 
								spa_pod_builder_push_object(&b, &f[0],
 | 
				
			||||||
					SPA_TYPE_OBJECT_Props,  SPA_PARAM_Props);
 | 
										SPA_TYPE_OBJECT_Props,  SPA_PARAM_Props);
 | 
				
			||||||
| 
						 | 
					@ -2563,10 +2653,14 @@ static void initialize(void)
 | 
				
			||||||
	globals.old_fops.ioctl = dlsym(RTLD_NEXT, "ioctl");
 | 
						globals.old_fops.ioctl = dlsym(RTLD_NEXT, "ioctl");
 | 
				
			||||||
	globals.old_fops.mmap = dlsym(RTLD_NEXT, "mmap64");
 | 
						globals.old_fops.mmap = dlsym(RTLD_NEXT, "mmap64");
 | 
				
			||||||
	globals.old_fops.munmap = dlsym(RTLD_NEXT, "munmap");
 | 
						globals.old_fops.munmap = dlsym(RTLD_NEXT, "munmap");
 | 
				
			||||||
 | 
						/* NOTE:
 | 
				
			||||||
	pw_init(NULL, NULL);
 | 
						 * We avoid calling pw_init() here (constructor/early init path) because
 | 
				
			||||||
	PW_LOG_TOPIC_INIT(v4l2_log_topic);
 | 
						 * that can deadlock in certain host processes (e.g. Zoom >= 5.0) when
 | 
				
			||||||
 | 
						 * the preload causes PipeWire initialisation to run too early.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * PipeWire initialisation (pw_init + PW_LOG_TOPIC_INIT) is deferred
 | 
				
			||||||
 | 
						 * to ensure it runs on-demand in the first actual V4L2 open call.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	pthread_mutex_init(&globals.lock, NULL);
 | 
						pthread_mutex_init(&globals.lock, NULL);
 | 
				
			||||||
	pw_array_init(&globals.file_maps, 1024);
 | 
						pw_array_init(&globals.file_maps, 1024);
 | 
				
			||||||
	pw_array_init(&globals.fd_maps, 256);
 | 
						pw_array_init(&globals.fd_maps, 256);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
af
 | 
					af
 | 
				
			||||||
 | 
					ar
 | 
				
			||||||
as
 | 
					as
 | 
				
			||||||
be
 | 
					be
 | 
				
			||||||
bg
 | 
					bg
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										797
									
								
								po/ar.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										797
									
								
								po/ar.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,797 @@
 | 
				
			||||||
 | 
					# Arabic translation of PipeWire
 | 
				
			||||||
 | 
					# This file is distributed under the same license as the pipewire package.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# SPDX-FileCopyrightText: 2025 r <r>
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"Project-Id-Version: pipewire\n"
 | 
				
			||||||
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/issues/"
 | 
				
			||||||
 | 
					"new\n"
 | 
				
			||||||
 | 
					"POT-Creation-Date: 2024-02-25 03:43+0300\n"
 | 
				
			||||||
 | 
					"PO-Revision-Date: 2025-06-22 13:09+0200\n"
 | 
				
			||||||
 | 
					"Last-Translator: r <r>\n"
 | 
				
			||||||
 | 
					"Language-Team: Arabic <kde-i18n-doc@kde.org>\n"
 | 
				
			||||||
 | 
					"Language: ar\n"
 | 
				
			||||||
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
 | 
					"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && "
 | 
				
			||||||
 | 
					"n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
 | 
				
			||||||
 | 
					"X-Generator: Lokalize 25.04.0\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/daemon/pipewire.c:26
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"%s [options]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            Show this help\n"
 | 
				
			||||||
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
 | 
					"  -c, --config                          Load config (Default %s)\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"%s [خيارات]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            إظهار هذه المساعدة\n"
 | 
				
			||||||
 | 
					"      --version                         إظهار الإصدار\n"
 | 
				
			||||||
 | 
					"  -c, --config                          تحميل التضبيط (الافتراضي %s)\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
 | 
					msgstr "نظام الوسائط بايبواير"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/daemon/pipewire.desktop.in:5
 | 
				
			||||||
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
 | 
					msgstr "ابدأ نظام الوسائط بايبواير"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:159
 | 
				
			||||||
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:159
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "Tunnel to %s%s%s"
 | 
				
			||||||
 | 
					msgstr "نفّق إلى %s%s%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-fallback-sink.c:40
 | 
				
			||||||
 | 
					msgid "Dummy Output"
 | 
				
			||||||
 | 
					msgstr "إخراج وهمي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-pulse-tunnel.c:774
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "Tunnel for %s@%s"
 | 
				
			||||||
 | 
					msgstr "نفّق ل %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-zeroconf-discover.c:315
 | 
				
			||||||
 | 
					msgid "Unknown device"
 | 
				
			||||||
 | 
					msgstr "جهاز غير معروف"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-zeroconf-discover.c:327
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s on %s@%s"
 | 
				
			||||||
 | 
					msgstr "%s على %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/modules/module-zeroconf-discover.c:331
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s on %s"
 | 
				
			||||||
 | 
					msgstr "%s على %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/tools/pw-cat.c:991
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            Show this help\n"
 | 
				
			||||||
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Enable verbose operations\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"%s [خيارات] [<file>|-]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            إظهار هذه المساعدة\n"
 | 
				
			||||||
 | 
					"      --version                         إظهار الإصدار\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         تمكين العمليات المطولة\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/tools/pw-cat.c:998
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
 | 
					"      --media-type                      Set media type (default %s)\n"
 | 
				
			||||||
 | 
					"      --media-category                  Set media category (default %s)\n"
 | 
				
			||||||
 | 
					"      --media-role                      Set media role (default %s)\n"
 | 
				
			||||||
 | 
					"      --target                          Set node target serial or name "
 | 
				
			||||||
 | 
					"(default %s)\n"
 | 
				
			||||||
 | 
					"                                          0 means don't link\n"
 | 
				
			||||||
 | 
					"      --latency                         Set node latency (default %s)\n"
 | 
				
			||||||
 | 
					"                                          Xunit (unit = s, ms, us, ns)\n"
 | 
				
			||||||
 | 
					"                                          or direct samples (256)\n"
 | 
				
			||||||
 | 
					"                                          the rate is the one of the source "
 | 
				
			||||||
 | 
					"file\n"
 | 
				
			||||||
 | 
					"  -P  --properties                      Set node properties\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"-R, --remote                          اسم العملية الخفية البعيدة\n"
 | 
				
			||||||
 | 
					"      --media-type                      تعيين نوع الوسائط (الافتراضي %s)\n"
 | 
				
			||||||
 | 
					"      --media-category                  تعيين فئة الوسائط (الافتراضي %s)\n"
 | 
				
			||||||
 | 
					"      --media-role                      تعيين دور الوسائط (الافتراضي %s)\n"
 | 
				
			||||||
 | 
					"      --target                          تعيين المسلسل أو اسم هدف العُقدة "
 | 
				
			||||||
 | 
					"\n (الافتراضي %s)"
 | 
				
			||||||
 | 
					"                                          0 يعني عدم الربط\n"
 | 
				
			||||||
 | 
					"      --latency                         تعيين زمن انتقال العُقدة (الافتراضي %s"
 | 
				
			||||||
 | 
					")\n"
 | 
				
			||||||
 | 
					"                                          وحدة X (الوحدة = s, ms, us, ns)\n"
 | 
				
			||||||
 | 
					"                                          أو عينات مباشرة (256)\n"
 | 
				
			||||||
 | 
					"                                          المعدل هو معدل ملف المصدر\n"
 | 
				
			||||||
 | 
					"  -P  --properties                      تعيين خصائص العُقدة\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/tools/pw-cat.c:1016
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
 | 
					"%u)\n"
 | 
				
			||||||
 | 
					"      --channels                        Number of channels (req. for rec) "
 | 
				
			||||||
 | 
					"(default %u)\n"
 | 
				
			||||||
 | 
					"      --channel-map                     Channel map\n"
 | 
				
			||||||
 | 
					"                                            one of: \"stereo\", "
 | 
				
			||||||
 | 
					"\"surround-51\",... or\n"
 | 
				
			||||||
 | 
					"                                            comma separated list of channel "
 | 
				
			||||||
 | 
					"names: eg. \"FL,FR\"\n"
 | 
				
			||||||
 | 
					"      --format                          Sample format %s (req. for rec) "
 | 
				
			||||||
 | 
					"(default %s)\n"
 | 
				
			||||||
 | 
					"      --volume                          Stream volume 0-1.0 (default %.3f)\n"
 | 
				
			||||||
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
 | 
					"%d)\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"--rate                            معدل العينة (مطلوب للتسجيل) (الافتراضي %u)\n"
 | 
				
			||||||
 | 
					"      --channels                        عدد القنوات (مطلوب للتسجيل) (الافتراضي"
 | 
				
			||||||
 | 
					" %u)\n"
 | 
				
			||||||
 | 
					"      --channel-map                     خريطة القنوات\n"
 | 
				
			||||||
 | 
					"                                            أحد الخيارات: \"مِجساميّ\", \"محيط"
 | 
				
			||||||
 | 
					"ي-51\",... أو\n"
 | 
				
			||||||
 | 
					"                                            قائمة بأسماء القنوات مفصولة بفاصلة"
 | 
				
			||||||
 | 
					": مثال \"FL,FR\"\n"
 | 
				
			||||||
 | 
					"      --format                          تنسيق العينة %s (مطلوب للتسجيل) (الافت"
 | 
				
			||||||
 | 
					"راضي %s)\n"
 | 
				
			||||||
 | 
					"      --volume                          حجم البث 0-1.0 (الافتراضي %.3f)\n"
 | 
				
			||||||
 | 
					"  -q  --quality                         جودة إعادة التشكيل (0 - 15) (الافتراضي"
 | 
				
			||||||
 | 
					" %d)\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/tools/pw-cat.c:1033
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"-p, --playback                        وضع التشغيل\n"
 | 
				
			||||||
 | 
					"  -r, --record                          وضع التسجيل\n"
 | 
				
			||||||
 | 
					"  -m, --midi                            وضع Midi\n"
 | 
				
			||||||
 | 
					"  -d, --dsd                             وضع DSD\n"
 | 
				
			||||||
 | 
					"  -o, --encoded                         الوضع المرمّز\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: src/tools/pw-cli.c:2252
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            Show this help\n"
 | 
				
			||||||
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
 | 
					"  -d, --daemon                          Start as daemon (Default false)\n"
 | 
				
			||||||
 | 
					"  -r, --remote                          Remote daemon name\n"
 | 
				
			||||||
 | 
					"  -m, --monitor                         Monitor activity\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"%s [خيارات] [أمر]\n"
 | 
				
			||||||
 | 
					"  -h, --help                            إظهار هذه المساعدة\n"
 | 
				
			||||||
 | 
					"      --version                         إظهار الإصدار\n"
 | 
				
			||||||
 | 
					"  -d, --daemon                          بدء كخفي (افتراضي خطأ)\n"
 | 
				
			||||||
 | 
					"  -r, --remote                          اسم الخفي البعيد\n"
 | 
				
			||||||
 | 
					"  -m, --monitor                         مراقبة النشاط\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:327
 | 
				
			||||||
 | 
					msgid "Pro Audio"
 | 
				
			||||||
 | 
					msgstr "صوت احترافي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:488 spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1701
 | 
				
			||||||
 | 
					msgid "Off"
 | 
				
			||||||
 | 
					msgstr "معطل"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
 | 
					msgid "Input"
 | 
				
			||||||
 | 
					msgstr "الإدخال"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2653
 | 
				
			||||||
 | 
					msgid "Docking Station Input"
 | 
				
			||||||
 | 
					msgstr "إدخال محطة الإرساء"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2654
 | 
				
			||||||
 | 
					msgid "Docking Station Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون محطة الإرساء"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2655
 | 
				
			||||||
 | 
					msgid "Docking Station Line In"
 | 
				
			||||||
 | 
					msgstr "مدخل خطي محط الارساء"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2656
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2747
 | 
				
			||||||
 | 
					msgid "Line In"
 | 
				
			||||||
 | 
					msgstr "مدخل خطي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1989
 | 
				
			||||||
 | 
					msgid "Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2658
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2742
 | 
				
			||||||
 | 
					msgid "Front Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون أمامي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2659
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2743
 | 
				
			||||||
 | 
					msgid "Rear Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون خلفي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2660
 | 
				
			||||||
 | 
					msgid "External Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون خارجي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2661
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2745
 | 
				
			||||||
 | 
					msgid "Internal Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون داخلي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2662
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2748
 | 
				
			||||||
 | 
					msgid "Radio"
 | 
				
			||||||
 | 
					msgstr "راديو"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2663
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2749
 | 
				
			||||||
 | 
					msgid "Video"
 | 
				
			||||||
 | 
					msgstr "مرئيّ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2664
 | 
				
			||||||
 | 
					msgid "Automatic Gain Control"
 | 
				
			||||||
 | 
					msgstr "التحكم التلقائي في الكسب"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2665
 | 
				
			||||||
 | 
					msgid "No Automatic Gain Control"
 | 
				
			||||||
 | 
					msgstr "دون التحكم التلقائي في الكسب"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2666
 | 
				
			||||||
 | 
					msgid "Boost"
 | 
				
			||||||
 | 
					msgstr "تعزيز"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2667
 | 
				
			||||||
 | 
					msgid "No Boost"
 | 
				
			||||||
 | 
					msgstr "دون تعزيز"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2668
 | 
				
			||||||
 | 
					msgid "Amplifier"
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					""
 | 
				
			||||||
 | 
					"مُضَخِّم"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2669
 | 
				
			||||||
 | 
					msgid "No Amplifier"
 | 
				
			||||||
 | 
					msgstr "دون مُضَخِّم"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2670
 | 
				
			||||||
 | 
					msgid "Bass Boost"
 | 
				
			||||||
 | 
					msgstr "تعزيز القرار"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2671
 | 
				
			||||||
 | 
					msgid "No Bass Boost"
 | 
				
			||||||
 | 
					msgstr "دون تعزيز القرار"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1995
 | 
				
			||||||
 | 
					msgid "Speaker"
 | 
				
			||||||
 | 
					msgstr "مكبر صوت"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
				
			||||||
 | 
					msgid "Headphones"
 | 
				
			||||||
 | 
					msgstr "سماعات الأذن"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2740
 | 
				
			||||||
 | 
					msgid "Analog Input"
 | 
				
			||||||
 | 
					msgstr "إدخال التناظري"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2744
 | 
				
			||||||
 | 
					msgid "Dock Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون محطة الارساء"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2746
 | 
				
			||||||
 | 
					msgid "Headset Microphone"
 | 
				
			||||||
 | 
					msgstr "ميكروفون سماعة الرأس"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2750
 | 
				
			||||||
 | 
					msgid "Analog Output"
 | 
				
			||||||
 | 
					msgstr "إخراج تناظري"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2752
 | 
				
			||||||
 | 
					msgid "Headphones 2"
 | 
				
			||||||
 | 
					msgstr "سماعات الأذن 2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2753
 | 
				
			||||||
 | 
					msgid "Headphones Mono Output"
 | 
				
			||||||
 | 
					msgstr "سماعات الأذن أحادية الإخراج"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2754
 | 
				
			||||||
 | 
					msgid "Line Out"
 | 
				
			||||||
 | 
					msgstr "مخرج خطي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2755
 | 
				
			||||||
 | 
					msgid "Analog Mono Output"
 | 
				
			||||||
 | 
					msgstr "إخراج أحادي تناظري"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2756
 | 
				
			||||||
 | 
					msgid "Speakers"
 | 
				
			||||||
 | 
					msgstr "مكبرات الصوت"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2757
 | 
				
			||||||
 | 
					msgid "HDMI / DisplayPort"
 | 
				
			||||||
 | 
					msgstr "HDMI / ديسبلاي بورت"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2758
 | 
				
			||||||
 | 
					msgid "Digital Output (S/PDIF)"
 | 
				
			||||||
 | 
					msgstr "إخراج الرقمي (S/PDIF)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2759
 | 
				
			||||||
 | 
					msgid "Digital Input (S/PDIF)"
 | 
				
			||||||
 | 
					msgstr "إدخال الرقمي (S/PDIF)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2760
 | 
				
			||||||
 | 
					msgid "Multichannel Input"
 | 
				
			||||||
 | 
					msgstr "إدخال متعدد القنوات"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2761
 | 
				
			||||||
 | 
					msgid "Multichannel Output"
 | 
				
			||||||
 | 
					msgstr "إخراج متعدد القنوات"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2762
 | 
				
			||||||
 | 
					msgid "Game Output"
 | 
				
			||||||
 | 
					msgstr "إخراج اللعبة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2763
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2764
 | 
				
			||||||
 | 
					msgid "Chat Output"
 | 
				
			||||||
 | 
					msgstr "إخراج المحادثة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2765
 | 
				
			||||||
 | 
					msgid "Chat Input"
 | 
				
			||||||
 | 
					msgstr "إدخال المحادثة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2766
 | 
				
			||||||
 | 
					msgid "Virtual Surround 7.1"
 | 
				
			||||||
 | 
					msgstr "محيطي تخيلي 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4456
 | 
				
			||||||
 | 
					msgid "Analog Mono"
 | 
				
			||||||
 | 
					msgstr "تناظري أحادي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4457
 | 
				
			||||||
 | 
					msgid "Analog Mono (Left)"
 | 
				
			||||||
 | 
					msgstr "تناظري أحادي (يسار)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
				
			||||||
 | 
					msgid "Analog Mono (Right)"
 | 
				
			||||||
 | 
					msgstr "تناظري أحادي (يمين)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#. Note: Not translated to "Analog Stereo Input", because the source
 | 
				
			||||||
 | 
					#. * name gets "Input" appended to it automatically, so adding "Input"
 | 
				
			||||||
 | 
					#. * here would lead to the source name to become "Analog Stereo Input
 | 
				
			||||||
 | 
					#. * Input". The same logic applies to analog-stereo-output,
 | 
				
			||||||
 | 
					#. * multichannel-input and multichannel-output.
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4467
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4468
 | 
				
			||||||
 | 
					msgid "Analog Stereo"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ تناظري"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
				
			||||||
 | 
					msgid "Mono"
 | 
				
			||||||
 | 
					msgstr "أحادي"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
				
			||||||
 | 
					msgid "Stereo"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1977
 | 
				
			||||||
 | 
					msgid "Headset"
 | 
				
			||||||
 | 
					msgstr "سماعة الرأس"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
				
			||||||
 | 
					msgid "Speakerphone"
 | 
				
			||||||
 | 
					msgstr "مكبر صوت الجوّال"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
				
			||||||
 | 
					msgid "Multichannel"
 | 
				
			||||||
 | 
					msgstr "متعدد القنوات"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
				
			||||||
 | 
					msgid "Analog Surround 2.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
				
			||||||
 | 
					msgid "Analog Surround 3.0"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
				
			||||||
 | 
					msgid "Analog Surround 3.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
				
			||||||
 | 
					msgid "Analog Surround 4.0"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
				
			||||||
 | 
					msgid "Analog Surround 4.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
				
			||||||
 | 
					msgid "Analog Surround 5.0"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
				
			||||||
 | 
					msgid "Analog Surround 5.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 5.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
				
			||||||
 | 
					msgid "Analog Surround 6.0"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
				
			||||||
 | 
					msgid "Analog Surround 6.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
				
			||||||
 | 
					msgid "Analog Surround 7.0"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
				
			||||||
 | 
					msgid "Analog Surround 7.1"
 | 
				
			||||||
 | 
					msgstr "تناظري محيطي 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
				
			||||||
 | 
					msgid "Digital Stereo (IEC958)"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ رقمي (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
				
			||||||
 | 
					msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					msgstr "محيطي رقمي 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
				
			||||||
 | 
					msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					msgstr "محيطي رقمي 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
				
			||||||
 | 
					msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					msgstr "محيطي رقمي 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
				
			||||||
 | 
					msgid "Digital Stereo (HDMI)"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ رقمي (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
				
			||||||
 | 
					msgid "Digital Surround 5.1 (HDMI)"
 | 
				
			||||||
 | 
					msgstr "محيطي رقمي 5.1 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
				
			||||||
 | 
					msgid "Chat"
 | 
				
			||||||
 | 
					msgstr "محادثة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
				
			||||||
 | 
					msgid "Game"
 | 
				
			||||||
 | 
					msgstr "لعبة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4625
 | 
				
			||||||
 | 
					msgid "Analog Mono Duplex"
 | 
				
			||||||
 | 
					msgstr "تناظري أحادي مزدوج"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4626
 | 
				
			||||||
 | 
					msgid "Analog Stereo Duplex"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ تناظري مزدوج"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
 | 
					msgid "Digital Stereo Duplex (IEC958)"
 | 
				
			||||||
 | 
					msgstr "مِجْساميّ رقمي مزدوج (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
				
			||||||
 | 
					msgid "Multichannel Duplex"
 | 
				
			||||||
 | 
					msgstr "مزدوج متعدد القنوات"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
				
			||||||
 | 
					msgid "Stereo Duplex"
 | 
				
			||||||
 | 
					msgstr "مِجساميّ مزدوج"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
				
			||||||
 | 
					msgid "Mono Chat + 7.1 Surround"
 | 
				
			||||||
 | 
					msgstr "محادثة أحادية + محيطي 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s Output"
 | 
				
			||||||
 | 
					msgstr "إخراج %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s Input"
 | 
				
			||||||
 | 
					msgstr "إدخال %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1220 spa/plugins/alsa/acp/alsa-util.c:1314
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
				
			||||||
 | 
					"ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgid_plural ""
 | 
				
			||||||
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
 | 
				
			||||||
 | 
					"ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايت "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[1] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[2] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[3] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[4] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[5] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1286
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgid_plural ""
 | 
				
			||||||
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li bytes "
 | 
				
			||||||
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايت "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[1] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايتات "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[2] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايتات "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[3] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايتات "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[4] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايتات "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[5] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_delay() قيمة كبيرة بشكل استثنائي: %li بايتات "
 | 
				
			||||||
 | 
					"(%s%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1333
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
				
			||||||
 | 
					"%lu.\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_avail_delay() قيمًا غريبة: التأخير %lu أقل من avail "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1376
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid ""
 | 
				
			||||||
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
				
			||||||
 | 
					"(%lu ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgid_plural ""
 | 
				
			||||||
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
 | 
				
			||||||
 | 
					"(%lu ms).\n"
 | 
				
			||||||
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
 | 
					"to the ALSA developers."
 | 
				
			||||||
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايت "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[1] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[2] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[3] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[4] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					msgstr[5] ""
 | 
				
			||||||
 | 
					"أرجعت الدالة snd_pcm_mmap_begin() قيمة كبيرة بشكل استثنائي: %lu بايتات "
 | 
				
			||||||
 | 
					"(%lu مللي ثانية).\n"
 | 
				
			||||||
 | 
					"من المرجح أن يكون هذا خطأ في برنامج تشغيل ALSA '%s'. يُرجى الإبلاغ عن هذه المش"
 | 
				
			||||||
 | 
					"كلة "
 | 
				
			||||||
 | 
					"لمطوري ALSA."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/channelmap.h:457
 | 
				
			||||||
 | 
					msgid "(invalid)"
 | 
				
			||||||
 | 
					msgstr "(غير صالح)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/compat.c:193
 | 
				
			||||||
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
 | 
					msgstr "صوت مدمج"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/compat.c:198
 | 
				
			||||||
 | 
					msgid "Modem"
 | 
				
			||||||
 | 
					msgstr "مودم"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1712
 | 
				
			||||||
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
 | 
					msgstr "بوابة الصوت (مصدر A2DP و HSP/HFP AG)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1760
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
 | 
					msgstr "تشغيل عالي الدقة (A2DP Sink, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1763
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
 | 
					msgstr "مزدوج عالي الدقة (مصدر A2DP/Sink, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1771
 | 
				
			||||||
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
 | 
					msgstr "تشغيل عالي الدقة (A2DP Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1773
 | 
				
			||||||
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
 | 
					msgstr "مزدوج عالي الدقة (مصدر A2DP/Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1823
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
 | 
					msgstr "تشغيل عالي الدقة (BAP Sink, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1828
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
 | 
					msgstr "إدخال عالي الدقة (مصدر BAP, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1832
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
 | 
					msgstr "مزدوج عالي الدقة (مصدر BAP/Sink, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1841
 | 
				
			||||||
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
 | 
					msgstr "تشغيل عالي الدقة (BAP Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1845
 | 
				
			||||||
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
 | 
					msgstr "إدخال عالي الدقة (مصدر BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1848
 | 
				
			||||||
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
 | 
					msgstr "مزدوج عالي الدقة (مصدر BAP/Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1897
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
 | 
					msgstr "وحدة رأس سماعة الرأس (HSP/HFP, codec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1978
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1983
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1990
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1996
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2002
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2008
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2020
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2026
 | 
				
			||||||
 | 
					msgid "Handsfree"
 | 
				
			||||||
 | 
					msgstr "دون استخدام اليدين"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1984
 | 
				
			||||||
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
 | 
					msgstr "دون استخدام اليدين (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2001
 | 
				
			||||||
 | 
					msgid "Headphone"
 | 
				
			||||||
 | 
					msgstr "سماعة الأذن"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2007
 | 
				
			||||||
 | 
					msgid "Portable"
 | 
				
			||||||
 | 
					msgstr "محمول"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2013
 | 
				
			||||||
 | 
					msgid "Car"
 | 
				
			||||||
 | 
					msgstr "سيارة"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2019
 | 
				
			||||||
 | 
					msgid "HiFi"
 | 
				
			||||||
 | 
					msgstr "HiFi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2025
 | 
				
			||||||
 | 
					msgid "Phone"
 | 
				
			||||||
 | 
					msgstr "جوّال"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2032
 | 
				
			||||||
 | 
					msgid "Bluetooth"
 | 
				
			||||||
 | 
					msgstr "بلوتوث"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2033
 | 
				
			||||||
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
 | 
					msgstr "بلوتوث (HFP)"
 | 
				
			||||||
							
								
								
									
										390
									
								
								po/ca.po
									
										
									
									
									
								
							
							
						
						
									
										390
									
								
								po/ca.po
									
										
									
									
									
								
							| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
# Xavier Conde Rueda <xavi.conde@gmail.com>, 2008.
 | 
					# Xavier Conde Rueda <xavi.conde@gmail.com>, 2008.
 | 
				
			||||||
# Agustí Grau <fletxa@gmail.com>, 2009.
 | 
					# Agustí Grau <fletxa@gmail.com>, 2009.
 | 
				
			||||||
# Judith Pintó Subirada <judithp@gmail.com>
 | 
					# Judith Pintó Subirada <judithp@gmail.com>
 | 
				
			||||||
# Jordi Mas i Herǹandez, <jmas@softcatala.org>, 2022-2023
 | 
					# Jordi Mas i Herǹandez, <jmas@softcatala.org>, 2022-2025
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is translated according to the glossary and style guide of
 | 
					# This file is translated according to the glossary and style guide of
 | 
				
			||||||
# Softcatalà. If you plan to modify this file, please read first the page
 | 
					# Softcatalà. If you plan to modify this file, please read first the page
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
# Aquest fitxer s'ha de traduir d'acord amb el recull de termes i la guia
 | 
					# Aquest fitxer s'ha de traduir d'acord amb el recull de termes i la guia
 | 
				
			||||||
# d'estil de Softcatalà. Si voleu modificar aquest fitxer, llegiu si
 | 
					# d'estil de Softcatalà. Si voleu modificar aquest fitxer, llegiu si
 | 
				
			||||||
# us plau la pàgina de catalanització del projecte Fedora a:
 | 
					# us plau la pàgina de catalanització del projecte Fedora a:
 | 
				
			||||||
# http://www.softcatala.org/projectes/fedora/
 | 
					# https://www.softcatala.org/projectes/fedora/
 | 
				
			||||||
# i contacteu l'anterior traductor/a.
 | 
					# i contacteu l'anterior traductor/a.
 | 
				
			||||||
# Josep Torné Llavall <josep.torne@gmail.com>, 2009, 2012.
 | 
					# Josep Torné Llavall <josep.torne@gmail.com>, 2009, 2012.
 | 
				
			||||||
# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2016. #zanata
 | 
					# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2016. #zanata
 | 
				
			||||||
| 
						 | 
					@ -27,10 +27,9 @@
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: pipewire\n"
 | 
					"Project-Id-Version: pipewire\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues\n"
 | 
				
			||||||
"issues\n"
 | 
					"POT-Creation-Date: 2025-07-20 15:32+0000\n"
 | 
				
			||||||
"POT-Creation-Date: 2023-06-06 15:28+0000\n"
 | 
					"PO-Revision-Date: 2025-06-20 21:46+0200\n"
 | 
				
			||||||
"PO-Revision-Date: 2023-06-06 22:39+0200\n"
 | 
					 | 
				
			||||||
"Last-Translator: Jordi Mas i Herǹandez, <jmas@softcatala.org>,\n"
 | 
					"Last-Translator: Jordi Mas i Herǹandez, <jmas@softcatala.org>,\n"
 | 
				
			||||||
"Language-Team: Catalan <fedora@softcatala.net>\n"
 | 
					"Language-Team: Catalan <fedora@softcatala.net>\n"
 | 
				
			||||||
"Language: ca\n"
 | 
					"Language: ca\n"
 | 
				
			||||||
| 
						 | 
					@ -38,60 +37,64 @@ msgstr ""
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
					"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
				
			||||||
"X-Generator: Poedit 2.4.2\n"
 | 
					"X-Generator: Poedit 3.2.2\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.c:26
 | 
					#: src/daemon/pipewire.c:29
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options]\n"
 | 
					"%s [options]\n"
 | 
				
			||||||
"  -h, --help                            Show this help\n"
 | 
					"  -h, --help                            Show this help\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Increase verbosity by one level\n"
 | 
				
			||||||
"      --version                         Show version\n"
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
"  -c, --config                          Load config (Default %s)\n"
 | 
					"  -c, --config                          Load config (Default %s)\n"
 | 
				
			||||||
 | 
					"  -P  --properties                      Set context properties\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"%s [opcions]\n"
 | 
					"%s [opcions]\n"
 | 
				
			||||||
"  -h, --help                            Mostra aquesta ajuda\n"
 | 
					"  -h, --help                            Mostra aquesta ajuda\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Augmenta la verbositat en un nivell\n"
 | 
				
			||||||
"      --version                         Mostra la versió\n"
 | 
					"      --version                         Mostra la versió\n"
 | 
				
			||||||
"  -c, --config                          Carrega la configuració "
 | 
					"  -c, --config                          Carrega la configuració (predeterminada %s)\n"
 | 
				
			||||||
"(predeterminada %s)\n"
 | 
					"  -P  --properties                      Estableix les propietats del context\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:3
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "Sistema multimèdia PipeWire"
 | 
					msgstr "Sistema multimèdia PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "Inicia el sistema multimèdia PipeWire"
 | 
					msgstr "Inicia el sistema multimèdia PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:141
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:159
 | 
				
			||||||
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:141
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:159
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Tunnel to %s%s%s"
 | 
					msgid "Tunnel to %s%s%s"
 | 
				
			||||||
msgstr "Túnel cap a %s%s%s"
 | 
					msgstr "Túnel cap a %s%s%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-fallback-sink.c:31
 | 
					#: src/modules/module-fallback-sink.c:40
 | 
				
			||||||
msgid "Dummy Output"
 | 
					msgid "Dummy Output"
 | 
				
			||||||
msgstr "Sortida fictícia"
 | 
					msgstr "Sortida fictícia"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-pulse-tunnel.c:844
 | 
					#: src/modules/module-pulse-tunnel.c:760
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Tunnel for %s@%s"
 | 
					msgid "Tunnel for %s@%s"
 | 
				
			||||||
msgstr "Túnel per a %s@%s"
 | 
					msgstr "Túnel per a %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:315
 | 
					#: src/modules/module-zeroconf-discover.c:320
 | 
				
			||||||
msgid "Unknown device"
 | 
					msgid "Unknown device"
 | 
				
			||||||
msgstr "Dispositiu desconegut"
 | 
					msgstr "Dispositiu desconegut"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:327
 | 
					#: src/modules/module-zeroconf-discover.c:332
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s@%s"
 | 
					msgid "%s on %s@%s"
 | 
				
			||||||
msgstr "%s en %s@%s"
 | 
					msgstr "%s en %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:331
 | 
					#: src/modules/module-zeroconf-discover.c:336
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr "%s en %s"
 | 
					msgstr "%s en %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:974
 | 
					#: src/tools/pw-cat.c:1044
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [<file>|-]\n"
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
| 
						 | 
					@ -105,86 +108,68 @@ msgstr ""
 | 
				
			||||||
"      --version                         Mostra la versió\n"
 | 
					"      --version                         Mostra la versió\n"
 | 
				
			||||||
"  -v, --verbose                         Habilita les operacions detallades\n"
 | 
					"  -v, --verbose                         Habilita les operacions detallades\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:981
 | 
					#: src/tools/pw-cat.c:1051
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -R, --remote                          Remote daemon name\n"
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
"      --media-type                      Set media type (default %s)\n"
 | 
					"      --media-type                      Set media type (default %s)\n"
 | 
				
			||||||
"      --media-category                  Set media category (default %s)\n"
 | 
					"      --media-category                  Set media category (default %s)\n"
 | 
				
			||||||
"      --media-role                      Set media role (default %s)\n"
 | 
					"      --media-role                      Set media role (default %s)\n"
 | 
				
			||||||
"      --target                          Set node target serial or name "
 | 
					"      --target                          Set node target serial or name (default %s)\n"
 | 
				
			||||||
"(default %s)\n"
 | 
					 | 
				
			||||||
"                                          0 means don't link\n"
 | 
					"                                          0 means don't link\n"
 | 
				
			||||||
"      --latency                         Set node latency (default %s)\n"
 | 
					"      --latency                         Set node latency (default %s)\n"
 | 
				
			||||||
"                                          Xunit (unit = s, ms, us, ns)\n"
 | 
					"                                          Xunit (unit = s, ms, us, ns)\n"
 | 
				
			||||||
"                                          or direct samples (256)\n"
 | 
					"                                          or direct samples (256)\n"
 | 
				
			||||||
"                                          the rate is the one of the source "
 | 
					"                                          the rate is the one of the source file\n"
 | 
				
			||||||
"file\n"
 | 
					 | 
				
			||||||
"  -P  --properties                      Set node properties\n"
 | 
					"  -P  --properties                      Set node properties\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -R, --remote                          Nom del dimoni remot\n"
 | 
					"  -R, --remote                          Nom del dimoni remot\n"
 | 
				
			||||||
"      --media-type                          Estableix el tipus de mitjà (per "
 | 
					"      --media-type                          Estableix el tipus de mitjà (per defecte %s)\n"
 | 
				
			||||||
"defecte %s)\n"
 | 
					"      --media-category                          Estableix la categoria del mitjà (per defecte %s)\n"
 | 
				
			||||||
"      --media-category                          Estableix la categoria del "
 | 
					"      --media-role                          Estableix el rol del mitjà (per defecte %s)\n"
 | 
				
			||||||
"mitjà (per defecte %s)\n"
 | 
					"      --target                          Estableix l'objectiu sèrie o el nom del node (per defecte %s)\n"
 | 
				
			||||||
"      --media-role                          Estableix el rol del mitjà (per "
 | 
					 | 
				
			||||||
"defecte %s)\n"
 | 
					 | 
				
			||||||
"      --target                          Estableix l'objectiu sèrie o el nom "
 | 
					 | 
				
			||||||
"del node (per defecte %s)\n"
 | 
					 | 
				
			||||||
"                                          0 vol dir que no enllaça\n"
 | 
					"                                          0 vol dir que no enllaça\n"
 | 
				
			||||||
"      --latency                          Estableix latència del node (per "
 | 
					"      --latency                          Estableix latència del node (per defecte %s)\n"
 | 
				
			||||||
"defecte %s)\n"
 | 
					 | 
				
			||||||
"                                          Xunit (unitat = s, ms, us, ns)\n"
 | 
					"                                          Xunit (unitat = s, ms, us, ns)\n"
 | 
				
			||||||
"                                          o mostres directes (256)\n"
 | 
					"                                          o mostres directes (256)\n"
 | 
				
			||||||
"                                          la taxa és la del fitxer d'origen\n"
 | 
					"                                          la taxa és la del fitxer d'origen\n"
 | 
				
			||||||
"  -P  --properties                          Estableix les propietats del "
 | 
					"  -P  --properties                          Estableix les propietats del node\n"
 | 
				
			||||||
"node\n"
 | 
					 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:999
 | 
					#: src/tools/pw-cat.c:1069
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"      --rate                            Sample rate (req. for rec) (default "
 | 
					"      --rate                            Sample rate (req. for rec) (default %u)\n"
 | 
				
			||||||
"%u)\n"
 | 
					"      --channels                        Number of channels (req. for rec) (default %u)\n"
 | 
				
			||||||
"      --channels                        Number of channels (req. for rec) "
 | 
					 | 
				
			||||||
"(default %u)\n"
 | 
					 | 
				
			||||||
"      --channel-map                     Channel map\n"
 | 
					"      --channel-map                     Channel map\n"
 | 
				
			||||||
"                                            one of: \"stereo\", "
 | 
					"                                            one of: \"stereo\", \"surround-51\",... or\n"
 | 
				
			||||||
"\"surround-51\",... or\n"
 | 
					"                                            comma separated list of channel names: eg. \"FL,FR\"\n"
 | 
				
			||||||
"                                            comma separated list of channel "
 | 
					"      --format                          Sample format %s (req. for rec) (default %s)\n"
 | 
				
			||||||
"names: eg. \"FL,FR\"\n"
 | 
					 | 
				
			||||||
"      --format                          Sample format %s (req. for rec) "
 | 
					 | 
				
			||||||
"(default %s)\n"
 | 
					 | 
				
			||||||
"      --volume                          Stream volume 0-1.0 (default %.3f)\n"
 | 
					"      --volume                          Stream volume 0-1.0 (default %.3f)\n"
 | 
				
			||||||
"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default %d)\n"
 | 
				
			||||||
"%d)\n"
 | 
					"  -a, --raw                             RAW mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"      --rate                            Freqüència de mostreig (req. per a "
 | 
					"      --rate                            Freqüència de mostreig (req. per a rec) (predeterminat %u)\n"
 | 
				
			||||||
"rec) (predeterminat %u)\n"
 | 
					"      --channels                            Nombre de canals (req. per a rec) (predeterminat %u)\n"
 | 
				
			||||||
"      --channels                            Nombre de canals (req. per a rec) "
 | 
					 | 
				
			||||||
"(predeterminat %u)\n"
 | 
					 | 
				
			||||||
"      --channel-map                            Mapa de canals\n"
 | 
					"      --channel-map                            Mapa de canals\n"
 | 
				
			||||||
"                                            un dels següents: \"stereo\", "
 | 
					"                                            un dels següents: \"stereo\", \"surround-51\",... o\n"
 | 
				
			||||||
"\"surround-51\",... o\n"
 | 
					"                                            llista separada per comes dels noms dels canals: per exemple. «FL,FR»\n"
 | 
				
			||||||
"                                            llista separada per comes dels "
 | 
					"      --format                          Format de mostra %s (req. per a rec) (predeterminat %s)\n"
 | 
				
			||||||
"noms dels canals: per exemple. «FL,FR»\n"
 | 
					"      --volume                          Volum del flux 0-1.0 (predeterminat %.3f)\n"
 | 
				
			||||||
"      --format                          Format de mostra %s (req. per a rec) "
 | 
					"  -q  --quality                          Qualitat de remostrador (0 - 15) (predeterminat %d)\n"
 | 
				
			||||||
"(predeterminat %s)\n"
 | 
					"  -a, --raw                             Mode RAW\n"
 | 
				
			||||||
"      --volume                          Volum del flux 0-1.0 (predeterminat "
 | 
					 | 
				
			||||||
"%.3f)\n"
 | 
					 | 
				
			||||||
"  -q  --quality                          Qualitat de remostrador (0 - 15) "
 | 
					 | 
				
			||||||
"(predeterminal %d)\n"
 | 
					 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1016
 | 
					#: src/tools/pw-cat.c:1087
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -p, --playback                        Playback mode\n"
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
"  -r, --record                          Recording mode\n"
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"  -d, --dsd                             DSD mode\n"
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
"  -o, --encoded                         Encoded mode\n"
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -p, --playback                        Mode de reproducció\n"
 | 
					"  -p, --playback                        Mode de reproducció\n"
 | 
				
			||||||
| 
						 | 
					@ -192,9 +177,10 @@ msgstr ""
 | 
				
			||||||
"  -m, --midi                        Mode MIDI\n"
 | 
					"  -m, --midi                        Mode MIDI\n"
 | 
				
			||||||
"  -d, --dsd                             Mode DSD\n"
 | 
					"  -d, --dsd                             Mode DSD\n"
 | 
				
			||||||
"  -o, --encoded                         Mode codificat\n"
 | 
					"  -o, --encoded                         Mode codificat\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           Mode SysEx\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2220
 | 
					#: src/tools/pw-cli.c:2386
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -208,21 +194,25 @@ msgstr ""
 | 
				
			||||||
"%s [opcions] [ordre]\n"
 | 
					"%s [opcions] [ordre]\n"
 | 
				
			||||||
"  -h, --help                          Mostra aquesta ajuda\n"
 | 
					"  -h, --help                          Mostra aquesta ajuda\n"
 | 
				
			||||||
"      --version                          Mostra la versió\n"
 | 
					"      --version                          Mostra la versió\n"
 | 
				
			||||||
"  -d, --daemon                          Inicia com a dimoni (fals per "
 | 
					"  -d, --daemon                          Inicia com a dimoni (fals per defecte)\n"
 | 
				
			||||||
"defecte)\n"
 | 
					 | 
				
			||||||
"  -r, --remote                          Nom del dimoni remot\n"
 | 
					"  -r, --remote                          Nom del dimoni remot\n"
 | 
				
			||||||
"  -m, --monitor                          Monitor d'activitat\n"
 | 
					"  -m, --monitor                          Monitor d'activitat\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:303
 | 
					#: spa/plugins/alsa/acp/acp.c:351
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "Pro Audio"
 | 
					msgstr "Pro Audio"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:427 spa/plugins/alsa/acp/alsa-mixer.c:4648
 | 
					#: spa/plugins/alsa/acp/acp.c:520 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1586
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1974
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "Inactiu"
 | 
					msgstr "Inactiu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:603
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [Error d'ALSA UCM]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "Entrada"
 | 
					msgstr "Entrada"
 | 
				
			||||||
| 
						 | 
					@ -246,7 +236,7 @@ msgstr "Entrada de línia"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1831
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2372
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "Micròfon"
 | 
					msgstr "Micròfon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -312,12 +302,15 @@ msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Sense accentuació dels baixos"
 | 
					msgstr "Sense accentuació dels baixos"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1837
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2378
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "Altaveu"
 | 
					msgstr "Altaveu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#. Don't call it "headset", the HF one has the mic
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2384
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2451
 | 
				
			||||||
msgid "Headphones"
 | 
					msgid "Headphones"
 | 
				
			||||||
msgstr "Auriculars"
 | 
					msgstr "Auriculars"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -394,15 +387,15 @@ msgstr "Entrada del xat"
 | 
				
			||||||
msgid "Virtual Surround 7.1"
 | 
					msgid "Virtual Surround 7.1"
 | 
				
			||||||
msgstr "Envoltant virtual 7.1"
 | 
					msgstr "Envoltant virtual 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
				
			||||||
msgid "Analog Mono"
 | 
					msgid "Analog Mono"
 | 
				
			||||||
msgstr "Mono analògic"
 | 
					msgstr "Mono analògic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
				
			||||||
msgid "Analog Mono (Left)"
 | 
					msgid "Analog Mono (Left)"
 | 
				
			||||||
msgstr "Mono analògic (esquerra)"
 | 
					msgstr "Mono analògic (esquerra)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
				
			||||||
msgid "Analog Mono (Right)"
 | 
					msgid "Analog Mono (Right)"
 | 
				
			||||||
msgstr "Mono analògic (dreta)"
 | 
					msgstr "Mono analògic (dreta)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -411,338 +404,307 @@ msgstr "Mono analògic (dreta)"
 | 
				
			||||||
#. * here would lead to the source name to become "Analog Stereo Input
 | 
					#. * here would lead to the source name to become "Analog Stereo Input
 | 
				
			||||||
#. * Input". The same logic applies to analog-stereo-output,
 | 
					#. * Input". The same logic applies to analog-stereo-output,
 | 
				
			||||||
#. * multichannel-input and multichannel-output.
 | 
					#. * multichannel-input and multichannel-output.
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
				
			||||||
msgid "Analog Stereo"
 | 
					msgid "Analog Stereo"
 | 
				
			||||||
msgstr "Estèreo analògic"
 | 
					msgstr "Estèreo analògic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4462
 | 
				
			||||||
msgid "Mono"
 | 
					msgid "Mono"
 | 
				
			||||||
msgstr "Mono"
 | 
					msgstr "Mono"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4463
 | 
				
			||||||
msgid "Stereo"
 | 
					msgid "Stereo"
 | 
				
			||||||
msgstr "Estèreo"
 | 
					msgstr "Estèreo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1819
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2360
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "Auriculars"
 | 
					msgstr "Auriculars"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4643
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
				
			||||||
msgid "Speakerphone"
 | 
					msgid "Speakerphone"
 | 
				
			||||||
msgstr "Altaveu del telèfon"
 | 
					msgstr "Altaveu del telèfon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
				
			||||||
msgid "Multichannel"
 | 
					msgid "Multichannel"
 | 
				
			||||||
msgstr "Multicanal"
 | 
					msgstr "Multicanal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
				
			||||||
msgid "Analog Surround 2.1"
 | 
					msgid "Analog Surround 2.1"
 | 
				
			||||||
msgstr "Envoltant analògic 2.1"
 | 
					msgstr "Envoltant analògic 2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
				
			||||||
msgid "Analog Surround 3.0"
 | 
					msgid "Analog Surround 3.0"
 | 
				
			||||||
msgstr "Envoltant analògic 3.0"
 | 
					msgstr "Envoltant analògic 3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
				
			||||||
msgid "Analog Surround 3.1"
 | 
					msgid "Analog Surround 3.1"
 | 
				
			||||||
msgstr "Envoltant analògic 3.1"
 | 
					msgstr "Envoltant analògic 3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
				
			||||||
msgid "Analog Surround 4.0"
 | 
					msgid "Analog Surround 4.0"
 | 
				
			||||||
msgstr "Envoltant analògic 4.0"
 | 
					msgstr "Envoltant analògic 4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4492
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
				
			||||||
msgid "Analog Surround 4.1"
 | 
					msgid "Analog Surround 4.1"
 | 
				
			||||||
msgstr "Envoltant analògic 4.1"
 | 
					msgstr "Envoltant analògic 4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4493
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
				
			||||||
msgid "Analog Surround 5.0"
 | 
					msgid "Analog Surround 5.0"
 | 
				
			||||||
msgstr "Envoltant analògic 5.0"
 | 
					msgstr "Envoltant analògic 5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4494
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
				
			||||||
msgid "Analog Surround 5.1"
 | 
					msgid "Analog Surround 5.1"
 | 
				
			||||||
msgstr "Envoltant analògic 5.1"
 | 
					msgstr "Envoltant analògic 5.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4495
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
				
			||||||
msgid "Analog Surround 6.0"
 | 
					msgid "Analog Surround 6.0"
 | 
				
			||||||
msgstr "Envoltant analògic 6.0"
 | 
					msgstr "Envoltant analògic 6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4496
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
				
			||||||
msgid "Analog Surround 6.1"
 | 
					msgid "Analog Surround 6.1"
 | 
				
			||||||
msgstr "Envoltant analògic 6.1"
 | 
					msgstr "Envoltant analògic 6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4497
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
				
			||||||
msgid "Analog Surround 7.0"
 | 
					msgid "Analog Surround 7.0"
 | 
				
			||||||
msgstr "Envoltant analògic 7.0"
 | 
					msgstr "Envoltant analògic 7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4498
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
				
			||||||
msgid "Analog Surround 7.1"
 | 
					msgid "Analog Surround 7.1"
 | 
				
			||||||
msgstr "Envoltant analògic 7.1"
 | 
					msgstr "Envoltant analògic 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4499
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
				
			||||||
msgid "Digital Stereo (IEC958)"
 | 
					msgid "Digital Stereo (IEC958)"
 | 
				
			||||||
msgstr "Estèreo digital (IEC958)"
 | 
					msgstr "Estèreo digital (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4500
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
				
			||||||
msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
					msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Envoltant digital 4.0 (IEC958/AC3)"
 | 
					msgstr "Envoltant digital 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4501
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
					msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Envoltant digital 5.1 (IEC958/AC3)"
 | 
					msgstr "Envoltant digital 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4502
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
					msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
msgstr "Envoltant digital 5.1 (IEC958/DTS)"
 | 
					msgstr "Envoltant digital 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4503
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
				
			||||||
msgid "Digital Stereo (HDMI)"
 | 
					msgid "Digital Stereo (HDMI)"
 | 
				
			||||||
msgstr "Estèreo digital (HDMI)"
 | 
					msgstr "Estèreo digital (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4504
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
				
			||||||
msgid "Digital Surround 5.1 (HDMI)"
 | 
					msgid "Digital Surround 5.1 (HDMI)"
 | 
				
			||||||
msgstr "Envoltant digital 5.1 (HDMI)"
 | 
					msgstr "Envoltant digital 5.1 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4505
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4492
 | 
				
			||||||
msgid "Chat"
 | 
					msgid "Chat"
 | 
				
			||||||
msgstr "Xat"
 | 
					msgstr "Xat"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4506
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4493
 | 
				
			||||||
msgid "Game"
 | 
					msgid "Game"
 | 
				
			||||||
msgstr "Joc"
 | 
					msgstr "Joc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4640
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
				
			||||||
msgid "Analog Mono Duplex"
 | 
					msgid "Analog Mono Duplex"
 | 
				
			||||||
msgstr "Dúplex mono analògic"
 | 
					msgstr "Dúplex mono analògic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4641
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
				
			||||||
msgid "Analog Stereo Duplex"
 | 
					msgid "Analog Stereo Duplex"
 | 
				
			||||||
msgstr "Dúplex estèreo analògic"
 | 
					msgstr "Dúplex estèreo analògic"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4644
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
				
			||||||
msgid "Digital Stereo Duplex (IEC958)"
 | 
					msgid "Digital Stereo Duplex (IEC958)"
 | 
				
			||||||
msgstr "Dúplex estèreo digital (IEC958)"
 | 
					msgstr "Dúplex estèreo digital (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4645
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
				
			||||||
msgid "Multichannel Duplex"
 | 
					msgid "Multichannel Duplex"
 | 
				
			||||||
msgstr "Dúplex Multicanal"
 | 
					msgstr "Dúplex Multicanal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4646
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
				
			||||||
msgid "Stereo Duplex"
 | 
					msgid "Stereo Duplex"
 | 
				
			||||||
msgstr "Dúplex estèreo"
 | 
					msgstr "Dúplex estèreo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4647
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4634
 | 
				
			||||||
msgid "Mono Chat + 7.1 Surround"
 | 
					msgid "Mono Chat + 7.1 Surround"
 | 
				
			||||||
msgstr "Xat mono + 7.1 envoltant"
 | 
					msgstr "Xat mono + 7.1 envoltant"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4748
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4735
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "Sortida %s"
 | 
					msgstr "Sortida %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4756
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4743
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "Entrada %s"
 | 
					msgstr "Entrada %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1233 spa/plugins/alsa/acp/alsa-util.c:1327
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu byte (%lu "
 | 
					"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu byte (%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
msgstr[1] ""
 | 
					msgstr[1] ""
 | 
				
			||||||
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu "
 | 
					"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1253
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s%lu ms).\n"
 | 
				
			||||||
"(%s%lu ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes "
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
 | 
				
			||||||
"(%s%lu ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li byte (%s%lu "
 | 
					"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li byte (%s%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
msgstr[1] ""
 | 
					msgstr[1] ""
 | 
				
			||||||
"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu "
 | 
					"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1300
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1346
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
					"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail %lu.\n"
 | 
				
			||||||
"%lu.\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu "
 | 
					"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
 | 
				
			||||||
"ms).\n"
 | 
					"Probablement es tracta d'un error del controlador d'ALSA «%s». Informeu d'aquest problema als desenvolupadors d'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador d'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest problema als desenvolupadors d'ALSA."
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1343
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1389
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte (%lu ms).\n"
 | 
				
			||||||
"(%lu ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
 | 
				
			||||||
"(%lu ms).\n"
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					 | 
				
			||||||
"to the ALSA developers."
 | 
					 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu byte "
 | 
					"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu byte (%lu ms).\n"
 | 
				
			||||||
"(%lu ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
msgstr[1] ""
 | 
					msgstr[1] ""
 | 
				
			||||||
"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes "
 | 
					"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
 | 
				
			||||||
"(%lu ms).\n"
 | 
					"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu d'aquest incident als desenvolupadors de l'ALSA."
 | 
				
			||||||
"Probablement es tracta d'un error del controlador de l'ALSA «%s». Informeu "
 | 
					 | 
				
			||||||
"d'aquest incident als desenvolupadors de l'ALSA."
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/channelmap.h:457
 | 
					#: spa/plugins/alsa/acp/channelmap.h:457
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
msgstr "(incorrecte)"
 | 
					msgstr "(incorrecte)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:189
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "Àudio intern"
 | 
					msgstr "Àudio intern"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:194
 | 
					#: spa/plugins/alsa/acp/compat.c:199
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "Mòdem"
 | 
					msgstr "Mòdem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1597
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1985
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "Passarel·la d'àudio (A2DP Source & HSP/HFP AG)"
 | 
					msgstr "Passarel·la d'àudio (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1622
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
				
			||||||
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
 | 
					msgstr "Retransmissió d'àudio per als audiòfons (ASHA Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2057
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "Reproducció d'alta fidelitat (Sink A2DP, còdec %s)"
 | 
					msgstr "Reproducció d'alta fidelitat (Sink A2DP, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1625
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2060
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink, còdec %s)"
 | 
					msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1633
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2068
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "Reproducció d'alta fidelitat (A2DP Sink)"
 | 
					msgstr "Reproducció d'alta fidelitat (A2DP Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1635
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink)"
 | 
					msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1677
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2144
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "Reproducció d'alta fidelitat (sortida BAP, còdec %s)"
 | 
					msgstr "Reproducció d'alta fidelitat (sortida BAP, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1681
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2149
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "Entrada d'alta fidelitat (font A2DP, còdec %s)"
 | 
					msgstr "Entrada d'alta fidelitat (font A2DP, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1685
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2153
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dúplex d'alta fidelitat (BAP Source/Sink, còdec %s)"
 | 
					msgstr "Dúplex d'alta fidelitat (BAP Source/Sink, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1693
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2162
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "Reproducció d'alta fidelitat (Sortida BAP)"
 | 
					msgstr "Reproducció d'alta fidelitat (Sortida BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1696
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2166
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "Entrada d'alta fidelitat (Font BAP)"
 | 
					msgstr "Entrada d'alta fidelitat (Font BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1699
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "Dúplex d'alta fidelitat (BAP Source/Sink)"
 | 
					msgstr "Dúplex d'alta fidelitat (BAP Source/Sink)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1735
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2209
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "Unitat d'ariculars pel cap (HSP/HFP, còdec %s)"
 | 
					msgstr "Unitat d'auriculars pel cap (HSP/HFP, còdec %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1740
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2361
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP)"
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2366
 | 
				
			||||||
msgstr "Unitat d'ariculars pel cap (HSP/HFP)"
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2373
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2379
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1820
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2385
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1825
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2391
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1832
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2397
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1838
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2403
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1844
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2409
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1850
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1856
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1862
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1868
 | 
					 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "Mans lliures"
 | 
					msgstr "Mans lliures"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1826
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2367
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "Mans lliures (HFP)"
 | 
					msgstr "Mans lliures (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1843
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2390
 | 
				
			||||||
msgid "Headphone"
 | 
					 | 
				
			||||||
msgstr "Auricular"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1849
 | 
					 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "Portable"
 | 
					msgstr "Portable"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1855
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2396
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "Cotxe"
 | 
					msgstr "Cotxe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1861
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2402
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "HiFi"
 | 
					msgstr "HiFi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1867
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2408
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "Telèfon"
 | 
					msgstr "Telèfon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1874
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2415
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "Bluetooth"
 | 
					msgstr "Bluetooth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1875
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2416
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "Bluetooth (HFP)"
 | 
					msgstr "Bluetooth (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										99
									
								
								po/my.po
									
										
									
									
									
								
							
							
						
						
									
										99
									
								
								po/my.po
									
										
									
									
									
								
							| 
						 | 
					@ -9,15 +9,15 @@ msgstr ""
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"issues\n"
 | 
					"issues\n"
 | 
				
			||||||
"POT-Creation-Date: 2021-08-26 03:31+0000\n"
 | 
					"POT-Creation-Date: 2021-08-26 03:31+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2021-08-26 21:52+0630\n"
 | 
					"PO-Revision-Date: 2025-10-02 11:36+0630\n"
 | 
				
			||||||
 | 
					"Last-Translator: zayar lwin <lw1nzayar@yandex.com>\n"
 | 
				
			||||||
"Language-Team: lw1nzayar@yandex.com\n"
 | 
					"Language-Team: lw1nzayar@yandex.com\n"
 | 
				
			||||||
 | 
					"Language: my\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=1; plural=0;\n"
 | 
					"Plural-Forms: nplurals=1; plural=0;\n"
 | 
				
			||||||
"X-Generator: Poedit 2.4.2\n"
 | 
					"X-Generator: Poedit 3.7\n"
 | 
				
			||||||
"Last-Translator: zayar lwin <lw1nzayar@yandex.com>\n"
 | 
					 | 
				
			||||||
"Language: my\n"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.c:45
 | 
					#: src/daemon/pipewire.c:45
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -27,23 +27,24 @@ msgid ""
 | 
				
			||||||
"      --version                         Show version\n"
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
"  -c, --config                          Load config (Default %s)\n"
 | 
					"  -c, --config                          Load config (Default %s)\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"%s [options]\n"
 | 
					"%s [options]\r\n"
 | 
				
			||||||
"  -h, --help                            Show this help\n"
 | 
					"  -h, --help                            Show this help\r\n"
 | 
				
			||||||
"      --version                         Show version\n"
 | 
					"      --version                         Show version\r\n"
 | 
				
			||||||
"  -c, --config                          Load config (Default %s)\n"
 | 
					"  -c, --config                          Load config (Default %s)\r\n"
 | 
				
			||||||
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "ပိုက်ဝိုင်ယာ မီဒီယာစစ်စတမ်"
 | 
					msgstr "ပိုက်ဝိုင်ယာ မီဒီယာစနစ်"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:5
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "ပိုက်ဝိုင်ယာ မီဒီယာစစ်စတမ် စတင်ရန်"
 | 
					msgstr "ပိုက်ဝိုင်ယာ မီဒီယာစနစ် စတင်ရန်"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/examples/media-session/alsa-monitor.c:588
 | 
					#: src/examples/media-session/alsa-monitor.c:588
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:189
 | 
					#: spa/plugins/alsa/acp/compat.c:189
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "နဂိုတည်းကထည့်သွင်းထားသည်ံ့ အသံကရိယာ"
 | 
					msgstr "မူလပါရှိပြီးအသံကိရိယာ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/examples/media-session/alsa-monitor.c:592
 | 
					#: src/examples/media-session/alsa-monitor.c:592
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:194
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
| 
						 | 
					@ -53,7 +54,7 @@ msgstr "ဆ.သ.ရ-စက်"
 | 
				
			||||||
#: src/examples/media-session/alsa-monitor.c:601
 | 
					#: src/examples/media-session/alsa-monitor.c:601
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:296
 | 
					#: src/modules/module-zeroconf-discover.c:296
 | 
				
			||||||
msgid "Unknown device"
 | 
					msgid "Unknown device"
 | 
				
			||||||
msgstr "မသိသောစက်"
 | 
					msgstr "မသိ"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:173
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:173
 | 
				
			||||||
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:173
 | 
					#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:173
 | 
				
			||||||
| 
						 | 
					@ -69,12 +70,12 @@ msgstr "%s@%sအတွက် လုံခြုံစွာဒေတာပို
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:308
 | 
					#: src/modules/module-zeroconf-discover.c:308
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s@%s"
 | 
					msgid "%s on %s@%s"
 | 
				
			||||||
msgstr ""
 | 
					msgstr "%s on %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:312
 | 
					#: src/modules/module-zeroconf-discover.c:312
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr ""
 | 
					msgstr "%s on %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1016
 | 
					#: src/tools/pw-cat.c:1016
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -85,6 +86,11 @@ msgid ""
 | 
				
			||||||
"  -v, --verbose                         Enable verbose operations\n"
 | 
					"  -v, --verbose                         Enable verbose operations\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"%s [options] <file>\r\n"
 | 
				
			||||||
 | 
					"  -h, --help                            Show this help\r\n"
 | 
				
			||||||
 | 
					"      --version                         Show version\r\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Enable verbose operations\r\n"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1023
 | 
					#: src/tools/pw-cat.c:1023
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -103,6 +109,20 @@ msgid ""
 | 
				
			||||||
"      --list-targets                    List available targets for --target\n"
 | 
					"      --list-targets                    List available targets for --target\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"  -R, --remote                          Remote daemon name\r\n"
 | 
				
			||||||
 | 
					"      --media-type                      Set media type (default %s)\r\n"
 | 
				
			||||||
 | 
					"      --media-category                  Set media category (default %s)\r\n"
 | 
				
			||||||
 | 
					"      --media-role                      Set media role (default %s)\r\n"
 | 
				
			||||||
 | 
					"      --target                          Set node target (default %s)\r\n"
 | 
				
			||||||
 | 
					"                                          0 means don't link\r\n"
 | 
				
			||||||
 | 
					"      --latency                         Set node latency (default %s)\r\n"
 | 
				
			||||||
 | 
					"                                          Xunit (unit = s, ms, us, ns)\r\n"
 | 
				
			||||||
 | 
					"                                          or direct samples (256)\r\n"
 | 
				
			||||||
 | 
					"                                          the rate is the one of the source "
 | 
				
			||||||
 | 
					"file\r\n"
 | 
				
			||||||
 | 
					"      --list-targets                    List available targets for --"
 | 
				
			||||||
 | 
					"target\r\n"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1041
 | 
					#: src/tools/pw-cat.c:1041
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -123,6 +143,22 @@ msgid ""
 | 
				
			||||||
"%d)\n"
 | 
					"%d)\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
 | 
					"%u)\r\n"
 | 
				
			||||||
 | 
					"      --channels                        Number of channels (req. for rec) "
 | 
				
			||||||
 | 
					"(default %u)\r\n"
 | 
				
			||||||
 | 
					"      --channel-map                     Channel map\r\n"
 | 
				
			||||||
 | 
					"                                            one of: \"stereo\", "
 | 
				
			||||||
 | 
					"\"surround-51\",... or\r\n"
 | 
				
			||||||
 | 
					"                                            comma separated list of channel "
 | 
				
			||||||
 | 
					"names: eg. \"FL,FR\"\r\n"
 | 
				
			||||||
 | 
					"      --format                          Sample format %s (req. for rec) "
 | 
				
			||||||
 | 
					"(default %s)\r\n"
 | 
				
			||||||
 | 
					"      --volume                          Stream volume 0-1.0 (default %.3f)"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
 | 
					"%d)\r\n"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1058
 | 
					#: src/tools/pw-cat.c:1058
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
| 
						 | 
					@ -131,6 +167,10 @@ msgid ""
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"  -p, --playback                        Playback mode\r\n"
 | 
				
			||||||
 | 
					"  -r, --record                          Recording mode\r\n"
 | 
				
			||||||
 | 
					"  -m, --midi                            Midi mode\r\n"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2954
 | 
					#: src/tools/pw-cli.c:2954
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -142,6 +182,12 @@ msgid ""
 | 
				
			||||||
"  -r, --remote                          Remote daemon name\n"
 | 
					"  -r, --remote                          Remote daemon name\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"%s [options] [command]\r\n"
 | 
				
			||||||
 | 
					"  -h, --help                            Show this help\r\n"
 | 
				
			||||||
 | 
					"      --version                         Show version\r\n"
 | 
				
			||||||
 | 
					"  -d, --daemon                          Start as daemon (Default false)\r\n"
 | 
				
			||||||
 | 
					"  -r, --remote                          Remote daemon name\r\n"
 | 
				
			||||||
 | 
					"\r\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:306
 | 
					#: spa/plugins/alsa/acp/acp.c:306
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
| 
						 | 
					@ -473,12 +519,12 @@ msgstr "မိုနို စကားပြောဆိုသံ + ၇.၁ ပ
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4750
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4750
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "%s ထုတ်ပို့ကရိယာ"
 | 
					msgstr "%s အသံထုတ်"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4757
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4757
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "%s လက်ခံကရိယာ"
 | 
					msgstr "%s အသံသွင်း"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -493,20 +539,26 @@ msgid_plural ""
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"snd_pcm_avail() မှ ပြန်ပေးသည့်တန်ဖိုးသည် အလွန်ကြီးမားနေသည်- %lu ဘိုက် (%lu ms)။\n"
 | 
				
			||||||
 | 
					"ဖြစ်နိုင်ခြေအများဆုံးမှာ ALSA ဒရိုက်ဗာ ‘%s’ တွင် ပရိုဂရမ်အမှားတစ်ခုရှိနေခြင်းဖြစ်သည်။ ဤပြဿနာအား "
 | 
				
			||||||
 | 
					"ALSA ရေးသားသူများထံသို့ သတင်းပို့ပေးပါ။"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1239
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1239
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li bytes "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"snd_pcm_delay() မှ ပြန်ပေးသည့်တန်ဖိုးသည် အလွန်ကြီးမားနေသည်- %li ဘိုက် (%s%lu ms)။\n"
 | 
				
			||||||
 | 
					"ဖြစ်နိုင်ခြေအများဆုံးမှာ ALSA ဒရိုက်ဗာ ‘%s’ တွင် ပရိုဂရမ်အမှားတစ်ခုရှိနေခြင်းဖြစ်သည်။ ဤပြဿနာအား "
 | 
				
			||||||
 | 
					"ALSA ရေးသားသူများထံသို့ သတင်းပို့ပေးပါ။"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1286
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1286
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -516,6 +568,10 @@ msgid ""
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
 | 
					"snd_pcm_avail_delay() မှ ထူးဆန်းသောတန်ဖိုးများ ပြန်ပေးခဲ့သည်- နှောင့်နှေးမှု %lu သည် ရနိုင်မှု %lu "
 | 
				
			||||||
 | 
					"ထက် နည်းနေပါသည်။\n"
 | 
				
			||||||
 | 
					"ဖြစ်နိုင်ခြေအများဆုံးမှာ ALSA ဒရိုက်ဘာ '%s’ တွင် ပရိုဂရမ်အမှားတစ်ခုရှိနေခြင်းဖြစ်သည်။ ဤပြဿနာအား "
 | 
				
			||||||
 | 
					"ALSA ရေးသားသူများထံသို့ သတင်းပို့ပေးပါ။"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1329
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1329
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					@ -530,6 +586,9 @@ msgid_plural ""
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
 | 
					"snd_pcm_mmap_begin() မှ ပြန်ပေးသည့်တန်ဖိုးသည် အလွန်ကြီးမားနေသည်- %lu ဘိုက် (%lu ms)။\n"
 | 
				
			||||||
 | 
					"ဖြစ်နိုင်ခြေအများဆုံးမှာ ALSA ဒရိုက်ဗာ ‘%s’ တွင် ပရိုဂရမ်အမှားတစ်ခုရှိနေခြင်းဖြစ်သည်။ ဤပြဿနာအား "
 | 
				
			||||||
 | 
					"ALSA ရေးသားသူများထံသို့ သတင်းပို့ပေးပါ။"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/channelmap.h:466
 | 
					#: spa/plugins/alsa/acp/channelmap.h:466
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								po/oc.po
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								po/oc.po
									
										
									
									
									
								
							| 
						 | 
					@ -272,7 +272,7 @@ msgstr "Contraròtle automatic del ganh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2665
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2665
 | 
				
			||||||
msgid "No Automatic Gain Control"
 | 
					msgid "No Automatic Gain Control"
 | 
				
			||||||
msgstr "Pas de contraròtle automatic del ganh"
 | 
					msgstr "Cap de contraròtle automatic del ganh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2666
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2666
 | 
				
			||||||
msgid "Boost"
 | 
					msgid "Boost"
 | 
				
			||||||
| 
						 | 
					@ -288,7 +288,7 @@ msgstr "Amplificador"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2669
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2669
 | 
				
			||||||
msgid "No Amplifier"
 | 
					msgid "No Amplifier"
 | 
				
			||||||
msgstr "Pas d'amplificador"
 | 
					msgstr "Cap d'amplificador"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2670
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2670
 | 
				
			||||||
msgid "Bass Boost"
 | 
					msgid "Bass Boost"
 | 
				
			||||||
| 
						 | 
					@ -296,7 +296,7 @@ msgstr "Amplificacion bassas"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2671
 | 
				
			||||||
msgid "No Bass Boost"
 | 
					msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Pas d'amplificacion de las bassas"
 | 
					msgstr "Cap d'amplificacion de las bassas"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1995
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1995
 | 
				
			||||||
| 
						 | 
					@ -531,12 +531,12 @@ msgstr "Messatjariá mono + Surround 7.1"
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "%s Sortida"
 | 
					msgstr "Sortida %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "%s Entrada"
 | 
					msgstr "Entrada %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1220 spa/plugins/alsa/acp/alsa-util.c:1314
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1220 spa/plugins/alsa/acp/alsa-util.c:1314
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										115
									
								
								po/pl.po
									
										
									
									
									
								
							
							
						
						
									
										115
									
								
								po/pl.po
									
										
									
									
									
								
							| 
						 | 
					@ -8,8 +8,8 @@ msgstr ""
 | 
				
			||||||
"Project-Id-Version: pipewire\n"
 | 
					"Project-Id-Version: pipewire\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"issues\n"
 | 
					"issues\n"
 | 
				
			||||||
"POT-Creation-Date: 2025-01-09 15:25+0000\n"
 | 
					"POT-Creation-Date: 2025-09-13 03:33+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2025-02-09 14:55+0100\n"
 | 
					"PO-Revision-Date: 2025-09-13 11:47+0200\n"
 | 
				
			||||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 | 
					"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 | 
				
			||||||
"Language-Team: Polish <community-poland@mozilla.org>\n"
 | 
					"Language-Team: Polish <community-poland@mozilla.org>\n"
 | 
				
			||||||
"Language: pl\n"
 | 
					"Language: pl\n"
 | 
				
			||||||
| 
						 | 
					@ -38,11 +38,11 @@ msgstr ""
 | 
				
			||||||
"%s)\n"
 | 
					"%s)\n"
 | 
				
			||||||
"  -P  --properties                      Ustawia właściwości kontekstu\n"
 | 
					"  -P  --properties                      Ustawia właściwości kontekstu\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:3
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "System multimediów PipeWire"
 | 
					msgstr "System multimediów PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "Uruchomienie systemu multimediów PipeWire"
 | 
					msgstr "Uruchomienie systemu multimediów PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,7 +75,7 @@ msgstr "%s na %s@%s"
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr "%s na %s"
 | 
					msgstr "%s na %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:973
 | 
					#: src/tools/pw-cat.c:1084
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [<file>|-]\n"
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,7 @@ msgstr ""
 | 
				
			||||||
"  -v, --verbose                         Wyświetla więcej komunikatów\n"
 | 
					"  -v, --verbose                         Wyświetla więcej komunikatów\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:980
 | 
					#: src/tools/pw-cat.c:1091
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -R, --remote                          Remote daemon name\n"
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
| 
						 | 
					@ -128,7 +128,7 @@ msgstr ""
 | 
				
			||||||
"  -P  --properties                      Ustawia właściwości węzła\n"
 | 
					"  -P  --properties                      Ustawia właściwości węzła\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:998
 | 
					#: src/tools/pw-cat.c:1109
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"      --rate                            Sample rate (req. for rec) (default "
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
| 
						 | 
					@ -146,6 +146,9 @@ msgid ""
 | 
				
			||||||
"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
"%d)\n"
 | 
					"%d)\n"
 | 
				
			||||||
"  -a, --raw                             RAW mode\n"
 | 
					"  -a, --raw                             RAW mode\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Force midi format, one of \"midi\" "
 | 
				
			||||||
 | 
					"or \"ump\", (default ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              Stop after COUNT samples\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"      --rate                            Częstotliwość próbki (wymagane do "
 | 
					"      --rate                            Częstotliwość próbki (wymagane do "
 | 
				
			||||||
| 
						 | 
					@ -164,15 +167,21 @@ msgstr ""
 | 
				
			||||||
"  -q  --quality                         Jakość resamplera od 0 do 15 "
 | 
					"  -q  --quality                         Jakość resamplera od 0 do 15 "
 | 
				
			||||||
"(domyślnie %d)\n"
 | 
					"(domyślnie %d)\n"
 | 
				
			||||||
"  -a, --raw                             Tryb RAW\n"
 | 
					"  -a, --raw                             Tryb RAW\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Wymusza format MIDI, można użyć "
 | 
				
			||||||
 | 
					"„midi”\n"
 | 
				
			||||||
 | 
					"                                        albo „ump” (domyślnie ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count LICZBA             Zatrzymuje po LICZBIE próbek\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1016
 | 
					#: src/tools/pw-cat.c:1129
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -p, --playback                        Playback mode\n"
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
"  -r, --record                          Recording mode\n"
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"  -d, --dsd                             DSD mode\n"
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
"  -o, --encoded                         Encoded mode\n"
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx mode\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI clip mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -p, --playback                        Tryb odtwarzania\n"
 | 
					"  -p, --playback                        Tryb odtwarzania\n"
 | 
				
			||||||
| 
						 | 
					@ -180,9 +189,11 @@ msgstr ""
 | 
				
			||||||
"  -m, --midi                            Tryb MIDI\n"
 | 
					"  -m, --midi                            Tryb MIDI\n"
 | 
				
			||||||
"  -d, --dsd                             Tryb DSD\n"
 | 
					"  -d, --dsd                             Tryb DSD\n"
 | 
				
			||||||
"  -o, --encoded                         Tryb zakodowany\n"
 | 
					"  -o, --encoded                         Tryb zakodowany\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           Tryb SysEx\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       Tryb klipu MIDI\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2306
 | 
					#: src/tools/pw-cli.c:2386
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -202,15 +213,20 @@ msgstr ""
 | 
				
			||||||
"  -m, --monitor                         Monitoruje aktywność\n"
 | 
					"  -m, --monitor                         Monitoruje aktywność\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:347
 | 
					#: spa/plugins/alsa/acp/acp.c:351
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "Dźwięk w zastosowaniach profesjonalnych"
 | 
					msgstr "Dźwięk w zastosowaniach profesjonalnych"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:507 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
					#: spa/plugins/alsa/acp/acp.c:527 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1795
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1974
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "Wyłączone"
 | 
					msgstr "Wyłączone"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:610
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [błąd UCM biblioteki ALSA]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "Wejście"
 | 
					msgstr "Wejście"
 | 
				
			||||||
| 
						 | 
					@ -234,7 +250,7 @@ msgstr "Wejście liniowe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2139
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2372
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "Mikrofon"
 | 
					msgstr "Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -300,12 +316,15 @@ msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Brak podbicia basów"
 | 
					msgstr "Brak podbicia basów"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2145
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2378
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "Głośnik"
 | 
					msgstr "Głośnik"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#. Don't call it "headset", the HF one has the mic
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2384
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2451
 | 
				
			||||||
msgid "Headphones"
 | 
					msgid "Headphones"
 | 
				
			||||||
msgstr "Słuchawki"
 | 
					msgstr "Słuchawki"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -415,7 +434,7 @@ msgstr "Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2127
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2360
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "Słuchawki z mikrofonem"
 | 
					msgstr "Słuchawki z mikrofonem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -631,112 +650,108 @@ msgstr[2] ""
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
msgstr "(nieprawidłowe)"
 | 
					msgstr "(nieprawidłowe)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:193
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "Wbudowany dźwięk"
 | 
					msgstr "Wbudowany dźwięk"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:198
 | 
					#: spa/plugins/alsa/acp/compat.c:199
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "Modem"
 | 
					msgstr "Modem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1806
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1985
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "Bramka dźwięku (źródło A2DP i AG HSP/HFP)"
 | 
					msgstr "Bramka dźwięku (źródło A2DP i AG HSP/HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1834
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
				
			||||||
msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
msgstr "Przesyłanie dźwięku do aparatów słuchowych (odpływ ASHA)"
 | 
					msgstr "Przesyłanie dźwięku do aparatów słuchowych (odpływ ASHA)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1874
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2057
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP, kodek %s)"
 | 
					msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1877
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2060
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP, kodek %s)"
 | 
					msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1885
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2068
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP)"
 | 
					msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1887
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP)"
 | 
					msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1937
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2144
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "Odtwarzanie o wysokiej dokładności (odpływ BAP, kodek %s)"
 | 
					msgstr "Odtwarzanie o wysokiej dokładności (odpływ BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1942
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2149
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "Wejście o wysokiej dokładności (źródło BAP, kodek %s)"
 | 
					msgstr "Wejście o wysokiej dokładności (źródło BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1946
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2153
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ BAP, kodek %s)"
 | 
					msgstr "Dupleks o wysokiej dokładności (źródło/odpływ BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1955
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2162
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "Odtwarzanie o wysokiej dokładności (odpływ BAP)"
 | 
					msgstr "Odtwarzanie o wysokiej dokładności (odpływ BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1959
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2166
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "Wejście o wysokiej dokładności (źródło BAP)"
 | 
					msgstr "Wejście o wysokiej dokładności (źródło BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1962
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ BAP)"
 | 
					msgstr "Dupleks o wysokiej dokładności (źródło/odpływ BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2008
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2209
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "Jednostka główna słuchawek z mikrofonem (HSP/HFP, kodek %s)"
 | 
					msgstr "Jednostka główna słuchawek z mikrofonem (HSP/HFP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2128
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2361
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2133
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2366
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2140
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2373
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2146
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2379
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2152
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2385
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2158
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2391
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2164
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2397
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2170
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2403
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2176
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2409
 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "Zestaw głośnomówiący"
 | 
					msgstr "Zestaw głośnomówiący"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2134
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2367
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "Zestaw głośnomówiący (HFP)"
 | 
					msgstr "Zestaw głośnomówiący (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2151
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2390
 | 
				
			||||||
msgid "Headphone"
 | 
					 | 
				
			||||||
msgstr "Słuchawki"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2157
 | 
					 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "Przenośne"
 | 
					msgstr "Przenośne"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2163
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2396
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "Samochód"
 | 
					msgstr "Samochód"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2402
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "HiFi"
 | 
					msgstr "HiFi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2175
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2408
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "Telefon"
 | 
					msgstr "Telefon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2182
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2415
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "Bluetooth"
 | 
					msgstr "Bluetooth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2183
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2416
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "Bluetooth (HFP)"
 | 
					msgstr "Bluetooth (HFP)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										137
									
								
								po/sl.po
									
										
									
									
									
								
							
							
						
						
									
										137
									
								
								po/sl.po
									
										
									
									
									
								
							| 
						 | 
					@ -9,16 +9,16 @@ msgstr ""
 | 
				
			||||||
"Project-Id-Version: PipeWire master\n"
 | 
					"Project-Id-Version: PipeWire master\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"issues\n"
 | 
					"issues\n"
 | 
				
			||||||
"POT-Creation-Date: 2025-01-09 15:25+0000\n"
 | 
					"POT-Creation-Date: 2025-09-11 03:34+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2025-01-23 09:23+0100\n"
 | 
					"PO-Revision-Date: 2025-09-11 11:47+0200\n"
 | 
				
			||||||
"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
 | 
					"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
 | 
				
			||||||
"Language-Team: Slovenian <gnome-si@googlegroups.com>\n"
 | 
					"Language-Team: Slovenian <gnome-si@googlegroups.com>\n"
 | 
				
			||||||
"Language: sl\n"
 | 
					"Language: sl\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && n"
 | 
					"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100>=3 && "
 | 
				
			||||||
"%100<=4 ? 2 : 3);\n"
 | 
					"n%100<=4 ? 2 : 3);\n"
 | 
				
			||||||
"X-Generator: Poedit 2.2.1\n"
 | 
					"X-Generator: Poedit 2.2.1\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.c:29
 | 
					#: src/daemon/pipewire.c:29
 | 
				
			||||||
| 
						 | 
					@ -37,13 +37,13 @@ msgstr ""
 | 
				
			||||||
"      --version                         Pokaži različico\n"
 | 
					"      --version                         Pokaži različico\n"
 | 
				
			||||||
"  -c, --config                          Naloži prilagoditev config (privzeto "
 | 
					"  -c, --config                          Naloži prilagoditev config (privzeto "
 | 
				
			||||||
"%s)\n"
 | 
					"%s)\n"
 | 
				
			||||||
"  -P  —properties                      Določi lastnosti konteksta\n"
 | 
					"  -P  --properties                      Določi lastnosti konteksta\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:3
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "Medijski sistem PipeWire"
 | 
					msgstr "Medijski sistem PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "Zaženite medijski sistem PipeWire"
 | 
					msgstr "Zaženite medijski sistem PipeWire"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ msgstr "%s na %s@%s"
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr "%s na %s"
 | 
					msgstr "%s na %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:973
 | 
					#: src/tools/pw-cat.c:1084
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [<file>|-]\n"
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
| 
						 | 
					@ -92,7 +92,7 @@ msgstr ""
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
"</file>\n"
 | 
					"</file>\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:980
 | 
					#: src/tools/pw-cat.c:1091
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -R, --remote                          Remote daemon name\n"
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
| 
						 | 
					@ -129,7 +129,7 @@ msgstr ""
 | 
				
			||||||
"  -P  --properties                      Nastavi lastnosti vozlišča\n"
 | 
					"  -P  --properties                      Nastavi lastnosti vozlišča\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:998
 | 
					#: src/tools/pw-cat.c:1109
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"      --rate                            Sample rate (req. for rec) (default "
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
| 
						 | 
					@ -147,14 +147,17 @@ msgid ""
 | 
				
			||||||
"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
"%d)\n"
 | 
					"%d)\n"
 | 
				
			||||||
"  -a, --raw                             RAW mode\n"
 | 
					"  -a, --raw                             RAW mode\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Force midi format, one of \"midi\" "
 | 
				
			||||||
 | 
					"or \"ump\", (default ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              Stop after COUNT samples\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"      --rate                            Mera vzorčenja (zahtevano za rec) "
 | 
					"      --rate                            Mera vzorčenja (zaht. za rec) "
 | 
				
			||||||
 | 
					"(privzeto %u)\n"
 | 
				
			||||||
 | 
					"      --channels                        Število kanalov (zaht. za snemanje) "
 | 
				
			||||||
"(privzeto %u)\n"
 | 
					"(privzeto %u)\n"
 | 
				
			||||||
"      --channels                        Število kanalov (zahteva za "
 | 
					 | 
				
			||||||
"snemanje) (privzeto %u)\n"
 | 
					 | 
				
			||||||
"      --channel-map                     Preslikava kanalov\n"
 | 
					"      --channel-map                     Preslikava kanalov\n"
 | 
				
			||||||
"                                            Ena izmed: \"Stereo\", "
 | 
					"                                            Ena izmed: \"stereo\", "
 | 
				
			||||||
"\"surround-51\",... ali\n"
 | 
					"\"surround-51\",... ali\n"
 | 
				
			||||||
"                                            seznam imen kanalov, ločen z "
 | 
					"                                            seznam imen kanalov, ločen z "
 | 
				
			||||||
"vejico: npr. \"FL,FR\"\n"
 | 
					"vejico: npr. \"FL,FR\"\n"
 | 
				
			||||||
| 
						 | 
					@ -164,16 +167,20 @@ msgstr ""
 | 
				
			||||||
"  -q  --quality                         Kakovost prevzorčenja (0 - 15) "
 | 
					"  -q  --quality                         Kakovost prevzorčenja (0 - 15) "
 | 
				
			||||||
"(privzeto %d)\n"
 | 
					"(privzeto %d)\n"
 | 
				
			||||||
"  -a, --raw                             neobdelan način (RAW)\n"
 | 
					"  -a, --raw                             neobdelan način (RAW)\n"
 | 
				
			||||||
"\n"
 | 
					"  -M, --force-midi                      Vsili zapis midi, eden izmed "
 | 
				
			||||||
 | 
					"\"midi\" ali \"ump\" (privzeto ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count ŠTEVEC              Ustavi po ŠTEVEC vzorcih\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1016
 | 
					#: src/tools/pw-cat.c:1129
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -p, --playback                        Playback mode\n"
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
"  -r, --record                          Recording mode\n"
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"  -d, --dsd                             DSD mode\n"
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
"  -o, --encoded                         Encoded mode\n"
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx mode\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI clip mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -p, --playback                        Način predvajanja\n"
 | 
					"  -p, --playback                        Način predvajanja\n"
 | 
				
			||||||
| 
						 | 
					@ -181,9 +188,11 @@ msgstr ""
 | 
				
			||||||
"  -m, --midi                            Midi način\n"
 | 
					"  -m, --midi                            Midi način\n"
 | 
				
			||||||
"  -d, --dsd                             Način DSD\n"
 | 
					"  -d, --dsd                             Način DSD\n"
 | 
				
			||||||
"  -o, --encoded                         Kodiran način\n"
 | 
					"  -o, --encoded                         Kodiran način\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           Način SysEx\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       Način posnetka MIDI\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2306
 | 
					#: src/tools/pw-cli.c:2386
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -203,15 +212,20 @@ msgstr ""
 | 
				
			||||||
"  -m, --monitor                         Spremljaj dejavnosti\n"
 | 
					"  -m, --monitor                         Spremljaj dejavnosti\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:347
 | 
					#: spa/plugins/alsa/acp/acp.c:351
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "Profesionalni zvok"
 | 
					msgstr "Profesionalni zvok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:507 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
					#: spa/plugins/alsa/acp/acp.c:527 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1795
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1974
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "Izklopljeno"
 | 
					msgstr "Izklopljeno"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:610
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [napaka ALSA UCM]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "Vhod"
 | 
					msgstr "Vhod"
 | 
				
			||||||
| 
						 | 
					@ -235,7 +249,7 @@ msgstr "Linijski vhod"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2139
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2372
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "Mikrofon"
 | 
					msgstr "Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,12 +315,15 @@ msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Brez ojačitve nizkih tonov"
 | 
					msgstr "Brez ojačitve nizkih tonov"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2145
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2378
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "Zvočnik"
 | 
					msgstr "Zvočnik"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#. Don't call it "headset", the HF one has the mic
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2384
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2451
 | 
				
			||||||
msgid "Headphones"
 | 
					msgid "Headphones"
 | 
				
			||||||
msgstr "Slušalke"
 | 
					msgstr "Slušalke"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -416,7 +433,7 @@ msgstr "Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2127
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2360
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "Slušalka"
 | 
					msgstr "Slušalka"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -575,13 +592,13 @@ msgstr[3] ""
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li bytes "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
| 
						 | 
					@ -655,112 +672,108 @@ msgstr[3] ""
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
msgstr "(neveljavno)"
 | 
					msgstr "(neveljavno)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:193
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "Vgrajen zvok"
 | 
					msgstr "Vgrajen zvok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:198
 | 
					#: spa/plugins/alsa/acp/compat.c:199
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "Modem"
 | 
					msgstr "Modem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1806
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1985
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "Zvožni prehod (vir A2DP in HSP/HFP AG)"
 | 
					msgstr "Zvožni prehod (vir A2DP in HSP/HFP AG)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1834
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
				
			||||||
msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
msgstr "Pretakanje zvoka za slušne aparate (ponor ASHA)"
 | 
					msgstr "Pretakanje zvoka za slušne aparate (ponor ASHA)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1874
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2057
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "Predvajanje visoke ločljivosti (ponor A2DP, kodek %s)"
 | 
					msgstr "Predvajanje visoke ločljivosti (ponor A2DP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1877
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2060
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dupleks visoke ločljivosti (vir/ponor A2DP, kodek %s)"
 | 
					msgstr "Dupleks visoke ločljivosti (vir/ponor A2DP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1885
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2068
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "Predvajanje visoke ločljivosti (ponor A2DP)"
 | 
					msgstr "Predvajanje visoke ločljivosti (ponor A2DP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1887
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "Dupleks visoke ločljivosti (vir/ponor A2DP)"
 | 
					msgstr "Dupleks visoke ločljivosti (vir/ponor A2DP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1937
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2144
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "Predvajanje visoke ločljivosti (ponor BAP, kodek %s)"
 | 
					msgstr "Predvajanje visoke ločljivosti (ponor BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1942
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2149
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "Vhod visoke ločljivosti (vir BAP, kodek %s)"
 | 
					msgstr "Vhod visoke ločljivosti (vir BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1946
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2153
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Dupleks visoke ločljivosti (vir/ponor BAP, kodek %s)"
 | 
					msgstr "Dupleks visoke ločljivosti (vir/ponor BAP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1955
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2162
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "Predvajanje visoke ločljivosti (ponor BAP)"
 | 
					msgstr "Predvajanje visoke ločljivosti (ponor BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1959
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2166
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "Vhod visoke ločljivosti (vir BAP)"
 | 
					msgstr "Vhod visoke ločljivosti (vir BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1962
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "Dupleks visoke ločljivosti (vir/ponor BAP)"
 | 
					msgstr "Dupleks visoke ločljivosti (vir/ponor BAP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2008
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2209
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "Naglavna enota slušalk (HSP/HFP, kodek %s)"
 | 
					msgstr "Naglavna enota slušalk (HSP/HFP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2128
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2361
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2133
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2366
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2140
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2373
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2146
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2379
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2152
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2385
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2158
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2391
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2164
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2397
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2170
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2403
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2176
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2409
 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "Prostoročno telefoniranje"
 | 
					msgstr "Prostoročno telefoniranje"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2134
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2367
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "Prostoročno telefoniranje (HFP)"
 | 
					msgstr "Prostoročno telefoniranje (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2151
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2390
 | 
				
			||||||
msgid "Headphone"
 | 
					 | 
				
			||||||
msgstr "Slušalke"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2157
 | 
					 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "Prenosna naprava"
 | 
					msgstr "Prenosna naprava"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2163
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2396
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "Avtomobil"
 | 
					msgstr "Avtomobil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2402
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "HiFi"
 | 
					msgstr "HiFi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2175
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2408
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "Telefon"
 | 
					msgstr "Telefon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2182
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2415
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "Bluetooth"
 | 
					msgstr "Bluetooth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2183
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2416
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "Bluetooth (HFP)"
 | 
					msgstr "Bluetooth (HFP)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										183
									
								
								po/sv.po
									
										
									
									
									
								
							
							
						
						
									
										183
									
								
								po/sv.po
									
										
									
									
									
								
							| 
						 | 
					@ -1,9 +1,9 @@
 | 
				
			||||||
# Swedish translation for pipewire.
 | 
					# Swedish translation for pipewire.
 | 
				
			||||||
# Copyright © 2008-2024 Free Software Foundation, Inc.
 | 
					# Copyright © 2008-2025 Free Software Foundation, Inc.
 | 
				
			||||||
# This file is distributed under the same license as the pipewire package.
 | 
					# This file is distributed under the same license as the pipewire package.
 | 
				
			||||||
# Daniel Nylander <po@danielnylander.se>, 2008, 2012.
 | 
					# Daniel Nylander <po@danielnylander.se>, 2008, 2012.
 | 
				
			||||||
# Josef Andersson <josef.andersson@fripost.org>, 2014, 2017.
 | 
					# Josef Andersson <josef.andersson@fripost.org>, 2014, 2017.
 | 
				
			||||||
# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2021, 2022, 2023, 2024.
 | 
					# Anders Jonsson <anders.jonsson@norsjovallen.se>, 2021, 2022, 2023, 2024, 2025.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Termer:
 | 
					# Termer:
 | 
				
			||||||
# input/output: ingång/utgång (det handlar om ljud)
 | 
					# input/output: ingång/utgång (det handlar om ljud)
 | 
				
			||||||
| 
						 | 
					@ -19,8 +19,8 @@ msgstr ""
 | 
				
			||||||
"Project-Id-Version: pipewire\n"
 | 
					"Project-Id-Version: pipewire\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"issues\n"
 | 
					"issues\n"
 | 
				
			||||||
"POT-Creation-Date: 2024-11-05 03:27+0000\n"
 | 
					"POT-Creation-Date: 2025-04-16 15:31+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-11-07 21:52+0100\n"
 | 
					"PO-Revision-Date: 2025-04-22 10:43+0200\n"
 | 
				
			||||||
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
 | 
					"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
 | 
				
			||||||
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 | 
					"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 | 
				
			||||||
"Language: sv\n"
 | 
					"Language: sv\n"
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,7 @@ msgstr "Tunnel till %s%s%s"
 | 
				
			||||||
msgid "Dummy Output"
 | 
					msgid "Dummy Output"
 | 
				
			||||||
msgstr "Attrapputgång"
 | 
					msgstr "Attrapputgång"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-pulse-tunnel.c:777
 | 
					#: src/modules/module-pulse-tunnel.c:760
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Tunnel for %s@%s"
 | 
					msgid "Tunnel for %s@%s"
 | 
				
			||||||
msgstr "Tunnel för %s@%s"
 | 
					msgstr "Tunnel för %s@%s"
 | 
				
			||||||
| 
						 | 
					@ -184,7 +184,7 @@ msgstr ""
 | 
				
			||||||
"  -o, --encoded                         Kodat läge\n"
 | 
					"  -o, --encoded                         Kodat läge\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2318
 | 
					#: src/tools/pw-cli.c:2306
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -198,20 +198,25 @@ msgstr ""
 | 
				
			||||||
"%s [flaggor] [kommando]\n"
 | 
					"%s [flaggor] [kommando]\n"
 | 
				
			||||||
"  -h, --help                            Visa denna hjälp\n"
 | 
					"  -h, --help                            Visa denna hjälp\n"
 | 
				
			||||||
"      --version                         Show version\n"
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
"  -d, --daemon                          Starta som demon (Standard false)\n"
 | 
					"  -d, --daemon                          Starta som demon (standard false)\n"
 | 
				
			||||||
"  -r, --remote                          Fjärrdemonnamn\n"
 | 
					"  -r, --remote                          Fjärrdemonnamn\n"
 | 
				
			||||||
"  -m, --monitor                         Övervaka aktivitet\n"
 | 
					"  -m, --monitor                         Övervaka aktivitet\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:327
 | 
					#: spa/plugins/alsa/acp/acp.c:350
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "Professionellt ljud"
 | 
					msgstr "Professionellt ljud"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:487 spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
					#: spa/plugins/alsa/acp/acp.c:511 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1705
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1802
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "Av"
 | 
					msgstr "Av"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:593
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [ALSA UCM-fel]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "Ingång"
 | 
					msgstr "Ingång"
 | 
				
			||||||
| 
						 | 
					@ -235,7 +240,7 @@ msgstr "Linje in"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2026
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2146
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "Mikrofon"
 | 
					msgstr "Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -301,7 +306,7 @@ msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Ingen basökning"
 | 
					msgstr "Ingen basökning"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2032
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2152
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "Högtalare"
 | 
					msgstr "Högtalare"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -383,15 +388,15 @@ msgstr "Chatt-ingång"
 | 
				
			||||||
msgid "Virtual Surround 7.1"
 | 
					msgid "Virtual Surround 7.1"
 | 
				
			||||||
msgstr "Virtual surround 7.1"
 | 
					msgstr "Virtual surround 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4456
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
				
			||||||
msgid "Analog Mono"
 | 
					msgid "Analog Mono"
 | 
				
			||||||
msgstr "Analog mono"
 | 
					msgstr "Analog mono"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4457
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
				
			||||||
msgid "Analog Mono (Left)"
 | 
					msgid "Analog Mono (Left)"
 | 
				
			||||||
msgstr "Analog mono (vänster)"
 | 
					msgstr "Analog mono (vänster)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
				
			||||||
msgid "Analog Mono (Right)"
 | 
					msgid "Analog Mono (Right)"
 | 
				
			||||||
msgstr "Analog mono (höger)"
 | 
					msgstr "Analog mono (höger)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -400,147 +405,147 @@ msgstr "Analog mono (höger)"
 | 
				
			||||||
#. * here would lead to the source name to become "Analog Stereo Input
 | 
					#. * here would lead to the source name to become "Analog Stereo Input
 | 
				
			||||||
#. * Input". The same logic applies to analog-stereo-output,
 | 
					#. * Input". The same logic applies to analog-stereo-output,
 | 
				
			||||||
#. * multichannel-input and multichannel-output.
 | 
					#. * multichannel-input and multichannel-output.
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4467
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4468
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
				
			||||||
msgid "Analog Stereo"
 | 
					msgid "Analog Stereo"
 | 
				
			||||||
msgstr "Analog stereo"
 | 
					msgstr "Analog stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4462
 | 
				
			||||||
msgid "Mono"
 | 
					msgid "Mono"
 | 
				
			||||||
msgstr "Mono"
 | 
					msgstr "Mono"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4463
 | 
				
			||||||
msgid "Stereo"
 | 
					msgid "Stereo"
 | 
				
			||||||
msgstr "Stereo"
 | 
					msgstr "Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2134
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "Headset"
 | 
					msgstr "Headset"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
				
			||||||
msgid "Speakerphone"
 | 
					msgid "Speakerphone"
 | 
				
			||||||
msgstr "Högtalartelefon"
 | 
					msgstr "Högtalartelefon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
				
			||||||
msgid "Multichannel"
 | 
					msgid "Multichannel"
 | 
				
			||||||
msgstr "Multikanal"
 | 
					msgstr "Multikanal"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
				
			||||||
msgid "Analog Surround 2.1"
 | 
					msgid "Analog Surround 2.1"
 | 
				
			||||||
msgstr "Analog surround 2.1"
 | 
					msgstr "Analog surround 2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
				
			||||||
msgid "Analog Surround 3.0"
 | 
					msgid "Analog Surround 3.0"
 | 
				
			||||||
msgstr "Analog surround 3.0"
 | 
					msgstr "Analog surround 3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
				
			||||||
msgid "Analog Surround 3.1"
 | 
					msgid "Analog Surround 3.1"
 | 
				
			||||||
msgstr "Analog surround 3.1"
 | 
					msgstr "Analog surround 3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
				
			||||||
msgid "Analog Surround 4.0"
 | 
					msgid "Analog Surround 4.0"
 | 
				
			||||||
msgstr "Analog surround 4.0"
 | 
					msgstr "Analog surround 4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
				
			||||||
msgid "Analog Surround 4.1"
 | 
					msgid "Analog Surround 4.1"
 | 
				
			||||||
msgstr "Analog surround 4.1"
 | 
					msgstr "Analog surround 4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
				
			||||||
msgid "Analog Surround 5.0"
 | 
					msgid "Analog Surround 5.0"
 | 
				
			||||||
msgstr "Analog surround 5.0"
 | 
					msgstr "Analog surround 5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
				
			||||||
msgid "Analog Surround 5.1"
 | 
					msgid "Analog Surround 5.1"
 | 
				
			||||||
msgstr "Analog surround 5.1"
 | 
					msgstr "Analog surround 5.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
				
			||||||
msgid "Analog Surround 6.0"
 | 
					msgid "Analog Surround 6.0"
 | 
				
			||||||
msgstr "Analog surround 6.0"
 | 
					msgstr "Analog surround 6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
				
			||||||
msgid "Analog Surround 6.1"
 | 
					msgid "Analog Surround 6.1"
 | 
				
			||||||
msgstr "Analog surround 6.1"
 | 
					msgstr "Analog surround 6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
				
			||||||
msgid "Analog Surround 7.0"
 | 
					msgid "Analog Surround 7.0"
 | 
				
			||||||
msgstr "Analog surround 7.0"
 | 
					msgstr "Analog surround 7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
				
			||||||
msgid "Analog Surround 7.1"
 | 
					msgid "Analog Surround 7.1"
 | 
				
			||||||
msgstr "Analog surround 7.1"
 | 
					msgstr "Analog surround 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
				
			||||||
msgid "Digital Stereo (IEC958)"
 | 
					msgid "Digital Stereo (IEC958)"
 | 
				
			||||||
msgstr "Digital stereo (IEC958)"
 | 
					msgstr "Digital stereo (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
				
			||||||
msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
					msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Digital surround 4.0 (IEC958/AC3)"
 | 
					msgstr "Digital surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
					msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Digital surround 5.1 (IEC958/AC3)"
 | 
					msgstr "Digital surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
					msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
msgstr "Digital surround 5.1 (IEC958/DTS)"
 | 
					msgstr "Digital surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
				
			||||||
msgid "Digital Stereo (HDMI)"
 | 
					msgid "Digital Stereo (HDMI)"
 | 
				
			||||||
msgstr "Digital stereo (HDMI)"
 | 
					msgstr "Digital stereo (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
				
			||||||
msgid "Digital Surround 5.1 (HDMI)"
 | 
					msgid "Digital Surround 5.1 (HDMI)"
 | 
				
			||||||
msgstr "Digital surround 5.1 (HDMI)"
 | 
					msgstr "Digital surround 5.1 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4492
 | 
				
			||||||
msgid "Chat"
 | 
					msgid "Chat"
 | 
				
			||||||
msgstr "Chatt"
 | 
					msgstr "Chatt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4493
 | 
				
			||||||
msgid "Game"
 | 
					msgid "Game"
 | 
				
			||||||
msgstr "Spel"
 | 
					msgstr "Spel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4625
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
				
			||||||
msgid "Analog Mono Duplex"
 | 
					msgid "Analog Mono Duplex"
 | 
				
			||||||
msgstr "Analog mono duplex"
 | 
					msgstr "Analog mono duplex"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4626
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
				
			||||||
msgid "Analog Stereo Duplex"
 | 
					msgid "Analog Stereo Duplex"
 | 
				
			||||||
msgstr "Analog stereo duplex"
 | 
					msgstr "Analog stereo duplex"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
				
			||||||
msgid "Digital Stereo Duplex (IEC958)"
 | 
					msgid "Digital Stereo Duplex (IEC958)"
 | 
				
			||||||
msgstr "Digital stereo duplex (IEC958)"
 | 
					msgstr "Digital stereo duplex (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
				
			||||||
msgid "Multichannel Duplex"
 | 
					msgid "Multichannel Duplex"
 | 
				
			||||||
msgstr "Multikanalduplex"
 | 
					msgstr "Multikanalduplex"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
				
			||||||
msgid "Stereo Duplex"
 | 
					msgid "Stereo Duplex"
 | 
				
			||||||
msgstr "Stereo duplex"
 | 
					msgstr "Stereo duplex"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4634
 | 
				
			||||||
msgid "Mono Chat + 7.1 Surround"
 | 
					msgid "Mono Chat + 7.1 Surround"
 | 
				
			||||||
msgstr "Mono Chatt + 7.1 Surround"
 | 
					msgstr "Mono Chatt + 7.1 Surround"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4735
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "%s-utgång"
 | 
					msgstr "%s-utgång"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4743
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "%s-ingång"
 | 
					msgstr "%s-ingång"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1231 spa/plugins/alsa/acp/alsa-util.c:1325
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1233 spa/plugins/alsa/acp/alsa-util.c:1327
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
				
			||||||
| 
						 | 
					@ -563,7 +568,7 @@ msgstr[1] ""
 | 
				
			||||||
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
					"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
				
			||||||
"problemet till ALSA-utvecklarna."
 | 
					"problemet till ALSA-utvecklarna."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1297
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
| 
						 | 
					@ -586,7 +591,7 @@ msgstr[1] ""
 | 
				
			||||||
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
					"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
				
			||||||
"problemet till ALSA-utvecklarna."
 | 
					"problemet till ALSA-utvecklarna."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1344
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1346
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
					"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
				
			||||||
| 
						 | 
					@ -599,7 +604,7 @@ msgstr ""
 | 
				
			||||||
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
					"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
 | 
				
			||||||
"problemet till ALSA-utvecklarna."
 | 
					"problemet till ALSA-utvecklarna."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1387
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1389
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
				
			||||||
| 
						 | 
					@ -634,100 +639,104 @@ msgstr "Inbyggt ljud"
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "Modem"
 | 
					msgstr "Modem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1716
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1813
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "Audio gateway (A2DP-källa & HSP/HFP AG)"
 | 
					msgstr "Audio gateway (A2DP-källa & HSP/HFP AG)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1764
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1841
 | 
				
			||||||
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
 | 
					msgstr "Ljudströmning för hörhjälpmedel (ASHA-utgång)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1881
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "High fidelity-uppspelning (A2DP-utgång, kodek %s)"
 | 
					msgstr "High fidelity-uppspelning (A2DP-utgång, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1767
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1884
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "High fidelity duplex (A2DP-källa/utgång, kodek %s)"
 | 
					msgstr "High fidelity duplex (A2DP-källa/utgång, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1775
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1892
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "High fidelity-uppspelning (A2DP-utgång)"
 | 
					msgstr "High fidelity-uppspelning (A2DP-utgång)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1777
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1894
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "High fidelity duplex (A2DP-källa/utgång)"
 | 
					msgstr "High fidelity duplex (A2DP-källa/utgång)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1827
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1944
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "High fidelity-uppspelning (BAP-utgång, kodek %s)"
 | 
					msgstr "High fidelity-uppspelning (BAP-utgång, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1832
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1949
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "High fidelity-ingång (BAP-källa, kodek %s)"
 | 
					msgstr "High fidelity-ingång (BAP-källa, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1836
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1953
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "High fidelity duplex (BAP-källa/utgång, kodek %s)"
 | 
					msgstr "High fidelity duplex (BAP-källa/utgång, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1845
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1962
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "High fidelity-uppspelning (BAP-utgång)"
 | 
					msgstr "High fidelity-uppspelning (BAP-utgång)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1849
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1966
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "High fidelity-ingång (BAP-källa)"
 | 
					msgstr "High fidelity-ingång (BAP-källa)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1852
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1969
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "High fidelity duplex (BAP-källa/utgång)"
 | 
					msgstr "High fidelity duplex (BAP-källa/utgång)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1901
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2015
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "Headset-huvudenhet (HSP/HFP, kodek %s)"
 | 
					msgstr "Headset-huvudenhet (HSP/HFP, kodek %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2015
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2135
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2020
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2140
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2027
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2147
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2033
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2153
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2039
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2159
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2045
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2165
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2051
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2171
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2057
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2177
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2063
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2183
 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "Handsfree"
 | 
					msgstr "Handsfree"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2021
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2141
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "Handsfree (HFP)"
 | 
					msgstr "Handsfree (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2038
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2158
 | 
				
			||||||
msgid "Headphone"
 | 
					msgid "Headphone"
 | 
				
			||||||
msgstr "Hörlurar"
 | 
					msgstr "Hörlurar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2044
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2164
 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "Bärbar"
 | 
					msgstr "Bärbar"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2050
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2170
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "Bil"
 | 
					msgstr "Bil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2056
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2176
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "HiFi"
 | 
					msgstr "HiFi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2062
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2182
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "Telefon"
 | 
					msgstr "Telefon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2069
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2189
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "Bluetooth"
 | 
					msgstr "Bluetooth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2190
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "Bluetooth (HFP)"
 | 
					msgstr "Bluetooth (HFP)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										341
									
								
								po/tr.po
									
										
									
									
									
								
							
							
						
						
									
										341
									
								
								po/tr.po
									
										
									
									
									
								
							| 
						 | 
					@ -1,46 +1,51 @@
 | 
				
			||||||
# Turkish translation for PipeWire.
 | 
					# Turkish translation for PipeWire.
 | 
				
			||||||
# Copyright (C) 2014-2024 PipeWire's COPYRIGHT HOLDER
 | 
					# Copyright (C) 2014-2025 PipeWire's COPYRIGHT HOLDER
 | 
				
			||||||
# This file is distributed under the same license as the PipeWire package.
 | 
					# This file is distributed under the same license as the PipeWire package.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Necdet Yücel <necdetyucel@gmail.com>, 2014.
 | 
					# Necdet Yücel <necdetyucel@gmail.com>, 2014.
 | 
				
			||||||
# Kaan Özdinçer <kaanozdincer@gmail.com>, 2014.
 | 
					# Kaan Özdinçer <kaanozdincer@gmail.com>, 2014.
 | 
				
			||||||
# Muhammet Kara <muhammetk@gmail.com>, 2015, 2016, 2017.
 | 
					# Muhammet Kara <muhammetk@gmail.com>, 2015, 2016, 2017.
 | 
				
			||||||
# Oğuz Ersen <oguz@ersen.moe>, 2021-2022.
 | 
					# Oğuz Ersen <oguz@ersen.moe>, 2021-2022.
 | 
				
			||||||
# Sabri Ünal <libreajans@gmail.com>, 2024.
 | 
					# Sabri Ünal <yakushabb@gmail.com>, 2024, 2025.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: PipeWire master\n"
 | 
					"Project-Id-Version: PipeWire master\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: \n"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"POT-Creation-Date: 2024-02-25 03:43+0300\n"
 | 
					"issues\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-02-25 03:49+0300\n"
 | 
					"POT-Creation-Date: 2025-10-24 15:37+0000\n"
 | 
				
			||||||
"Last-Translator: Sabri Ünal <libreajans@gmail.com>\n"
 | 
					"PO-Revision-Date: 2025-10-24 20:15+0300\n"
 | 
				
			||||||
 | 
					"Last-Translator: Sabri Ünal <yakushabb@gmail.com>\n"
 | 
				
			||||||
"Language-Team: Türkçe <takim@gnome.org.tr>\n"
 | 
					"Language-Team: Türkçe <takim@gnome.org.tr>\n"
 | 
				
			||||||
"Language: tr\n"
 | 
					"Language: tr\n"
 | 
				
			||||||
"MIME-Version: 1.0\n"
 | 
					"MIME-Version: 1.0\n"
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"Plural-Forms: nplurals=1; plural=0;\n"
 | 
					"Plural-Forms: nplurals=1; plural=0;\n"
 | 
				
			||||||
"X-Generator: Poedit 3.4.2\n"
 | 
					"X-Generator: Poedit 3.8\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.c:26
 | 
					#: src/daemon/pipewire.c:29
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options]\n"
 | 
					"%s [options]\n"
 | 
				
			||||||
"  -h, --help                            Show this help\n"
 | 
					"  -h, --help                            Show this help\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Increase verbosity by one level\n"
 | 
				
			||||||
"      --version                         Show version\n"
 | 
					"      --version                         Show version\n"
 | 
				
			||||||
"  -c, --config                          Load config (Default %s)\n"
 | 
					"  -c, --config                          Load config (Default %s)\n"
 | 
				
			||||||
 | 
					"  -P  --properties                      Set context properties\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"%s [seçenekler]\n"
 | 
					"%s [seçenekler]\n"
 | 
				
			||||||
"  -h, --help                            Bu yardımı göster\n"
 | 
					"  -h, --help                            Bu yardımı göster\n"
 | 
				
			||||||
 | 
					"  -v, --verbose                         Ayrıntı düzeyini bir düzey artır\n"
 | 
				
			||||||
"      --version                         Sürümü göster\n"
 | 
					"      --version                         Sürümü göster\n"
 | 
				
			||||||
"  -c, --config                          Yapılandırmayı yükle (Öntanımlı %s)\n"
 | 
					"  -c, --config                          Yapılandırmayı yükle (Öntanımlı %s)\n"
 | 
				
			||||||
 | 
					"  -P  --properties                      Bağlam özelliklerini ayarla\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:3
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "PipeWire Ortam Sistemi"
 | 
					msgstr "PipeWire Ortam Sistemi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "PipeWire Ortam Sistemini Başlat"
 | 
					msgstr "PipeWire Ortam Sistemini Başlat"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,26 +59,26 @@ msgstr "%s%s%s tüneli"
 | 
				
			||||||
msgid "Dummy Output"
 | 
					msgid "Dummy Output"
 | 
				
			||||||
msgstr "Temsili Çıkış"
 | 
					msgstr "Temsili Çıkış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-pulse-tunnel.c:774
 | 
					#: src/modules/module-pulse-tunnel.c:760
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Tunnel for %s@%s"
 | 
					msgid "Tunnel for %s@%s"
 | 
				
			||||||
msgstr "%s@%s için tünel"
 | 
					msgstr "%s@%s için tünel"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:315
 | 
					#: src/modules/module-zeroconf-discover.c:320
 | 
				
			||||||
msgid "Unknown device"
 | 
					msgid "Unknown device"
 | 
				
			||||||
msgstr "Bilinmeyen aygıt"
 | 
					msgstr "Bilinmeyen aygıt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:327
 | 
					#: src/modules/module-zeroconf-discover.c:332
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s@%s"
 | 
					msgid "%s on %s@%s"
 | 
				
			||||||
msgstr "%s, %s@%s"
 | 
					msgstr "%s, %s@%s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:331
 | 
					#: src/modules/module-zeroconf-discover.c:336
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr "%s, %s"
 | 
					msgstr "%s, %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:991
 | 
					#: src/tools/pw-cat.c:1096
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [<file>|-]\n"
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
| 
						 | 
					@ -88,7 +93,7 @@ msgstr ""
 | 
				
			||||||
"  -v, --verbose                         Ayrıntılı işlemleri etkinleştir\n"
 | 
					"  -v, --verbose                         Ayrıntılı işlemleri etkinleştir\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:998
 | 
					#: src/tools/pw-cat.c:1103
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -R, --remote                          Remote daemon name\n"
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
| 
						 | 
					@ -122,7 +127,7 @@ msgstr ""
 | 
				
			||||||
"  -P  --properties                      Düğüm özelliklerini ayarla\n"
 | 
					"  -P  --properties                      Düğüm özelliklerini ayarla\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1016
 | 
					#: src/tools/pw-cat.c:1121
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"      --rate                            Sample rate (req. for rec) (default "
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
| 
						 | 
					@ -139,6 +144,10 @@ msgid ""
 | 
				
			||||||
"      --volume                          Stream volume 0-1.0 (default %.3f)\n"
 | 
					"      --volume                          Stream volume 0-1.0 (default %.3f)\n"
 | 
				
			||||||
"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
"%d)\n"
 | 
					"%d)\n"
 | 
				
			||||||
 | 
					"  -a, --raw                             RAW mode\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Force midi format, one of \"midi\" "
 | 
				
			||||||
 | 
					"or \"ump\", (default ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              Stop after COUNT samples\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"      --rate                            Örnekleme oranı (kayıt için gerekli) "
 | 
					"      --rate                            Örnekleme oranı (kayıt için gerekli) "
 | 
				
			||||||
| 
						 | 
					@ -156,15 +165,21 @@ msgstr ""
 | 
				
			||||||
"%.3f)\n"
 | 
					"%.3f)\n"
 | 
				
			||||||
"  -q  --quality                         Yeniden örnekleyici kalitesi (0 - "
 | 
					"  -q  --quality                         Yeniden örnekleyici kalitesi (0 - "
 | 
				
			||||||
"15) (öntanımlı %d)\n"
 | 
					"15) (öntanımlı %d)\n"
 | 
				
			||||||
 | 
					"  -a, --raw                             HAM kipi\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Midi biçimini zorla, ikisinden "
 | 
				
			||||||
 | 
					"birisi \"midi\" ya da\"ump\", (öntanımlı ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              COUNT örnekleme sonrası dur\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1033
 | 
					#: src/tools/pw-cat.c:1141
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -p, --playback                        Playback mode\n"
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
"  -r, --record                          Recording mode\n"
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"  -d, --dsd                             DSD mode\n"
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
"  -o, --encoded                         Encoded mode\n"
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx mode\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI clip mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -p, --playback                        Çalma kipi\n"
 | 
					"  -p, --playback                        Çalma kipi\n"
 | 
				
			||||||
| 
						 | 
					@ -172,9 +187,11 @@ msgstr ""
 | 
				
			||||||
"  -m, --midi                            Midi kipi\n"
 | 
					"  -m, --midi                            Midi kipi\n"
 | 
				
			||||||
"  -d, --dsd                             DSD kipi\n"
 | 
					"  -d, --dsd                             DSD kipi\n"
 | 
				
			||||||
"  -o, --encoded                         Kodlanmış kip\n"
 | 
					"  -o, --encoded                         Kodlanmış kip\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx kipi\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI klip kipi\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2252
 | 
					#: src/tools/pw-cli.c:2386
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -193,195 +210,203 @@ msgstr ""
 | 
				
			||||||
"  -r, --remote                          Uzak arka plan programı adı\n"
 | 
					"  -r, --remote                          Uzak arka plan programı adı\n"
 | 
				
			||||||
"  -m, --monitor                         Etkinliği izle\n"
 | 
					"  -m, --monitor                         Etkinliği izle\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:327
 | 
					#: spa/plugins/alsa/acp/acp.c:361
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "Profesyonel Ses"
 | 
					msgstr "Profesyonel Ses"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:488 spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
					#: spa/plugins/alsa/acp/acp.c:537 spa/plugins/alsa/acp/alsa-mixer.c:4699
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1701
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1976
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "Kapalı"
 | 
					msgstr "Kapalı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/acp.c:620
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [ALSA UCM hatası]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2721
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "Giriş"
 | 
					msgstr "Giriş"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2653
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2722
 | 
				
			||||||
msgid "Docking Station Input"
 | 
					msgid "Docking Station Input"
 | 
				
			||||||
msgstr "Yerleştirme İstasyonu Girişi"
 | 
					msgstr "Yerleştirme İstasyonu Girişi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2654
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2723
 | 
				
			||||||
msgid "Docking Station Microphone"
 | 
					msgid "Docking Station Microphone"
 | 
				
			||||||
msgstr "Yerleştirme İstasyonu Mikrofonu"
 | 
					msgstr "Yerleştirme İstasyonu Mikrofonu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2655
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2724
 | 
				
			||||||
msgid "Docking Station Line In"
 | 
					msgid "Docking Station Line In"
 | 
				
			||||||
msgstr "Yerleştirme İstasyonu Hat Girişi"
 | 
					msgstr "Yerleştirme İstasyonu Hat Girişi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2656
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2725
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2747
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2816
 | 
				
			||||||
msgid "Line In"
 | 
					msgid "Line In"
 | 
				
			||||||
msgstr "Hat Girişi"
 | 
					msgstr "Hat Girişi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2726
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2810
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1989
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2374
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "Mikrofon"
 | 
					msgstr "Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2658
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2727
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2742
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2811
 | 
				
			||||||
msgid "Front Microphone"
 | 
					msgid "Front Microphone"
 | 
				
			||||||
msgstr "Ön Mikrofon"
 | 
					msgstr "Ön Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2659
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2728
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2743
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2812
 | 
				
			||||||
msgid "Rear Microphone"
 | 
					msgid "Rear Microphone"
 | 
				
			||||||
msgstr "Arka Mikrofon"
 | 
					msgstr "Arka Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2660
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2729
 | 
				
			||||||
msgid "External Microphone"
 | 
					msgid "External Microphone"
 | 
				
			||||||
msgstr "Harici Mikrofon"
 | 
					msgstr "Harici Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2661
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2730
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2745
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2814
 | 
				
			||||||
msgid "Internal Microphone"
 | 
					msgid "Internal Microphone"
 | 
				
			||||||
msgstr "Dahili Mikrofon"
 | 
					msgstr "Dahili Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2662
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2731
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2748
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2817
 | 
				
			||||||
msgid "Radio"
 | 
					msgid "Radio"
 | 
				
			||||||
msgstr "Radyo"
 | 
					msgstr "Radyo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2663
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2732
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2749
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2818
 | 
				
			||||||
msgid "Video"
 | 
					msgid "Video"
 | 
				
			||||||
msgstr "Video"
 | 
					msgstr "Video"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2664
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2733
 | 
				
			||||||
msgid "Automatic Gain Control"
 | 
					msgid "Automatic Gain Control"
 | 
				
			||||||
msgstr "Otomatik Kazanç Denetimi"
 | 
					msgstr "Otomatik Kazanç Denetimi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2665
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2734
 | 
				
			||||||
msgid "No Automatic Gain Control"
 | 
					msgid "No Automatic Gain Control"
 | 
				
			||||||
msgstr "Otomatik Kazanç Denetimi Yok"
 | 
					msgstr "Otomatik Kazanç Denetimi Yok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2666
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2735
 | 
				
			||||||
msgid "Boost"
 | 
					msgid "Boost"
 | 
				
			||||||
msgstr "Artır"
 | 
					msgstr "Artır"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2667
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2736
 | 
				
			||||||
msgid "No Boost"
 | 
					msgid "No Boost"
 | 
				
			||||||
msgstr "Artırma Yok"
 | 
					msgstr "Artırma Yok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2668
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2737
 | 
				
			||||||
msgid "Amplifier"
 | 
					msgid "Amplifier"
 | 
				
			||||||
msgstr "Yükseltici"
 | 
					msgstr "Yükseltici"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2669
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2738
 | 
				
			||||||
msgid "No Amplifier"
 | 
					msgid "No Amplifier"
 | 
				
			||||||
msgstr "Yükseltici Yok"
 | 
					msgstr "Yükseltici Yok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2670
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2739
 | 
				
			||||||
msgid "Bass Boost"
 | 
					msgid "Bass Boost"
 | 
				
			||||||
msgstr "Bas Artır"
 | 
					msgstr "Bas Artır"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2740
 | 
				
			||||||
msgid "No Bass Boost"
 | 
					msgid "No Bass Boost"
 | 
				
			||||||
msgstr "Bas Artırma Yok"
 | 
					msgstr "Bas Artırma Yok"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1995
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2380
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "Hoparlör"
 | 
					msgstr "Hoparlör"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
					#. Don't call it "headset", the HF one has the mic
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2742
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2820
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2386
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2453
 | 
				
			||||||
msgid "Headphones"
 | 
					msgid "Headphones"
 | 
				
			||||||
msgstr "Kulaklık"
 | 
					msgstr "Kulaklık"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2740
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2809
 | 
				
			||||||
msgid "Analog Input"
 | 
					msgid "Analog Input"
 | 
				
			||||||
msgstr "Analog Giriş"
 | 
					msgstr "Analog Giriş"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2744
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2813
 | 
				
			||||||
msgid "Dock Microphone"
 | 
					msgid "Dock Microphone"
 | 
				
			||||||
msgstr "Yapışık Mikrofon"
 | 
					msgstr "Yapışık Mikrofon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2746
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2815
 | 
				
			||||||
msgid "Headset Microphone"
 | 
					msgid "Headset Microphone"
 | 
				
			||||||
msgstr "Mikrofonlu Kulaklık"
 | 
					msgstr "Mikrofonlu Kulaklık"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2750
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2819
 | 
				
			||||||
msgid "Analog Output"
 | 
					msgid "Analog Output"
 | 
				
			||||||
msgstr "Analog Çıkış"
 | 
					msgstr "Analog Çıkış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2752
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2821
 | 
				
			||||||
msgid "Headphones 2"
 | 
					msgid "Headphones 2"
 | 
				
			||||||
msgstr "Kulaklık 2"
 | 
					msgstr "Kulaklık 2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2753
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2822
 | 
				
			||||||
msgid "Headphones Mono Output"
 | 
					msgid "Headphones Mono Output"
 | 
				
			||||||
msgstr "Kulaklık Tek Kanallı Çıkış"
 | 
					msgstr "Kulaklık Tek Kanallı Çıkış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2754
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2823
 | 
				
			||||||
msgid "Line Out"
 | 
					msgid "Line Out"
 | 
				
			||||||
msgstr "Hat Çıkışı"
 | 
					msgstr "Hat Çıkışı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2755
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2824
 | 
				
			||||||
msgid "Analog Mono Output"
 | 
					msgid "Analog Mono Output"
 | 
				
			||||||
msgstr "Analog Tek Kanallı Çıkış"
 | 
					msgstr "Analog Tek Kanallı Çıkış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2756
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2825
 | 
				
			||||||
msgid "Speakers"
 | 
					msgid "Speakers"
 | 
				
			||||||
msgstr "Hoparlörler"
 | 
					msgstr "Hoparlörler"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2757
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2826
 | 
				
			||||||
msgid "HDMI / DisplayPort"
 | 
					msgid "HDMI / DisplayPort"
 | 
				
			||||||
msgstr "HDMI / DisplayPort"
 | 
					msgstr "HDMI / DisplayPort"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2758
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2827
 | 
				
			||||||
msgid "Digital Output (S/PDIF)"
 | 
					msgid "Digital Output (S/PDIF)"
 | 
				
			||||||
msgstr "Sayısal Çıkış (S/PDIF)"
 | 
					msgstr "Sayısal Çıkış (S/PDIF)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2759
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2828
 | 
				
			||||||
msgid "Digital Input (S/PDIF)"
 | 
					msgid "Digital Input (S/PDIF)"
 | 
				
			||||||
msgstr "Sayısal Giriş (S/PDIF)"
 | 
					msgstr "Sayısal Giriş (S/PDIF)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2760
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2829
 | 
				
			||||||
msgid "Multichannel Input"
 | 
					msgid "Multichannel Input"
 | 
				
			||||||
msgstr "Çok Kanallı Giriş"
 | 
					msgstr "Çok Kanallı Giriş"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2761
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2830
 | 
				
			||||||
msgid "Multichannel Output"
 | 
					msgid "Multichannel Output"
 | 
				
			||||||
msgstr "Çok Kanallı Çıkış"
 | 
					msgstr "Çok Kanallı Çıkış"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2762
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2831
 | 
				
			||||||
msgid "Game Output"
 | 
					msgid "Game Output"
 | 
				
			||||||
msgstr "Oyun Çıkışı"
 | 
					msgstr "Oyun Çıkışı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2763
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2832
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2764
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2833
 | 
				
			||||||
msgid "Chat Output"
 | 
					msgid "Chat Output"
 | 
				
			||||||
msgstr "Sohbet Çıkışı"
 | 
					msgstr "Sohbet Çıkışı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2765
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2834
 | 
				
			||||||
msgid "Chat Input"
 | 
					msgid "Chat Input"
 | 
				
			||||||
msgstr "Sohbet Girişi"
 | 
					msgstr "Sohbet Girişi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2766
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2835
 | 
				
			||||||
msgid "Virtual Surround 7.1"
 | 
					msgid "Virtual Surround 7.1"
 | 
				
			||||||
msgstr "Sanal Çevresel Ses 7.1"
 | 
					msgstr "Sanal Çevresel Ses 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4456
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4522
 | 
				
			||||||
msgid "Analog Mono"
 | 
					msgid "Analog Mono"
 | 
				
			||||||
msgstr "Analog Tek Kanallı"
 | 
					msgstr "Analog Tek Kanallı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4457
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4523
 | 
				
			||||||
msgid "Analog Mono (Left)"
 | 
					msgid "Analog Mono (Left)"
 | 
				
			||||||
msgstr "Analog Tek Kanallı (Sol)"
 | 
					msgstr "Analog Tek Kanallı (Sol)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4524
 | 
				
			||||||
msgid "Analog Mono (Right)"
 | 
					msgid "Analog Mono (Right)"
 | 
				
			||||||
msgstr "Analog Tek Kanallı (Sağ)"
 | 
					msgstr "Analog Tek Kanallı (Sağ)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -390,147 +415,147 @@ msgstr "Analog Tek Kanallı (Sağ)"
 | 
				
			||||||
#. * here would lead to the source name to become "Analog Stereo Input
 | 
					#. * here would lead to the source name to become "Analog Stereo Input
 | 
				
			||||||
#. * Input". The same logic applies to analog-stereo-output,
 | 
					#. * Input". The same logic applies to analog-stereo-output,
 | 
				
			||||||
#. * multichannel-input and multichannel-output.
 | 
					#. * multichannel-input and multichannel-output.
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4525
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4467
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4533
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4468
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4534
 | 
				
			||||||
msgid "Analog Stereo"
 | 
					msgid "Analog Stereo"
 | 
				
			||||||
msgstr "Analog Stereo"
 | 
					msgstr "Analog Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4526
 | 
				
			||||||
msgid "Mono"
 | 
					msgid "Mono"
 | 
				
			||||||
msgstr "Tek Kanallı"
 | 
					msgstr "Tek Kanallı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4527
 | 
				
			||||||
msgid "Stereo"
 | 
					msgid "Stereo"
 | 
				
			||||||
msgstr "Stereo"
 | 
					msgstr "Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4535
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4693
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1977
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2362
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "Kulaklık"
 | 
					msgstr "Kulaklık"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4536
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4694
 | 
				
			||||||
msgid "Speakerphone"
 | 
					msgid "Speakerphone"
 | 
				
			||||||
msgstr "Hoparlör"
 | 
					msgstr "Hoparlör"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4537
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4538
 | 
				
			||||||
msgid "Multichannel"
 | 
					msgid "Multichannel"
 | 
				
			||||||
msgstr "Çok kanallı"
 | 
					msgstr "Çok kanallı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4539
 | 
				
			||||||
msgid "Analog Surround 2.1"
 | 
					msgid "Analog Surround 2.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 2.1"
 | 
					msgstr "Analog Çevresel Ses 2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4540
 | 
				
			||||||
msgid "Analog Surround 3.0"
 | 
					msgid "Analog Surround 3.0"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 3.0"
 | 
					msgstr "Analog Çevresel Ses 3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4541
 | 
				
			||||||
msgid "Analog Surround 3.1"
 | 
					msgid "Analog Surround 3.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 3.1"
 | 
					msgstr "Analog Çevresel Ses 3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4542
 | 
				
			||||||
msgid "Analog Surround 4.0"
 | 
					msgid "Analog Surround 4.0"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 4.0"
 | 
					msgstr "Analog Çevresel Ses 4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4543
 | 
				
			||||||
msgid "Analog Surround 4.1"
 | 
					msgid "Analog Surround 4.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 4.1"
 | 
					msgstr "Analog Çevresel Ses 4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4544
 | 
				
			||||||
msgid "Analog Surround 5.0"
 | 
					msgid "Analog Surround 5.0"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 5.0"
 | 
					msgstr "Analog Çevresel Ses 5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4545
 | 
				
			||||||
msgid "Analog Surround 5.1"
 | 
					msgid "Analog Surround 5.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 5.1"
 | 
					msgstr "Analog Çevresel Ses 5.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4546
 | 
				
			||||||
msgid "Analog Surround 6.0"
 | 
					msgid "Analog Surround 6.0"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 6.0"
 | 
					msgstr "Analog Çevresel Ses 6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4547
 | 
				
			||||||
msgid "Analog Surround 6.1"
 | 
					msgid "Analog Surround 6.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 6.1"
 | 
					msgstr "Analog Çevresel Ses 6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4548
 | 
				
			||||||
msgid "Analog Surround 7.0"
 | 
					msgid "Analog Surround 7.0"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 7.0"
 | 
					msgstr "Analog Çevresel Ses 7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4549
 | 
				
			||||||
msgid "Analog Surround 7.1"
 | 
					msgid "Analog Surround 7.1"
 | 
				
			||||||
msgstr "Analog Çevresel Ses 7.1"
 | 
					msgstr "Analog Çevresel Ses 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4550
 | 
				
			||||||
msgid "Digital Stereo (IEC958)"
 | 
					msgid "Digital Stereo (IEC958)"
 | 
				
			||||||
msgstr "Sayısal Stereo (IEC958)"
 | 
					msgstr "Sayısal Stereo (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4551
 | 
				
			||||||
msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
					msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Sayısal Çevresel Ses 4.0 (IEC958/AC3)"
 | 
					msgstr "Sayısal Çevresel Ses 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4552
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
					msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
msgstr "Sayısal Çevresel Ses 5.1 (IEC958/AC3)"
 | 
					msgstr "Sayısal Çevresel Ses 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4553
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
					msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
msgstr "Sayısal Çevresel Ses 5.1 (IEC958/DTS)"
 | 
					msgstr "Sayısal Çevresel Ses 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4554
 | 
				
			||||||
msgid "Digital Stereo (HDMI)"
 | 
					msgid "Digital Stereo (HDMI)"
 | 
				
			||||||
msgstr "Sayısal Stereo (HDMI)"
 | 
					msgstr "Sayısal Stereo (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4555
 | 
				
			||||||
msgid "Digital Surround 5.1 (HDMI)"
 | 
					msgid "Digital Surround 5.1 (HDMI)"
 | 
				
			||||||
msgstr "Sayısal Çevresel Ses 5.1 (HDMI)"
 | 
					msgstr "Sayısal Çevresel Ses 5.1 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4556
 | 
				
			||||||
msgid "Chat"
 | 
					msgid "Chat"
 | 
				
			||||||
msgstr "Sohbet"
 | 
					msgstr "Sohbet"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4557
 | 
				
			||||||
msgid "Game"
 | 
					msgid "Game"
 | 
				
			||||||
msgstr "Oyun"
 | 
					msgstr "Oyun"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4625
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4691
 | 
				
			||||||
msgid "Analog Mono Duplex"
 | 
					msgid "Analog Mono Duplex"
 | 
				
			||||||
msgstr "Analog Tek Kanallı İkili"
 | 
					msgstr "Analog Tek Kanallı İkili"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4626
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4692
 | 
				
			||||||
msgid "Analog Stereo Duplex"
 | 
					msgid "Analog Stereo Duplex"
 | 
				
			||||||
msgstr "Analog İkili Stereo"
 | 
					msgstr "Analog İkili Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4695
 | 
				
			||||||
msgid "Digital Stereo Duplex (IEC958)"
 | 
					msgid "Digital Stereo Duplex (IEC958)"
 | 
				
			||||||
msgstr "Sayısal İkili Stereo (IEC958)"
 | 
					msgstr "Sayısal İkili Stereo (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4696
 | 
				
			||||||
msgid "Multichannel Duplex"
 | 
					msgid "Multichannel Duplex"
 | 
				
			||||||
msgstr "Çok Kanallı İkili"
 | 
					msgstr "Çok Kanallı İkili"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4697
 | 
				
			||||||
msgid "Stereo Duplex"
 | 
					msgid "Stereo Duplex"
 | 
				
			||||||
msgstr "İkili Stereo"
 | 
					msgstr "İkili Stereo"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4698
 | 
				
			||||||
msgid "Mono Chat + 7.1 Surround"
 | 
					msgid "Mono Chat + 7.1 Surround"
 | 
				
			||||||
msgstr "Tek Kanallı Sohbet + 7.1 Çevresel Ses"
 | 
					msgstr "Tek Kanallı Sohbet + 7.1 Çevresel Ses"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4799
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "%s Çıkışı"
 | 
					msgstr "%s Çıkışı"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4807
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "%s Girişi"
 | 
					msgstr "%s Girişi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1220 spa/plugins/alsa/acp/alsa-util.c:1314
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1233 spa/plugins/alsa/acp/alsa-util.c:1327
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
				
			||||||
| 
						 | 
					@ -547,16 +572,16 @@ msgstr[0] ""
 | 
				
			||||||
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
					"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
				
			||||||
"geliştiricilerine bildirin."
 | 
					"geliştiricilerine bildirin."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1286
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgid_plural ""
 | 
					msgid_plural ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li bytes "
 | 
				
			||||||
"%lu ms).\n"
 | 
					"(%s%lu ms).\n"
 | 
				
			||||||
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
					"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 | 
				
			||||||
"to the ALSA developers."
 | 
					"to the ALSA developers."
 | 
				
			||||||
msgstr[0] ""
 | 
					msgstr[0] ""
 | 
				
			||||||
| 
						 | 
					@ -564,7 +589,7 @@ msgstr[0] ""
 | 
				
			||||||
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
					"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
				
			||||||
"geliştiricilerine bildirin."
 | 
					"geliştiricilerine bildirin."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1333
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1346
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
					"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
				
			||||||
| 
						 | 
					@ -577,7 +602,7 @@ msgstr ""
 | 
				
			||||||
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
					"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
				
			||||||
"geliştiricilerine bildirin."
 | 
					"geliştiricilerine bildirin."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1376
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1389
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
				
			||||||
| 
						 | 
					@ -595,112 +620,112 @@ msgstr[0] ""
 | 
				
			||||||
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
					"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
 | 
				
			||||||
"geliştiricilerine bildirin."
 | 
					"geliştiricilerine bildirin."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/channelmap.h:457
 | 
					#: spa/plugins/alsa/acp/channelmap.h:460
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
msgstr "(geçersiz)"
 | 
					msgstr "(geçersiz)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:193
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "Dahili Ses"
 | 
					msgstr "Dahili Ses"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:198
 | 
					#: spa/plugins/alsa/acp/compat.c:199
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "Modem"
 | 
					msgstr "Modem"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1712
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1987
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "Ses Geçidi (A2DP Kaynak & HSP/HFP AG)"
 | 
					msgstr "Ses Geçidi (A2DP Kaynak & HSP/HFP AG)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1760
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2016
 | 
				
			||||||
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
 | 
					msgstr "İşitme Aygıtları İçin Ses Akışı (ASHA Alıcı)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2059
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı, çözücü %s)"
 | 
					msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1763
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2062
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı, çözücü %s)"
 | 
					msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1771
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı)"
 | 
					msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1773
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2072
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı)"
 | 
					msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1823
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2146
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Çalma (BAP Alıcı, çözücü %s)"
 | 
					msgstr "Yüksek Kaliteli Çalma (BAP Alıcı, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1828
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2151
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Giriş (BAP Kaynak, çözücü %s)"
 | 
					msgstr "Yüksek Kaliteli Giriş (BAP Kaynak, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1832
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2155
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli İkili (BAP Kaynak/Alıcı, çözücü %s)"
 | 
					msgstr "Yüksek Kaliteli İkili (BAP Kaynak/Alıcı, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1841
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2164
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Çalma (BAP Alıcı)"
 | 
					msgstr "Yüksek Kaliteli Çalma (BAP Alıcı)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1845
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2168
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli Giriş (BAP Kaynak)"
 | 
					msgstr "Yüksek Kaliteli Giriş (BAP Kaynak)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1848
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2171
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "Yüksek Kaliteli İkili (BAP Kaynak/Alıcı)"
 | 
					msgstr "Yüksek Kaliteli İkili (BAP Kaynak/Alıcı)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1897
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2211
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "Kulaklık Ana Birimi (HSP/HFP, çözücü %s)"
 | 
					msgstr "Kulaklık Ana Birimi (HSP/HFP, çözücü %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1978
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2363
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1983
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2368
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1990
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2375
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1996
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2381
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2002
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2387
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2008
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2393
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2399
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2020
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2405
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2026
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2411
 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "Ahizesiz"
 | 
					msgstr "Ahizesiz"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1984
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2369
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "Ahizesiz (HFP)"
 | 
					msgstr "Ahizesiz (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2001
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2392
 | 
				
			||||||
msgid "Headphone"
 | 
					 | 
				
			||||||
msgstr "Kulaklık"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2007
 | 
					 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "Taşınabilir"
 | 
					msgstr "Taşınabilir"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2013
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2398
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "Araba"
 | 
					msgstr "Araba"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2019
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2404
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "Yüksek Kalite"
 | 
					msgstr "Yüksek Kalite"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2025
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2410
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "Telefon"
 | 
					msgstr "Telefon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2032
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2417
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "Bluetooth"
 | 
					msgstr "Bluetooth"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2033
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2418
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "Bluetooth (HFP)"
 | 
					msgstr "Bluetooth (HFP)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										225
									
								
								po/zh_CN.po
									
										
									
									
									
								
							
							
						
						
									
										225
									
								
								po/zh_CN.po
									
										
									
									
									
								
							| 
						 | 
					@ -6,15 +6,15 @@
 | 
				
			||||||
# Cheng-Chia Tseng <pswo10680@gmail.com>, 2010, 2012.
 | 
					# Cheng-Chia Tseng <pswo10680@gmail.com>, 2010, 2012.
 | 
				
			||||||
# Frank Hill <hxf.prc@gmail.com>, 2015.
 | 
					# Frank Hill <hxf.prc@gmail.com>, 2015.
 | 
				
			||||||
# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2015.
 | 
					# Mingye Wang (Arthur2e5) <arthur200126@gmail.com>, 2015.
 | 
				
			||||||
# lumingzh <lumingzh@qq.com>, 2024.
 | 
					# lumingzh <lumingzh@qq.com>, 2024-2025.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"Project-Id-Version: pipewire.master-tx\n"
 | 
					"Project-Id-Version: pipewire.master-tx\n"
 | 
				
			||||||
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
					"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
 | 
				
			||||||
"issues\n"
 | 
					"issues\n"
 | 
				
			||||||
"POT-Creation-Date: 2024-09-09 16:36+0000\n"
 | 
					"POT-Creation-Date: 2025-09-21 15:33+0000\n"
 | 
				
			||||||
"PO-Revision-Date: 2024-10-08 09:41+0800\n"
 | 
					"PO-Revision-Date: 2025-09-22 08:53+0800\n"
 | 
				
			||||||
"Last-Translator: lumingzh <lumingzh@qq.com>\n"
 | 
					"Last-Translator: lumingzh <lumingzh@qq.com>\n"
 | 
				
			||||||
"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
 | 
					"Language-Team: Chinese (China) <i18n-zh@googlegroups.com>\n"
 | 
				
			||||||
"Language: zh_CN\n"
 | 
					"Language: zh_CN\n"
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ msgstr ""
 | 
				
			||||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
					"Content-Type: text/plain; charset=UTF-8\n"
 | 
				
			||||||
"Content-Transfer-Encoding: 8bit\n"
 | 
					"Content-Transfer-Encoding: 8bit\n"
 | 
				
			||||||
"X-Launchpad-Export-Date: 2016-03-22 13:23+0000\n"
 | 
					"X-Launchpad-Export-Date: 2016-03-22 13:23+0000\n"
 | 
				
			||||||
"X-Generator: Gtranslator 47.0\n"
 | 
					"X-Generator: Gtranslator 49.0\n"
 | 
				
			||||||
"Plural-Forms: nplurals=1; plural=0;\n"
 | 
					"Plural-Forms: nplurals=1; plural=0;\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.c:29
 | 
					#: src/daemon/pipewire.c:29
 | 
				
			||||||
| 
						 | 
					@ -42,11 +42,11 @@ msgstr ""
 | 
				
			||||||
"  -c, --config                          加载配置 (默认 %s)\n"
 | 
					"  -c, --config                          加载配置 (默认 %s)\n"
 | 
				
			||||||
"  -P  --properties                      设置上下文属性\n"
 | 
					"  -P  --properties                      设置上下文属性\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:4
 | 
					#: src/daemon/pipewire.desktop.in:3
 | 
				
			||||||
msgid "PipeWire Media System"
 | 
					msgid "PipeWire Media System"
 | 
				
			||||||
msgstr "PipeWire 多媒体系统"
 | 
					msgstr "PipeWire 多媒体系统"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/daemon/pipewire.desktop.in:5
 | 
					#: src/daemon/pipewire.desktop.in:4
 | 
				
			||||||
msgid "Start the PipeWire Media System"
 | 
					msgid "Start the PipeWire Media System"
 | 
				
			||||||
msgstr "启动 PipeWire 多媒体系统"
 | 
					msgstr "启动 PipeWire 多媒体系统"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,26 +60,26 @@ msgstr "至 %s%s%s 的隧道"
 | 
				
			||||||
msgid "Dummy Output"
 | 
					msgid "Dummy Output"
 | 
				
			||||||
msgstr "虚拟输出"
 | 
					msgstr "虚拟输出"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-pulse-tunnel.c:774
 | 
					#: src/modules/module-pulse-tunnel.c:760
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Tunnel for %s@%s"
 | 
					msgid "Tunnel for %s@%s"
 | 
				
			||||||
msgstr "用于 %s@%s 的隧道"
 | 
					msgstr "用于 %s@%s 的隧道"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:318
 | 
					#: src/modules/module-zeroconf-discover.c:320
 | 
				
			||||||
msgid "Unknown device"
 | 
					msgid "Unknown device"
 | 
				
			||||||
msgstr "未知设备"
 | 
					msgstr "未知设备"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:330
 | 
					#: src/modules/module-zeroconf-discover.c:332
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s@%s"
 | 
					msgid "%s on %s@%s"
 | 
				
			||||||
msgstr "%2$s@%3$s 上的 %1$s"
 | 
					msgstr "%2$s@%3$s 上的 %1$s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/modules/module-zeroconf-discover.c:334
 | 
					#: src/modules/module-zeroconf-discover.c:336
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s on %s"
 | 
					msgid "%s on %s"
 | 
				
			||||||
msgstr "%2$s 上的 %1$s"
 | 
					msgstr "%2$s 上的 %1$s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:996
 | 
					#: src/tools/pw-cat.c:1084
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [<file>|-]\n"
 | 
					"%s [options] [<file>|-]\n"
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ msgstr ""
 | 
				
			||||||
"  -v, --verbose                         输出详细操作\n"
 | 
					"  -v, --verbose                         输出详细操作\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1003
 | 
					#: src/tools/pw-cat.c:1091
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -R, --remote                          Remote daemon name\n"
 | 
					"  -R, --remote                          Remote daemon name\n"
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ msgstr ""
 | 
				
			||||||
"  -P  --properties                      设置节点属性\n"
 | 
					"  -P  --properties                      设置节点属性\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1021
 | 
					#: src/tools/pw-cat.c:1109
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"      --rate                            Sample rate (req. for rec) (default "
 | 
					"      --rate                            Sample rate (req. for rec) (default "
 | 
				
			||||||
| 
						 | 
					@ -144,6 +144,9 @@ msgid ""
 | 
				
			||||||
"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
					"  -q  --quality                         Resampler quality (0 - 15) (default "
 | 
				
			||||||
"%d)\n"
 | 
					"%d)\n"
 | 
				
			||||||
"  -a, --raw                             RAW mode\n"
 | 
					"  -a, --raw                             RAW mode\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      Force midi format, one of \"midi\" "
 | 
				
			||||||
 | 
					"or \"ump\", (default ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              Stop after COUNT samples\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"      --rate                            采样率 (录制模式需要) (默认 %u)\n"
 | 
					"      --rate                            采样率 (录制模式需要) (默认 %u)\n"
 | 
				
			||||||
| 
						 | 
					@ -151,22 +154,27 @@ msgstr ""
 | 
				
			||||||
"      --channel-map                     通道映射\n"
 | 
					"      --channel-map                     通道映射\n"
 | 
				
			||||||
"                                            \"stereo\", \"surround-51\",... "
 | 
					"                                            \"stereo\", \"surround-51\",... "
 | 
				
			||||||
"中的其一或\n"
 | 
					"中的其一或\n"
 | 
				
			||||||
"                                            以\",\"分隔的通道名列表: 如 \"FL,"
 | 
					"                                            以\",\"分隔的通道名列表: 如 "
 | 
				
			||||||
"FR\"\n"
 | 
					"\"FL,FR\"\n"
 | 
				
			||||||
"      --format                          采样格式 %s (录制模式需要) (默认 "
 | 
					"      --format                          采样格式 %s (录制模式需要) (默认 "
 | 
				
			||||||
"%s)\n"
 | 
					"%s)\n"
 | 
				
			||||||
"      --volume                          媒体流音量 0-1.0 (默认 %.3f)\n"
 | 
					"      --volume                          媒体流音量 0-1.0 (默认 %.3f)\n"
 | 
				
			||||||
"  -q  --quality                         重采样质量 (0 - 15) (默认 %d)\n"
 | 
					"  -q  --quality                         重采样质量 (0 - 15) (默认 %d)\n"
 | 
				
			||||||
"  -a, --raw                             原生模式\n"
 | 
					"  -a, --raw                             原生模式\n"
 | 
				
			||||||
 | 
					"  -M, --force-midi                      强制 midi 格式,\"midi\" 或 \"ump\" "
 | 
				
			||||||
 | 
					"其一 (默认 ump)\n"
 | 
				
			||||||
 | 
					"  -n, --sample-count COUNT              计数采样后停止\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cat.c:1039
 | 
					#: src/tools/pw-cat.c:1129
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"  -p, --playback                        Playback mode\n"
 | 
					"  -p, --playback                        Playback mode\n"
 | 
				
			||||||
"  -r, --record                          Recording mode\n"
 | 
					"  -r, --record                          Recording mode\n"
 | 
				
			||||||
"  -m, --midi                            Midi mode\n"
 | 
					"  -m, --midi                            Midi mode\n"
 | 
				
			||||||
"  -d, --dsd                             DSD mode\n"
 | 
					"  -d, --dsd                             DSD mode\n"
 | 
				
			||||||
"  -o, --encoded                         Encoded mode\n"
 | 
					"  -o, --encoded                         Encoded mode\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx mode\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI clip mode\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
msgstr ""
 | 
					msgstr ""
 | 
				
			||||||
"  -p, --playback                        回放模式\n"
 | 
					"  -p, --playback                        回放模式\n"
 | 
				
			||||||
| 
						 | 
					@ -174,9 +182,11 @@ msgstr ""
 | 
				
			||||||
"  -m, --midi                            Midi 模式\n"
 | 
					"  -m, --midi                            Midi 模式\n"
 | 
				
			||||||
"  -d, --dsd                             DSD 模式\n"
 | 
					"  -d, --dsd                             DSD 模式\n"
 | 
				
			||||||
"  -o, --encoded                         编码模式\n"
 | 
					"  -o, --encoded                         编码模式\n"
 | 
				
			||||||
 | 
					"  -s, --sysex                           SysEx 模式\n"
 | 
				
			||||||
 | 
					"  -c, --midi-clip                       MIDI 剪辑模式\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: src/tools/pw-cli.c:2285
 | 
					#: src/tools/pw-cli.c:2386
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"%s [options] [command]\n"
 | 
					"%s [options] [command]\n"
 | 
				
			||||||
| 
						 | 
					@ -194,15 +204,20 @@ msgstr ""
 | 
				
			||||||
"  -m, --monitor                         监视器活动\n"
 | 
					"  -m, --monitor                         监视器活动\n"
 | 
				
			||||||
"\n"
 | 
					"\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:327
 | 
					#: spa/plugins/alsa/acp/acp.c:351
 | 
				
			||||||
msgid "Pro Audio"
 | 
					msgid "Pro Audio"
 | 
				
			||||||
msgstr "专业音频"
 | 
					msgstr "专业音频"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/acp.c:488 spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
					#: spa/plugins/alsa/acp/acp.c:527 spa/plugins/alsa/acp/alsa-mixer.c:4635
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1701
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1974
 | 
				
			||||||
msgid "Off"
 | 
					msgid "Off"
 | 
				
			||||||
msgstr "关"
 | 
					msgstr "关"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/alsa/acp/acp.c:610
 | 
				
			||||||
 | 
					#, c-format
 | 
				
			||||||
 | 
					msgid "%s [ALSA UCM error]"
 | 
				
			||||||
 | 
					msgstr "%s [ALSA UCM 错误]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2652
 | 
				
			||||||
msgid "Input"
 | 
					msgid "Input"
 | 
				
			||||||
msgstr "输入"
 | 
					msgstr "输入"
 | 
				
			||||||
| 
						 | 
					@ -226,7 +241,7 @@ msgstr "输入插孔"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2657
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2741
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1989
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2372
 | 
				
			||||||
msgid "Microphone"
 | 
					msgid "Microphone"
 | 
				
			||||||
msgstr "话筒"
 | 
					msgstr "话筒"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -292,12 +307,15 @@ msgid "No Bass Boost"
 | 
				
			||||||
msgstr "无重低音增强"
 | 
					msgstr "无重低音增强"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2672
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1995
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2378
 | 
				
			||||||
msgid "Speaker"
 | 
					msgid "Speaker"
 | 
				
			||||||
msgstr "扬声器"
 | 
					msgstr "扬声器"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#. Don't call it "headset", the HF one has the mic
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2673
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:2751
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2384
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2451
 | 
				
			||||||
msgid "Headphones"
 | 
					msgid "Headphones"
 | 
				
			||||||
msgstr "模拟耳机"
 | 
					msgstr "模拟耳机"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -374,15 +392,15 @@ msgstr "语音输入"
 | 
				
			||||||
msgid "Virtual Surround 7.1"
 | 
					msgid "Virtual Surround 7.1"
 | 
				
			||||||
msgstr "虚拟环绕 7.1"
 | 
					msgstr "虚拟环绕 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4456
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
				
			||||||
msgid "Analog Mono"
 | 
					msgid "Analog Mono"
 | 
				
			||||||
msgstr "模拟单声道"
 | 
					msgstr "模拟单声道"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4457
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
				
			||||||
msgid "Analog Mono (Left)"
 | 
					msgid "Analog Mono (Left)"
 | 
				
			||||||
msgstr "模拟单声道 (左声道)"
 | 
					msgstr "模拟单声道 (左声道)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4458
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
				
			||||||
msgid "Analog Mono (Right)"
 | 
					msgid "Analog Mono (Right)"
 | 
				
			||||||
msgstr "模拟单声道 (右声道)"
 | 
					msgstr "模拟单声道 (右声道)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -391,147 +409,147 @@ msgstr "模拟单声道 (右声道)"
 | 
				
			||||||
#. * here would lead to the source name to become "Analog Stereo Input
 | 
					#. * here would lead to the source name to become "Analog Stereo Input
 | 
				
			||||||
#. * Input". The same logic applies to analog-stereo-output,
 | 
					#. * Input". The same logic applies to analog-stereo-output,
 | 
				
			||||||
#. * multichannel-input and multichannel-output.
 | 
					#. * multichannel-input and multichannel-output.
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4459
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4467
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4468
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
				
			||||||
msgid "Analog Stereo"
 | 
					msgid "Analog Stereo"
 | 
				
			||||||
msgstr "模拟立体声"
 | 
					msgstr "模拟立体声"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4460
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4462
 | 
				
			||||||
msgid "Mono"
 | 
					msgid "Mono"
 | 
				
			||||||
msgstr "单声道"
 | 
					msgstr "单声道"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4461
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4463
 | 
				
			||||||
msgid "Stereo"
 | 
					msgid "Stereo"
 | 
				
			||||||
msgstr "立体声"
 | 
					msgstr "立体声"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4469
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1977
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2360
 | 
				
			||||||
msgid "Headset"
 | 
					msgid "Headset"
 | 
				
			||||||
msgstr "耳机"
 | 
					msgstr "耳机"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4470
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
				
			||||||
msgid "Speakerphone"
 | 
					msgid "Speakerphone"
 | 
				
			||||||
msgstr "扬声麦克风"
 | 
					msgstr "扬声麦克风"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
				
			||||||
msgid "Multichannel"
 | 
					msgid "Multichannel"
 | 
				
			||||||
msgstr "多声道"
 | 
					msgstr "多声道"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
				
			||||||
msgid "Analog Surround 2.1"
 | 
					msgid "Analog Surround 2.1"
 | 
				
			||||||
msgstr "模拟环绕 2.1"
 | 
					msgstr "模拟环绕 2.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
				
			||||||
msgid "Analog Surround 3.0"
 | 
					msgid "Analog Surround 3.0"
 | 
				
			||||||
msgstr "模拟环绕 3.0"
 | 
					msgstr "模拟环绕 3.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
				
			||||||
msgid "Analog Surround 3.1"
 | 
					msgid "Analog Surround 3.1"
 | 
				
			||||||
msgstr "模拟环绕 3.1"
 | 
					msgstr "模拟环绕 3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
				
			||||||
msgid "Analog Surround 4.0"
 | 
					msgid "Analog Surround 4.0"
 | 
				
			||||||
msgstr "模拟环绕 4.0"
 | 
					msgstr "模拟环绕 4.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4477
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
				
			||||||
msgid "Analog Surround 4.1"
 | 
					msgid "Analog Surround 4.1"
 | 
				
			||||||
msgstr "模拟环绕 4.1"
 | 
					msgstr "模拟环绕 4.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4478
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
				
			||||||
msgid "Analog Surround 5.0"
 | 
					msgid "Analog Surround 5.0"
 | 
				
			||||||
msgstr "模拟环绕 5.0"
 | 
					msgstr "模拟环绕 5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4479
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
				
			||||||
msgid "Analog Surround 5.1"
 | 
					msgid "Analog Surround 5.1"
 | 
				
			||||||
msgstr "模拟环绕 5.1"
 | 
					msgstr "模拟环绕 5.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4480
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
				
			||||||
msgid "Analog Surround 6.0"
 | 
					msgid "Analog Surround 6.0"
 | 
				
			||||||
msgstr "模拟环绕 6.0"
 | 
					msgstr "模拟环绕 6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4481
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
				
			||||||
msgid "Analog Surround 6.1"
 | 
					msgid "Analog Surround 6.1"
 | 
				
			||||||
msgstr "模拟环绕 6.1"
 | 
					msgstr "模拟环绕 6.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
				
			||||||
msgid "Analog Surround 7.0"
 | 
					msgid "Analog Surround 7.0"
 | 
				
			||||||
msgstr "模拟环绕 7.0"
 | 
					msgstr "模拟环绕 7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
				
			||||||
msgid "Analog Surround 7.1"
 | 
					msgid "Analog Surround 7.1"
 | 
				
			||||||
msgstr "模拟环绕 7.1"
 | 
					msgstr "模拟环绕 7.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
				
			||||||
msgid "Digital Stereo (IEC958)"
 | 
					msgid "Digital Stereo (IEC958)"
 | 
				
			||||||
msgstr "数字立体声 (IEC958)"
 | 
					msgstr "数字立体声 (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
				
			||||||
msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
					msgid "Digital Surround 4.0 (IEC958/AC3)"
 | 
				
			||||||
msgstr "数字环绕 4.0 (IEC958/AC3)"
 | 
					msgstr "数字环绕 4.0 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
					msgid "Digital Surround 5.1 (IEC958/AC3)"
 | 
				
			||||||
msgstr "数字环绕 5.1 (IEC958/AC3)"
 | 
					msgstr "数字环绕 5.1 (IEC958/AC3)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
				
			||||||
msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
					msgid "Digital Surround 5.1 (IEC958/DTS)"
 | 
				
			||||||
msgstr "数字环绕 5.1 (IEC958/DTS)"
 | 
					msgstr "数字环绕 5.1 (IEC958/DTS)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
				
			||||||
msgid "Digital Stereo (HDMI)"
 | 
					msgid "Digital Stereo (HDMI)"
 | 
				
			||||||
msgstr "数字立体声 (HDMI)"
 | 
					msgstr "数字立体声 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
				
			||||||
msgid "Digital Surround 5.1 (HDMI)"
 | 
					msgid "Digital Surround 5.1 (HDMI)"
 | 
				
			||||||
msgstr "数字环绕 5.1 (HDMI)"
 | 
					msgstr "数字环绕 5.1 (HDMI)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4492
 | 
				
			||||||
msgid "Chat"
 | 
					msgid "Chat"
 | 
				
			||||||
msgstr "语音"
 | 
					msgstr "语音"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4493
 | 
				
			||||||
msgid "Game"
 | 
					msgid "Game"
 | 
				
			||||||
msgstr "游戏"
 | 
					msgstr "游戏"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4625
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4627
 | 
				
			||||||
msgid "Analog Mono Duplex"
 | 
					msgid "Analog Mono Duplex"
 | 
				
			||||||
msgstr "模拟单声道双工"
 | 
					msgstr "模拟单声道双工"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4626
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4628
 | 
				
			||||||
msgid "Analog Stereo Duplex"
 | 
					msgid "Analog Stereo Duplex"
 | 
				
			||||||
msgstr "模拟立体声双工"
 | 
					msgstr "模拟立体声双工"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4629
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
				
			||||||
msgid "Digital Stereo Duplex (IEC958)"
 | 
					msgid "Digital Stereo Duplex (IEC958)"
 | 
				
			||||||
msgstr "数字立体声双工 (IEC958)"
 | 
					msgstr "数字立体声双工 (IEC958)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4630
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
				
			||||||
msgid "Multichannel Duplex"
 | 
					msgid "Multichannel Duplex"
 | 
				
			||||||
msgstr "多声道双工"
 | 
					msgstr "多声道双工"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4631
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4633
 | 
				
			||||||
msgid "Stereo Duplex"
 | 
					msgid "Stereo Duplex"
 | 
				
			||||||
msgstr "模拟立体声双工"
 | 
					msgstr "模拟立体声双工"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4632
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4634
 | 
				
			||||||
msgid "Mono Chat + 7.1 Surround"
 | 
					msgid "Mono Chat + 7.1 Surround"
 | 
				
			||||||
msgstr "单声道语音 + 7.1 环绕声"
 | 
					msgstr "单声道语音 + 7.1 环绕声"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4733
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4735
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Output"
 | 
					msgid "%s Output"
 | 
				
			||||||
msgstr "%s 输出"
 | 
					msgstr "%s 输出"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-mixer.c:4741
 | 
					#: spa/plugins/alsa/acp/alsa-mixer.c:4743
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "%s Input"
 | 
					msgid "%s Input"
 | 
				
			||||||
msgstr "%s 输入"
 | 
					msgstr "%s 输入"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1231 spa/plugins/alsa/acp/alsa-util.c:1325
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1233 spa/plugins/alsa/acp/alsa-util.c:1327
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
					"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
 | 
				
			||||||
| 
						 | 
					@ -547,7 +565,7 @@ msgstr[0] ""
 | 
				
			||||||
"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu 毫秒)。\n"
 | 
					"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu 毫秒)。\n"
 | 
				
			||||||
"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
					"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1297
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1299
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
					"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
 | 
				
			||||||
| 
						 | 
					@ -563,7 +581,7 @@ msgstr[0] ""
 | 
				
			||||||
"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu 毫秒)。\n"
 | 
					"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu 毫秒)。\n"
 | 
				
			||||||
"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
					"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1344
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1346
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
					"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
 | 
				
			||||||
| 
						 | 
					@ -574,7 +592,7 @@ msgstr ""
 | 
				
			||||||
"snd_pcm_avail_delay() 返回的值非常很奇怪:延迟 %lu 小于可用 (avail) %lu。\n"
 | 
					"snd_pcm_avail_delay() 返回的值非常很奇怪:延迟 %lu 小于可用 (avail) %lu。\n"
 | 
				
			||||||
"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
					"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/alsa-util.c:1387
 | 
					#: spa/plugins/alsa/acp/alsa-util.c:1389
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid ""
 | 
					msgid ""
 | 
				
			||||||
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
					"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
 | 
				
			||||||
| 
						 | 
					@ -594,111 +612,114 @@ msgstr[0] ""
 | 
				
			||||||
msgid "(invalid)"
 | 
					msgid "(invalid)"
 | 
				
			||||||
msgstr "(无效)"
 | 
					msgstr "(无效)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:193
 | 
					#: spa/plugins/alsa/acp/compat.c:194
 | 
				
			||||||
msgid "Built-in Audio"
 | 
					msgid "Built-in Audio"
 | 
				
			||||||
msgstr "内置音频"
 | 
					msgstr "内置音频"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/alsa/acp/compat.c:198
 | 
					#: spa/plugins/alsa/acp/compat.c:199
 | 
				
			||||||
msgid "Modem"
 | 
					msgid "Modem"
 | 
				
			||||||
msgstr "调制解调器"
 | 
					msgstr "调制解调器"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1712
 | 
					#: spa/plugins/bluez5/bluez5-device.c:1985
 | 
				
			||||||
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
					msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
 | 
				
			||||||
msgstr "音频网关 (A2DP 信源 或 HSP/HFP 网关)"
 | 
					msgstr "音频网关 (A2DP 信源 或 HSP/HFP 网关)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1760
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
				
			||||||
 | 
					msgid "Audio Streaming for Hearing Aids (ASHA Sink)"
 | 
				
			||||||
 | 
					msgstr "助听器音频流 (ASHA 信宿)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2057
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (A2DP Sink, codec %s)"
 | 
				
			||||||
msgstr "高保真回放 (A2DP 信宿, 编码 %s)"
 | 
					msgstr "高保真回放 (A2DP 信宿, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1763
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2060
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "高保真双工 (A2DP 信源/信宿, 编码 %s)"
 | 
					msgstr "高保真双工 (A2DP 信源/信宿, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1771
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2068
 | 
				
			||||||
msgid "High Fidelity Playback (A2DP Sink)"
 | 
					msgid "High Fidelity Playback (A2DP Sink)"
 | 
				
			||||||
msgstr "高保真回放 (A2DP 信宿)"
 | 
					msgstr "高保真回放 (A2DP 信宿)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1773
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2070
 | 
				
			||||||
msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (A2DP Source/Sink)"
 | 
				
			||||||
msgstr "高保真双工 (A2DP 信源/信宿)"
 | 
					msgstr "高保真双工 (A2DP 信源/信宿)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1823
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2144
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
					msgid "High Fidelity Playback (BAP Sink, codec %s)"
 | 
				
			||||||
msgstr "高保真回放 (BAP 信宿, 编码 %s)"
 | 
					msgstr "高保真回放 (BAP 信宿, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1828
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2149
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
					msgid "High Fidelity Input (BAP Source, codec %s)"
 | 
				
			||||||
msgstr "高保真输入 (BAP 信源, 编码 %s)"
 | 
					msgstr "高保真输入 (BAP 信源, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1832
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2153
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
 | 
				
			||||||
msgstr "高保真双工 (BAP 信源/信宿, 编码 %s)"
 | 
					msgstr "高保真双工 (BAP 信源/信宿, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1841
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2162
 | 
				
			||||||
msgid "High Fidelity Playback (BAP Sink)"
 | 
					msgid "High Fidelity Playback (BAP Sink)"
 | 
				
			||||||
msgstr "高保真回放 (BAP 信宿)"
 | 
					msgstr "高保真回放 (BAP 信宿)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1845
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2166
 | 
				
			||||||
msgid "High Fidelity Input (BAP Source)"
 | 
					msgid "High Fidelity Input (BAP Source)"
 | 
				
			||||||
msgstr "高保真输入 (BAP 信源)"
 | 
					msgstr "高保真输入 (BAP 信源)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1848
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2169
 | 
				
			||||||
msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
					msgid "High Fidelity Duplex (BAP Source/Sink)"
 | 
				
			||||||
msgstr "高保真双工 (BAP 信源/信宿)"
 | 
					msgstr "高保真双工 (BAP 信源/信宿)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1897
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2209
 | 
				
			||||||
#, c-format
 | 
					#, c-format
 | 
				
			||||||
msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
					msgid "Headset Head Unit (HSP/HFP, codec %s)"
 | 
				
			||||||
msgstr "头戴式耳机单元 (HSP/HFP, 编码 %s)"
 | 
					msgstr "头戴式耳机单元 (HSP/HFP, 编码 %s)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1978
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2361
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1983
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2366
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1990
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2373
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1996
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2379
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2002
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2385
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2008
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2391
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2014
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2397
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2020
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2403
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2026
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2409
 | 
				
			||||||
msgid "Handsfree"
 | 
					msgid "Handsfree"
 | 
				
			||||||
msgstr "免手操作"
 | 
					msgstr "免手操作"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:1984
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2367
 | 
				
			||||||
msgid "Handsfree (HFP)"
 | 
					msgid "Handsfree (HFP)"
 | 
				
			||||||
msgstr "免手操作 (HFP)"
 | 
					msgstr "免手操作 (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2001
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2390
 | 
				
			||||||
msgid "Headphone"
 | 
					 | 
				
			||||||
msgstr "头戴耳机"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2007
 | 
					 | 
				
			||||||
msgid "Portable"
 | 
					msgid "Portable"
 | 
				
			||||||
msgstr "便携式"
 | 
					msgstr "便携式"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2013
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2396
 | 
				
			||||||
msgid "Car"
 | 
					msgid "Car"
 | 
				
			||||||
msgstr "车内"
 | 
					msgstr "车内"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2019
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2402
 | 
				
			||||||
msgid "HiFi"
 | 
					msgid "HiFi"
 | 
				
			||||||
msgstr "高保真"
 | 
					msgstr "高保真"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2025
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2408
 | 
				
			||||||
msgid "Phone"
 | 
					msgid "Phone"
 | 
				
			||||||
msgstr "电话"
 | 
					msgstr "电话"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2032
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2415
 | 
				
			||||||
msgid "Bluetooth"
 | 
					msgid "Bluetooth"
 | 
				
			||||||
msgstr "蓝牙"
 | 
					msgstr "蓝牙"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#: spa/plugins/bluez5/bluez5-device.c:2033
 | 
					#: spa/plugins/bluez5/bluez5-device.c:2416
 | 
				
			||||||
msgid "Bluetooth (HFP)"
 | 
					msgid "Bluetooth (HFP)"
 | 
				
			||||||
msgstr "蓝牙 (HFP)"
 | 
					msgstr "蓝牙 (HFP)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#~ msgid "Headphone"
 | 
				
			||||||
 | 
					#~ msgstr "头戴耳机"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#~ msgid "Headset Head Unit (HSP/HFP)"
 | 
					#~ msgid "Headset Head Unit (HSP/HFP)"
 | 
				
			||||||
#~ msgstr "头戴式耳机单元 (HSP/HFP)"
 | 
					#~ msgstr "头戴式耳机单元 (HSP/HFP)"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,7 @@ export ALSA_PLUGIN_DIR="${BUILDDIR}/pipewire-alsa/alsa-plugins"
 | 
				
			||||||
export PW_BUILDDIR=$BUILDDIR
 | 
					export PW_BUILDDIR=$BUILDDIR
 | 
				
			||||||
export PW_UNINSTALLED=1
 | 
					export PW_UNINSTALLED=1
 | 
				
			||||||
export PKG_CONFIG_PATH="${BUILDDIR}/meson-uninstalled/:${PKG_CONFIG_PATH}"
 | 
					export PKG_CONFIG_PATH="${BUILDDIR}/meson-uninstalled/:${PKG_CONFIG_PATH}"
 | 
				
			||||||
 | 
					export PIPEWIRE_LOG_SYSTEMD=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [ -d "${BUILDDIR}/subprojects/wireplumber" ]; then
 | 
					if [ -d "${BUILDDIR}/subprojects/wireplumber" ]; then
 | 
				
			||||||
	# FIXME: find a nice, shell-neutral way to specify a prompt
 | 
						# FIXME: find a nice, shell-neutral way to specify a prompt
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -578,7 +578,7 @@ static int make_nodes(struct data *data)
 | 
				
			||||||
		SPA_PARAM_PORT_CONFIG_direction,	SPA_POD_Id(SPA_DIRECTION_OUTPUT),
 | 
							SPA_PARAM_PORT_CONFIG_direction,	SPA_POD_Id(SPA_DIRECTION_OUTPUT),
 | 
				
			||||||
		SPA_PARAM_PORT_CONFIG_mode,		SPA_POD_Id(SPA_PARAM_PORT_CONFIG_MODE_dsp),
 | 
							SPA_PARAM_PORT_CONFIG_mode,		SPA_POD_Id(SPA_PARAM_PORT_CONFIG_MODE_dsp),
 | 
				
			||||||
		SPA_PARAM_PORT_CONFIG_format,		SPA_POD_Pod(param));
 | 
							SPA_PARAM_PORT_CONFIG_format,		SPA_POD_Pod(param));
 | 
				
			||||||
	if ((res = spa_node_set_param(data->source_node, SPA_PARAM_PortConfig, 0, param) < 0)) {
 | 
						if ((res = spa_node_set_param(data->source_node, SPA_PARAM_PortConfig, 0, param)) < 0) {
 | 
				
			||||||
		printf("can't setup source node %d\n", res);
 | 
							printf("can't setup source node %d\n", res);
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -647,7 +647,7 @@ static int make_nodes(struct data *data)
 | 
				
			||||||
			SPA_PARAM_PORT_CONFIG_format, SPA_POD_Pod(param));
 | 
								SPA_PARAM_PORT_CONFIG_format, SPA_POD_Pod(param));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = spa_node_set_param(data->sink_node, SPA_PARAM_PortConfig, 0, param) < 0)) {
 | 
						if ((res = spa_node_set_param(data->sink_node, SPA_PARAM_PortConfig, 0, param)) < 0) {
 | 
				
			||||||
		printf("can't setup sink node %d\n", res);
 | 
							printf("can't setup sink node %d\n", res);
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -987,7 +987,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setlocale(LC_ALL, "");
 | 
						setlocale(LC_ALL, "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while ((c = getopt_long(argc, argv, "hdmstiac:", long_options, NULL)) != -1) {
 | 
						while ((c = getopt_long(argc, argv, "hd:m:s:t:i:a:c:", long_options, NULL)) != -1) {
 | 
				
			||||||
		switch (c) {
 | 
							switch (c) {
 | 
				
			||||||
		case 'h':
 | 
							case 'h':
 | 
				
			||||||
			show_help(&data, argv[0], false);
 | 
								show_help(&data, argv[0], false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,7 @@
 | 
				
			||||||
#include <SDL2/SDL.h>
 | 
					#include <SDL2/SDL.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/support/plugin.h>
 | 
					#include <spa/support/plugin.h>
 | 
				
			||||||
 | 
					#include <spa/utils/keys.h>
 | 
				
			||||||
#include <spa/utils/names.h>
 | 
					#include <spa/utils/names.h>
 | 
				
			||||||
#include <spa/utils/result.h>
 | 
					#include <spa/utils/result.h>
 | 
				
			||||||
#include <spa/utils/string.h>
 | 
					#include <spa/utils/string.h>
 | 
				
			||||||
| 
						 | 
					@ -83,7 +84,8 @@ struct data {
 | 
				
			||||||
	unsigned int n_buffers;
 | 
						unsigned int n_buffers;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int load_handle(struct data *data, struct spa_handle **handle, const char *lib, const char *name)
 | 
					static int load_handle(struct data *data, struct spa_handle **handle, const char *lib, const char *name,
 | 
				
			||||||
 | 
							       const struct spa_dict *params)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
	void *hnd;
 | 
						void *hnd;
 | 
				
			||||||
| 
						 | 
					@ -117,9 +119,9 @@ static int load_handle(struct data *data, struct spa_handle **handle, const char
 | 
				
			||||||
		if (!spa_streq(factory->name, name))
 | 
							if (!spa_streq(factory->name, name))
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		*handle = calloc(1, spa_handle_factory_get_size(factory, NULL));
 | 
							*handle = calloc(1, spa_handle_factory_get_size(factory, params));
 | 
				
			||||||
		if ((res = spa_handle_factory_init(factory, *handle,
 | 
							if ((res = spa_handle_factory_init(factory, *handle,
 | 
				
			||||||
						NULL, data->support,
 | 
											params, data->support,
 | 
				
			||||||
						data->n_support)) < 0) {
 | 
											data->n_support)) < 0) {
 | 
				
			||||||
			printf("can't make factory instance: %d\n", res);
 | 
								printf("can't make factory instance: %d\n", res);
 | 
				
			||||||
			return res;
 | 
								return res;
 | 
				
			||||||
| 
						 | 
					@ -129,13 +131,14 @@ static int load_handle(struct data *data, struct spa_handle **handle, const char
 | 
				
			||||||
	return -EBADF;
 | 
						return -EBADF;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int make_node(struct data *data, struct spa_node **node, const char *lib, const char *name)
 | 
					static int make_node(struct data *data, struct spa_node **node, const char *lib, const char *name,
 | 
				
			||||||
 | 
							     const struct spa_dict *params)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct spa_handle *handle = NULL;
 | 
						struct spa_handle *handle = NULL;
 | 
				
			||||||
	void *iface;
 | 
						void *iface;
 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = load_handle(data, &handle, lib, name)) < 0)
 | 
						if ((res = load_handle(data, &handle, lib, name, params)) < 0)
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Node, &iface)) < 0) {
 | 
						if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Node, &iface)) < 0) {
 | 
				
			||||||
| 
						 | 
					@ -237,10 +240,13 @@ static int make_nodes(struct data *data, const char *device)
 | 
				
			||||||
	uint8_t buffer[256];
 | 
						uint8_t buffer[256];
 | 
				
			||||||
	uint32_t index;
 | 
						uint32_t index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res =
 | 
						const struct spa_dict_item items[] = {
 | 
				
			||||||
	     make_node(data, &data->source,
 | 
							{ SPA_KEY_API_LIBCAMERA_PATH, device },
 | 
				
			||||||
		     "libcamera/libspa-libcamera.so",
 | 
						};
 | 
				
			||||||
		     SPA_NAME_API_LIBCAMERA_SOURCE)) < 0) {
 | 
					
 | 
				
			||||||
 | 
						if ((res = make_node(data, &data->source,
 | 
				
			||||||
 | 
								     "libcamera/libspa-libcamera.so", SPA_NAME_API_LIBCAMERA_SOURCE,
 | 
				
			||||||
 | 
								     &SPA_DICT_INIT_ARRAY(items))) < 0) {
 | 
				
			||||||
		printf("can't create libcamera-source: %d\n", res);
 | 
							printf("can't create libcamera-source: %d\n", res);
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -254,14 +260,6 @@ static int make_nodes(struct data *data, const char *device)
 | 
				
			||||||
		spa_debug_pod(0, NULL, props);
 | 
							spa_debug_pod(0, NULL, props);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_pod_builder_init(&b, buffer, sizeof(buffer));
 | 
					 | 
				
			||||||
	props = spa_pod_builder_add_object(&b,
 | 
					 | 
				
			||||||
		SPA_TYPE_OBJECT_Props, 0,
 | 
					 | 
				
			||||||
		SPA_PROP_device, SPA_POD_String(device ? device : "/dev/media0"));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ((res = spa_node_set_param(data->source, SPA_PARAM_Props, 0, props)) < 0)
 | 
					 | 
				
			||||||
		printf("got set_props error %d\n", res);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,13 +440,18 @@ int main(int argc, char *argv[])
 | 
				
			||||||
	struct spa_handle *handle = NULL;
 | 
						struct spa_handle *handle = NULL;
 | 
				
			||||||
	void *iface;
 | 
						void *iface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc < 2) {
 | 
				
			||||||
 | 
							printf("usage: %s <camera-id>\n", argv[0]);
 | 
				
			||||||
 | 
							return EXIT_FAILURE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((str = getenv("SPA_PLUGIN_DIR")) == NULL)
 | 
						if ((str = getenv("SPA_PLUGIN_DIR")) == NULL)
 | 
				
			||||||
		str = PLUGINDIR;
 | 
							str = PLUGINDIR;
 | 
				
			||||||
	data.plugin_dir = str;
 | 
						data.plugin_dir = str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = load_handle(&data, &handle,
 | 
						if ((res = load_handle(&data, &handle,
 | 
				
			||||||
					"support/libspa-support.so",
 | 
										"support/libspa-support.so",
 | 
				
			||||||
					SPA_NAME_SUPPORT_SYSTEM)) < 0)
 | 
										SPA_NAME_SUPPORT_SYSTEM, NULL)) < 0)
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_System, &iface)) < 0) {
 | 
						if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_System, &iface)) < 0) {
 | 
				
			||||||
| 
						 | 
					@ -460,7 +463,7 @@ int main(int argc, char *argv[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = load_handle(&data, &handle,
 | 
						if ((res = load_handle(&data, &handle,
 | 
				
			||||||
					"support/libspa-support.so",
 | 
										"support/libspa-support.so",
 | 
				
			||||||
					SPA_NAME_SUPPORT_LOOP)) < 0)
 | 
										SPA_NAME_SUPPORT_LOOP, NULL)) < 0)
 | 
				
			||||||
		return res;
 | 
							return res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Loop, &iface)) < 0) {
 | 
						if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Loop, &iface)) < 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_BUFFER_ALLOC_H
 | 
					#ifndef SPA_BUFFER_ALLOC_H
 | 
				
			||||||
#define SPA_BUFFER_ALLOC_H
 | 
					#define SPA_BUFFER_ALLOC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/buffer/buffer.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/buffer/buffer.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_BUFFER_ALLOC
 | 
					#ifndef SPA_API_BUFFER_ALLOC
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_BUFFER_ALLOC SPA_API_IMPL
 | 
					  #define SPA_API_BUFFER_ALLOC SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -122,7 +122,7 @@ SPA_API_BUFFER_ALLOC int spa_buffer_alloc_fill_info(struct spa_buffer_alloc_info
 | 
				
			||||||
	 *    | |   uint32_t offset            |
 | 
						 *    | |   uint32_t offset            |
 | 
				
			||||||
	 *    | |   uint32_t size              |
 | 
						 *    | |   uint32_t size              |
 | 
				
			||||||
	 *    | |   int32_t stride             |
 | 
						 *    | |   int32_t stride             |
 | 
				
			||||||
	 *    | |   int32_t dummy              |
 | 
						 *    | |   int32_t flags              |
 | 
				
			||||||
	 *    | | ... <n_datas> chunks         |
 | 
						 *    | | ... <n_datas> chunks         |
 | 
				
			||||||
	 *    | +------------------------------+
 | 
						 *    | +------------------------------+
 | 
				
			||||||
	 *    +>| data                         | memory for n_datas data, aligned
 | 
						 *    +>| data                         | memory for n_datas data, aligned
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_BUFFER_H
 | 
					#ifndef SPA_BUFFER_H
 | 
				
			||||||
#define SPA_BUFFER_H
 | 
					#define SPA_BUFFER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/buffer/meta.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/buffer/meta.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_BUFFER
 | 
					#ifndef SPA_API_BUFFER
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_BUFFER SPA_API_IMPL
 | 
					  #define SPA_API_BUFFER SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,17 @@ SPA_API_BUFFER void *spa_buffer_find_meta_data(const struct spa_buffer *b, uint3
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPA_API_BUFFER bool spa_buffer_has_meta_features(const struct spa_buffer *b, uint32_t type, uint32_t features)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t i;
 | 
				
			||||||
 | 
						for (i = 0; i < b->n_metas; i++) {
 | 
				
			||||||
 | 
							uint32_t t = b->metas[i].type;
 | 
				
			||||||
 | 
							if ((t >> 16) == type && (t & features) == features)
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \}
 | 
					 * \}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_META_H
 | 
					#ifndef SPA_META_H
 | 
				
			||||||
#define SPA_META_H
 | 
					#define SPA_META_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/pod/pod.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/pod/pod.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_META
 | 
					#ifndef SPA_API_META
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_META SPA_API_IMPL
 | 
					  #define SPA_API_META SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -37,10 +37,17 @@ enum spa_meta_type {
 | 
				
			||||||
	SPA_META_Busy,			/**< don't write to buffer when count > 0 */
 | 
						SPA_META_Busy,			/**< don't write to buffer when count > 0 */
 | 
				
			||||||
	SPA_META_VideoTransform,	/**< struct spa_meta_transform */
 | 
						SPA_META_VideoTransform,	/**< struct spa_meta_transform */
 | 
				
			||||||
	SPA_META_SyncTimeline,		/**< struct spa_meta_sync_timeline */
 | 
						SPA_META_SyncTimeline,		/**< struct spa_meta_sync_timeline */
 | 
				
			||||||
 | 
					 | 
				
			||||||
	_SPA_META_LAST,			/**< not part of ABI/API */
 | 
						_SPA_META_LAST,			/**< not part of ABI/API */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_META_START_custom		= 0x200,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_META_START_features		= 0x10000,	/* features start, these have 0 size, the
 | 
				
			||||||
 | 
												 * type in the upper 16 bits and a bitmask in
 | 
				
			||||||
 | 
												 * the lower 16 bits with type specific features. */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SPA_META_TYPE_FEATURES(type,features)	(((type)<<16)|(features))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * A metadata element.
 | 
					 * A metadata element.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -183,7 +190,12 @@ struct spa_meta_videotransform {
 | 
				
			||||||
 * this metadata as SPA_PARAM_BUFFERS_metaType when negotiating a buffer
 | 
					 * this metadata as SPA_PARAM_BUFFERS_metaType when negotiating a buffer
 | 
				
			||||||
 * layout with 2 extra fds.
 | 
					 * layout with 2 extra fds.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					#define SPA_META_FEATURE_SYNC_TIMELINE_RELEASE	(1<<0)	/**< metadata supports RELEASE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct spa_meta_sync_timeline {
 | 
					struct spa_meta_sync_timeline {
 | 
				
			||||||
 | 
					#define SPA_META_SYNC_TIMELINE_UNSCHEDULED_RELEASE	(1<<0)	/**< this flag is set by the producer and cleared
 | 
				
			||||||
 | 
													  *  by the consumer when it promises to signal
 | 
				
			||||||
 | 
													  *  the release point */
 | 
				
			||||||
	uint32_t flags;
 | 
						uint32_t flags;
 | 
				
			||||||
	uint32_t padding;
 | 
						uint32_t padding;
 | 
				
			||||||
	uint64_t acquire_point;			/**< the timeline acquire point, this is when the data
 | 
						uint64_t acquire_point;			/**< the timeline acquire point, this is when the data
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,10 @@
 | 
				
			||||||
#ifndef SPA_BUFFER_TYPES_H
 | 
					#ifndef SPA_BUFFER_TYPES_H
 | 
				
			||||||
#define SPA_BUFFER_TYPES_H
 | 
					#define SPA_BUFFER_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/buffer/buffer.h>
 | 
				
			||||||
 | 
					#include <spa/buffer/meta.h>
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_buffer
 | 
					 * \addtogroup spa_buffer
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					@ -14,10 +18,6 @@
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/buffer/buffer.h>
 | 
					 | 
				
			||||||
#include <spa/buffer/meta.h>
 | 
					 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SPA_TYPE_INFO_Buffer			SPA_TYPE_INFO_POINTER_BASE "Buffer"
 | 
					#define SPA_TYPE_INFO_Buffer			SPA_TYPE_INFO_POINTER_BASE "Buffer"
 | 
				
			||||||
#define SPA_TYPE_INFO_BUFFER_BASE		SPA_TYPE_INFO_Buffer ":"
 | 
					#define SPA_TYPE_INFO_BUFFER_BASE		SPA_TYPE_INFO_Buffer ":"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_CONTROL_H
 | 
					#ifndef SPA_CONTROL_H
 | 
				
			||||||
#define SPA_CONTROL_H
 | 
					#define SPA_CONTROL_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/pod/pod.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/pod/pod.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** \defgroup spa_control Control
 | 
					/** \defgroup spa_control Control
 | 
				
			||||||
 * Control type declarations
 | 
					 * Control type declarations
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,10 @@
 | 
				
			||||||
#ifndef SPA_CONTROL_TYPES_H
 | 
					#ifndef SPA_CONTROL_TYPES_H
 | 
				
			||||||
#define SPA_CONTROL_TYPES_H
 | 
					#define SPA_CONTROL_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					#include <spa/control/control.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,10 +18,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
#include <spa/control/control.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* base for parameter object enumerations */
 | 
					/* base for parameter object enumerations */
 | 
				
			||||||
#define SPA_TYPE_INFO_Control		SPA_TYPE_INFO_ENUM_BASE "Control"
 | 
					#define SPA_TYPE_INFO_Control		SPA_TYPE_INFO_ENUM_BASE "Control"
 | 
				
			||||||
#define SPA_TYPE_INFO_CONTROL_BASE		SPA_TYPE_INFO_Control ":"
 | 
					#define SPA_TYPE_INFO_CONTROL_BASE		SPA_TYPE_INFO_Control ":"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,13 +6,13 @@
 | 
				
			||||||
#ifndef SPA_CONTROL_UMP_UTILS_H
 | 
					#ifndef SPA_CONTROL_UMP_UTILS_H
 | 
				
			||||||
#define SPA_CONTROL_UMP_UTILS_H
 | 
					#define SPA_CONTROL_UMP_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <errno.h>
 | 
					 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_CONTROL_UMP_UTILS
 | 
					#ifndef SPA_API_CONTROL_UMP_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_CONTROL_UMP_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_CONTROL_UMP_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -48,72 +48,98 @@ SPA_API_CONTROL_UMP_UTILS size_t spa_ump_message_size(uint8_t message_type)
 | 
				
			||||||
	return ump_sizes[message_type & 0xf];
 | 
						return ump_sizes[message_type & 0xf];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SPA_API_CONTROL_UMP_UTILS int spa_ump_to_midi(uint32_t *ump, size_t ump_size,
 | 
					SPA_API_CONTROL_UMP_UTILS int spa_ump_to_midi(const uint32_t **ump, size_t *ump_size,
 | 
				
			||||||
		uint8_t *midi, size_t midi_maxsize)
 | 
							uint8_t *midi, size_t midi_maxsize, uint64_t *state)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int size = 0;
 | 
						int size = 0;
 | 
				
			||||||
 | 
						uint32_t to_consume = 0;
 | 
				
			||||||
 | 
						const uint32_t *u = *ump;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ump_size < 4)
 | 
						if (*ump_size < 4 ||
 | 
				
			||||||
		return 0;
 | 
						    (to_consume = (spa_ump_message_size(u[0]>>28) * 4)) > *ump_size) {
 | 
				
			||||||
 | 
							to_consume = *ump_size;
 | 
				
			||||||
 | 
							goto done;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if (midi_maxsize < 8)
 | 
						if (midi_maxsize < 8)
 | 
				
			||||||
		return -ENOSPC;
 | 
							return -ENOSPC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (ump[0] >> 28) {
 | 
						switch (u[0] >> 28) {
 | 
				
			||||||
	case 0x1: /* System Real Time and System Common Messages (except System Exclusive) */
 | 
						case 0x1: /* System Real Time and System Common Messages (except System Exclusive) */
 | 
				
			||||||
		midi[size++] = (ump[0] >> 16) & 0xff;
 | 
							midi[size++] = (u[0] >> 16) & 0xff;
 | 
				
			||||||
		if (midi[0] >= 0xf1 && midi[0] <= 0xf3) {
 | 
							if (midi[0] >= 0xf1 && midi[0] <= 0xf3) {
 | 
				
			||||||
			midi[size++] = (ump[0] >> 8) & 0x7f;
 | 
								midi[size++] = (u[0] >> 8) & 0x7f;
 | 
				
			||||||
			if (midi[0] == 0xf2)
 | 
								if (midi[0] == 0xf2)
 | 
				
			||||||
				midi[size++] = ump[0] & 0x7f;
 | 
									midi[size++] = u[0] & 0x7f;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case 0x2: /* MIDI 1.0 Channel Voice Messages */
 | 
						case 0x2: /* MIDI 1.0 Channel Voice Messages */
 | 
				
			||||||
		midi[size++] = (ump[0] >> 16);
 | 
							midi[size++] = (u[0] >> 16);
 | 
				
			||||||
		midi[size++] = (ump[0] >> 8);
 | 
							midi[size++] = (u[0] >> 8);
 | 
				
			||||||
		if (midi[0] < 0xc0 || midi[0] > 0xdf)
 | 
							if (midi[0] < 0xc0 || midi[0] > 0xdf)
 | 
				
			||||||
			midi[size++] = (ump[0]);
 | 
								midi[size++] = (u[0]);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case 0x3: /* Data Messages (including System Exclusive) */
 | 
						case 0x3: /* Data Messages (including System Exclusive) */
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint8_t status, i, bytes;
 | 
							uint8_t status, i, bytes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (ump_size < 8)
 | 
							status = (u[0] >> 20) & 0xf;
 | 
				
			||||||
			return 0;
 | 
							bytes = SPA_CLAMP((u[0] >> 16) & 0xf, 0u, 6u);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		status = (ump[0] >> 20) & 0xf;
 | 
					 | 
				
			||||||
		bytes = SPA_CLAMP((ump[0] >> 16) & 0xf, 0u, 6u);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (status == 0 || status == 1)
 | 
							if (status == 0 || status == 1)
 | 
				
			||||||
			midi[size++] = 0xf0;
 | 
								midi[size++] = 0xf0;
 | 
				
			||||||
		for (i = 0 ; i < bytes; i++)
 | 
							for (i = 0 ; i < bytes; i++)
 | 
				
			||||||
			/* ump[0] >> 8 | ump[0] | ump[1] >> 24 | ump[1] >>16 ... */
 | 
								/* u[0] >> 8 | u[0] | u[1] >> 24 | u[1] >>16 ... */
 | 
				
			||||||
			midi[size++] = ump[(i+2)/4] >> ((5-i)%4 * 8);
 | 
								midi[size++] = u[(i+2)/4] >> ((5-i)%4 * 8);
 | 
				
			||||||
		if (status == 0 || status == 3)
 | 
							if (status == 0 || status == 3)
 | 
				
			||||||
			midi[size++] = 0xf7;
 | 
								midi[size++] = 0xf7;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case 0x4: /* MIDI 2.0 Channel Voice Messages */
 | 
						case 0x4: /* MIDI 2.0 Channel Voice Messages */
 | 
				
			||||||
		if (ump_size < 8)
 | 
						{
 | 
				
			||||||
			return 0;
 | 
							uint8_t status = (u[0] >> 16) | 0x80;
 | 
				
			||||||
		midi[size++] = (ump[0] >> 16) | 0x80;
 | 
							switch (status & 0xf0) {
 | 
				
			||||||
		switch (midi[0] & 0xf0) {
 | 
					 | 
				
			||||||
		case 0xc0:
 | 
							case 0xc0:
 | 
				
			||||||
			midi[size++] = (ump[1] >> 24);
 | 
								/* program/bank change */
 | 
				
			||||||
 | 
								if (!(u[0] & 1))
 | 
				
			||||||
 | 
									*state = 2;
 | 
				
			||||||
 | 
								if (*state == 0) {
 | 
				
			||||||
 | 
									midi[size++] = (status & 0xf) | 0xb0;
 | 
				
			||||||
 | 
									midi[size++] = 0;
 | 
				
			||||||
 | 
									midi[size++] = (u[1] >> 8);
 | 
				
			||||||
 | 
									to_consume = 0;
 | 
				
			||||||
 | 
									*state = 1;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (*state == 1) {
 | 
				
			||||||
 | 
									midi[size++] = (status & 0xf) | 0xb0;
 | 
				
			||||||
 | 
									midi[size++] = 32;
 | 
				
			||||||
 | 
									midi[size++] = u[1];
 | 
				
			||||||
 | 
									to_consume = 0;
 | 
				
			||||||
 | 
									*state = 2;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else if (*state == 2) {
 | 
				
			||||||
 | 
									midi[size++] = status;
 | 
				
			||||||
 | 
									midi[size++] = (u[1] >> 24);
 | 
				
			||||||
 | 
									*state = 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			midi[size++] = (ump[0] >> 8) & 0x7f;
 | 
								midi[size++] = status;
 | 
				
			||||||
 | 
								midi[size++] = (u[0] >> 8) & 0x7f;
 | 
				
			||||||
			SPA_FALLTHROUGH;
 | 
								SPA_FALLTHROUGH;
 | 
				
			||||||
		case 0xd0:
 | 
							case 0xd0:
 | 
				
			||||||
			midi[size++] = (ump[1] >> 25);
 | 
								midi[size++] = (u[1] >> 25);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	case 0x0: /* Utility Messages */
 | 
						case 0x0: /* Utility Messages */
 | 
				
			||||||
	case 0x5: /* Data Messages */
 | 
						case 0x5: /* Data Messages */
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return 0;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					done:
 | 
				
			||||||
 | 
						(*ump_size) -= to_consume;
 | 
				
			||||||
 | 
						(*ump) = SPA_PTROFF(*ump, to_consume, uint32_t);
 | 
				
			||||||
	return size;
 | 
						return size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -197,15 +223,15 @@ SPA_API_CONTROL_UMP_UTILS int spa_ump_from_midi(uint8_t **midi, size_t *midi_siz
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 0xf2:
 | 
							case 0xf2:
 | 
				
			||||||
			to_consume = 3;
 | 
								to_consume = 3;
 | 
				
			||||||
			prefix = 0x10000000;
 | 
								prefix |= 0x10000000;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 0xf1: case 0xf3:
 | 
							case 0xf1: case 0xf3:
 | 
				
			||||||
			to_consume = 2;
 | 
								to_consume = 2;
 | 
				
			||||||
			prefix = 0x10000000;
 | 
								prefix |= 0x10000000;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case 0xf4 ... 0xff:
 | 
							case 0xf4 ... 0xff:
 | 
				
			||||||
			to_consume = 1;
 | 
								to_consume = 1;
 | 
				
			||||||
			prefix = 0x10000000;
 | 
								prefix |= 0x10000000;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return -EIO;
 | 
								return -EIO;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_BUFFER_H
 | 
					#ifndef SPA_DEBUG_BUFFER_H
 | 
				
			||||||
#define SPA_DEBUG_BUFFER_H
 | 
					#define SPA_DEBUG_BUFFER_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					#include <spa/debug/mem.h>
 | 
				
			||||||
 | 
					#include <spa/debug/types.h>
 | 
				
			||||||
 | 
					#include <spa/buffer/type-info.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -18,11 +23,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
#include <spa/debug/mem.h>
 | 
					 | 
				
			||||||
#include <spa/debug/types.h>
 | 
					 | 
				
			||||||
#include <spa/buffer/type-info.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_BUFFER
 | 
					#ifndef SPA_API_DEBUG_BUFFER
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_BUFFER SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_BUFFER SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,15 +5,16 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_CONTEXT_H
 | 
					#ifndef SPA_DEBUG_CONTEXT_H
 | 
				
			||||||
#define SPA_DEBUG_CONTEXT_H
 | 
					#define SPA_DEBUG_CONTEXT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_debug
 | 
					 * \addtogroup spa_debug
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,9 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_DICT_H
 | 
					#ifndef SPA_DEBUG_DICT_H
 | 
				
			||||||
#define SPA_DEBUG_DICT_H
 | 
					#define SPA_DEBUG_DICT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					#include <spa/utils/dict.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,9 +17,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
#include <spa/utils/dict.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_DICT
 | 
					#ifndef SPA_API_DEBUG_DICT
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_DICT SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_DICT SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,6 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_FILE_H
 | 
					#ifndef SPA_DEBUG_FILE_H
 | 
				
			||||||
#define SPA_DEBUG_FILE_H
 | 
					#define SPA_DEBUG_FILE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
| 
						 | 
					@ -21,6 +17,10 @@ extern "C" {
 | 
				
			||||||
#include <spa/debug/mem.h>
 | 
					#include <spa/debug/mem.h>
 | 
				
			||||||
#include <spa/debug/pod.h>
 | 
					#include <spa/debug/pod.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_debug
 | 
					 * \addtogroup spa_debug
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,15 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_FORMAT_H
 | 
					#ifndef SPA_DEBUG_FORMAT_H
 | 
				
			||||||
#define SPA_DEBUG_FORMAT_H
 | 
					#define SPA_DEBUG_FORMAT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/iter.h>
 | 
				
			||||||
 | 
					#include <spa/utils/string.h>
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					#include <spa/debug/types.h>
 | 
				
			||||||
 | 
					#include <spa/param/type-info.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,13 +23,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/utils/string.h>
 | 
					 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
#include <spa/debug/types.h>
 | 
					 | 
				
			||||||
#include <spa/param/type-info.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_FORMAT
 | 
					#ifndef SPA_API_DEBUG_FORMAT
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_FORMAT SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_FORMAT SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -41,10 +43,11 @@ spa_debug_strbuf_format_value(struct spa_strbuf *buffer, const struct spa_type_i
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_Id:
 | 
						case SPA_TYPE_Id:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		const char *str = spa_debug_type_find_short_name(info, *(int32_t *) body);
 | 
							uint32_t value = *(uint32_t *) body;
 | 
				
			||||||
 | 
							const char *str = spa_debug_type_find_short_name(info, value);
 | 
				
			||||||
		char tmp[64];
 | 
							char tmp[64];
 | 
				
			||||||
		if (str == NULL) {
 | 
							if (str == NULL) {
 | 
				
			||||||
			snprintf(tmp, sizeof(tmp), "%d", *(int32_t*)body);
 | 
								snprintf(tmp, sizeof(tmp), "%" PRIu32, value);
 | 
				
			||||||
			str = tmp;
 | 
								str = tmp;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		spa_strbuf_append(buffer, "%s", str);
 | 
							spa_strbuf_append(buffer, "%s", str);
 | 
				
			||||||
| 
						 | 
					@ -63,7 +66,7 @@ spa_debug_strbuf_format_value(struct spa_strbuf *buffer, const struct spa_type_i
 | 
				
			||||||
		spa_strbuf_append(buffer, "%f", *(double *) body);
 | 
							spa_strbuf_append(buffer, "%f", *(double *) body);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_String:
 | 
						case SPA_TYPE_String:
 | 
				
			||||||
		spa_strbuf_append(buffer, "%s", (char *) body);
 | 
							spa_strbuf_append(buffer, "%-*s", size, (char *) body);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_Rectangle:
 | 
						case SPA_TYPE_Rectangle:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -90,11 +93,13 @@ spa_debug_strbuf_format_value(struct spa_strbuf *buffer, const struct spa_type_i
 | 
				
			||||||
		int i = 0;
 | 
							int i = 0;
 | 
				
			||||||
		info = info && info->values ? info->values : info;
 | 
							info = info && info->values ? info->values : info;
 | 
				
			||||||
		spa_strbuf_append(buffer, "< ");
 | 
							spa_strbuf_append(buffer, "< ");
 | 
				
			||||||
 | 
							if (b->child.size >= spa_pod_type_size(b->child.type)) {
 | 
				
			||||||
			SPA_POD_ARRAY_BODY_FOREACH(b, size, p) {
 | 
								SPA_POD_ARRAY_BODY_FOREACH(b, size, p) {
 | 
				
			||||||
				if (i++ > 0)
 | 
									if (i++ > 0)
 | 
				
			||||||
					spa_strbuf_append(buffer, ", ");
 | 
										spa_strbuf_append(buffer, ", ");
 | 
				
			||||||
				spa_debug_strbuf_format_value(buffer, info, b->child.type, p, b->child.size);
 | 
									spa_debug_strbuf_format_value(buffer, info, b->child.type, p, b->child.size);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		spa_strbuf_append(buffer, " >");
 | 
							spa_strbuf_append(buffer, " >");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -128,7 +133,7 @@ SPA_API_DEBUG_FORMAT int spa_debugc_format(struct spa_debug_context *ctx, int in
 | 
				
			||||||
	if (info == NULL)
 | 
						if (info == NULL)
 | 
				
			||||||
		info = spa_type_format;
 | 
							info = spa_type_format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (format == NULL || SPA_POD_TYPE(format) != SPA_TYPE_Object)
 | 
						if (format == NULL || format->type != SPA_TYPE_Object)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (spa_format_parse(format, &mtype, &mstype) < 0)
 | 
						if (spa_format_parse(format, &mtype, &mstype) < 0)
 | 
				
			||||||
| 
						 | 
					@ -158,11 +163,11 @@ SPA_API_DEBUG_FORMAT int spa_debugc_format(struct spa_debug_context *ctx, int in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		type = val->type;
 | 
							type = val->type;
 | 
				
			||||||
		size = val->size;
 | 
							size = val->size;
 | 
				
			||||||
		vals = SPA_POD_BODY(val);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (type < SPA_TYPE_None || type >= _SPA_TYPE_LAST)
 | 
							if (type < SPA_TYPE_None || type >= _SPA_TYPE_LAST || n_vals < 1)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							vals = SPA_POD_BODY(val);
 | 
				
			||||||
		ti = spa_debug_type_find(info, prop->key);
 | 
							ti = spa_debug_type_find(info, prop->key);
 | 
				
			||||||
		key = ti ? ti->name : NULL;
 | 
							key = ti ? ti->name : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,6 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_LOG_H
 | 
					#ifndef SPA_DEBUG_LOG_H
 | 
				
			||||||
#define SPA_DEBUG_LOG_H
 | 
					#define SPA_DEBUG_LOG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +16,10 @@ extern "C" {
 | 
				
			||||||
#include <spa/debug/mem.h>
 | 
					#include <spa/debug/mem.h>
 | 
				
			||||||
#include <spa/debug/pod.h>
 | 
					#include <spa/debug/pod.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SPA_API_DEBUG_LOG
 | 
					#ifndef SPA_API_DEBUG_LOG
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_LOG SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_LOG SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,19 +5,19 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_MEM_H
 | 
					#ifndef SPA_DEBUG_MEM_H
 | 
				
			||||||
#define SPA_DEBUG_MEM_H
 | 
					#define SPA_DEBUG_MEM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <inttypes.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_debug
 | 
					 * \addtogroup spa_debug
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_MEM
 | 
					#ifndef SPA_API_DEBUG_MEM
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_MEM SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_MEM SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,10 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_NODE_H
 | 
					#ifndef SPA_DEBUG_NODE_H
 | 
				
			||||||
#define SPA_DEBUG_NODE_H
 | 
					#define SPA_DEBUG_NODE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/node/node.h>
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					#include <spa/debug/dict.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,10 +18,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/node/node.h>
 | 
					 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
#include <spa/debug/dict.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_NODE
 | 
					#ifndef SPA_API_DEBUG_NODE
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_NODE SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_NODE SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,14 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_POD_H
 | 
					#ifndef SPA_DEBUG_POD_H
 | 
				
			||||||
#define SPA_DEBUG_POD_H
 | 
					#define SPA_DEBUG_POD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <inttypes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/debug/context.h>
 | 
				
			||||||
 | 
					#include <spa/debug/mem.h>
 | 
				
			||||||
 | 
					#include <spa/debug/types.h>
 | 
				
			||||||
 | 
					#include <spa/pod/pod.h>
 | 
				
			||||||
 | 
					#include <spa/pod/iter.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,12 +22,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/debug/context.h>
 | 
					 | 
				
			||||||
#include <spa/debug/mem.h>
 | 
					 | 
				
			||||||
#include <spa/debug/types.h>
 | 
					 | 
				
			||||||
#include <spa/pod/pod.h>
 | 
					 | 
				
			||||||
#include <spa/pod/iter.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_POD
 | 
					#ifndef SPA_API_DEBUG_POD
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_POD SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_POD SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -37,11 +39,11 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Bool %s", indent, "", (*(int32_t *) body) ? "true" : "false");
 | 
							spa_debugc(ctx, "%*s" "Bool %s", indent, "", (*(int32_t *) body) ? "true" : "false");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_Id:
 | 
						case SPA_TYPE_Id:
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Id %-8d (%s)", indent, "", *(int32_t *) body,
 | 
							spa_debugc(ctx, "%*s" "Id %-8" PRIu32 " (%s)", indent, "", *(uint32_t *) body,
 | 
				
			||||||
		       spa_debug_type_find_name(info, *(int32_t *) body));
 | 
							       spa_debug_type_find_name(info, *(uint32_t *) body));
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_Int:
 | 
						case SPA_TYPE_Int:
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Int %d", indent, "", *(int32_t *) body);
 | 
							spa_debugc(ctx, "%*s" "Int %" PRId32, indent, "", *(int32_t *) body);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case SPA_TYPE_Long:
 | 
						case SPA_TYPE_Long:
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Long %" PRIi64 "", indent, "", *(int64_t *) body);
 | 
							spa_debugc(ctx, "%*s" "Long %" PRIi64 "", indent, "", *(int64_t *) body);
 | 
				
			||||||
| 
						 | 
					@ -85,13 +87,18 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
		struct spa_pod_array_body *b = (struct spa_pod_array_body *)body;
 | 
							struct spa_pod_array_body *b = (struct spa_pod_array_body *)body;
 | 
				
			||||||
		void *p;
 | 
							void *p;
 | 
				
			||||||
		const struct spa_type_info *ti = spa_debug_type_find(SPA_TYPE_ROOT, b->child.type);
 | 
							const struct spa_type_info *ti = spa_debug_type_find(SPA_TYPE_ROOT, b->child.type);
 | 
				
			||||||
 | 
							uint32_t min_size = spa_pod_type_size(b->child.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Array: child.size %d, child.type %s", indent, "",
 | 
							spa_debugc(ctx, "%*s" "Array: child.size %" PRIu32 ", child.type %s", indent, "",
 | 
				
			||||||
		       b->child.size, ti ? ti->name : "unknown");
 | 
							       b->child.size, ti ? ti->name : "unknown");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (b->child.size < min_size) {
 | 
				
			||||||
 | 
								spa_debugc(ctx, "%*s" "   INVALID child.size < %" PRIu32, indent, "", min_size);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			info = info && info->values ? info->values : info;
 | 
								info = info && info->values ? info->values : info;
 | 
				
			||||||
			SPA_POD_ARRAY_BODY_FOREACH(b, size, p)
 | 
								SPA_POD_ARRAY_BODY_FOREACH(b, size, p)
 | 
				
			||||||
				spa_debugc_pod_value(ctx, indent + 2, info, b->child.type, p, b->child.size);
 | 
									spa_debugc_pod_value(ctx, indent + 2, info, b->child.type, p, b->child.size);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_TYPE_Choice:
 | 
						case SPA_TYPE_Choice:
 | 
				
			||||||
| 
						 | 
					@ -99,20 +106,31 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
		struct spa_pod_choice_body *b = (struct spa_pod_choice_body *)body;
 | 
							struct spa_pod_choice_body *b = (struct spa_pod_choice_body *)body;
 | 
				
			||||||
		void *p;
 | 
							void *p;
 | 
				
			||||||
		const struct spa_type_info *ti = spa_debug_type_find(spa_type_choice, b->type);
 | 
							const struct spa_type_info *ti = spa_debug_type_find(spa_type_choice, b->type);
 | 
				
			||||||
 | 
							uint32_t min_size = spa_pod_type_size(b->child.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Choice: type %s, flags %08x %d %d", indent, "",
 | 
							spa_debugc(ctx, "%*s" "Choice: type %s, flags %08" PRIx32 " %" PRIu32 " %" PRIu32, indent, "",
 | 
				
			||||||
		       ti ? ti->name : "unknown", b->flags, size, b->child.size);
 | 
							       ti ? ti->name : "unknown", b->flags, size, b->child.size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (b->child.size < min_size) {
 | 
				
			||||||
 | 
								spa_debugc(ctx, "%*s" "INVALID child.size < %" PRIu32, indent, "", min_size);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			SPA_POD_CHOICE_BODY_FOREACH(b, size, p)
 | 
								SPA_POD_CHOICE_BODY_FOREACH(b, size, p)
 | 
				
			||||||
				spa_debugc_pod_value(ctx, indent + 2, info, b->child.type, p, b->child.size);
 | 
									spa_debugc_pod_value(ctx, indent + 2, info, b->child.type, p, b->child.size);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_TYPE_Struct:
 | 
						case SPA_TYPE_Struct:
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		struct spa_pod *b = (struct spa_pod *)body, *p;
 | 
							struct spa_pod *b = (struct spa_pod *)body, *p;
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Struct: size %d", indent, "", size);
 | 
							spa_debugc(ctx, "%*s" "Struct: size %" PRIu32, indent, "", size);
 | 
				
			||||||
		SPA_POD_FOREACH(b, size, p)
 | 
							SPA_POD_FOREACH(b, size, p) {
 | 
				
			||||||
 | 
								uint32_t min_size = spa_pod_type_size(p->type);
 | 
				
			||||||
 | 
								if (p->size < min_size) {
 | 
				
			||||||
 | 
									spa_debugc(ctx, "%*s" "INVALID child.size < %" PRIu32, indent, "", min_size);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
				spa_debugc_pod_value(ctx, indent + 2, info, p->type, SPA_POD_BODY(p), p->size);
 | 
									spa_debugc_pod_value(ctx, indent + 2, info, p->type, SPA_POD_BODY(p), p->size);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_TYPE_Object:
 | 
						case SPA_TYPE_Object:
 | 
				
			||||||
| 
						 | 
					@ -125,22 +143,38 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
		ii = ti ? spa_debug_type_find(ti->values, 0) : NULL;
 | 
							ii = ti ? spa_debug_type_find(ti->values, 0) : NULL;
 | 
				
			||||||
		ii = ii ? spa_debug_type_find(ii->values, b->id) : NULL;
 | 
							ii = ii ? spa_debug_type_find(ii->values, b->id) : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Object: size %d, type %s (%d), id %s (%d)", indent, "", size,
 | 
							spa_debugc(ctx, "%*s" "Object: size %" PRIu32 ", type %s (%" PRIu32 "), id %s (%" PRIu32 ")",
 | 
				
			||||||
		       ti ? ti->name : "unknown", b->type, ii ? ii->name : "unknown", b->id);
 | 
								indent, "", size, ti ? ti->name : "unknown", b->type, ii ? ii->name : "unknown", b->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		info = ti ? ti->values : info;
 | 
							info = ti ? ti->values : info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SPA_POD_OBJECT_BODY_FOREACH(b, size, p) {
 | 
							SPA_POD_OBJECT_BODY_FOREACH(b, size, p) {
 | 
				
			||||||
 | 
								static const char custom_prefix[] = SPA_TYPE_INFO_PROPS_BASE "Custom:";
 | 
				
			||||||
 | 
								char custom_name[sizeof(custom_prefix) + 16];
 | 
				
			||||||
 | 
								const char *name = "unknown";
 | 
				
			||||||
 | 
								uint32_t min_size = spa_pod_type_size(p->value.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ii = spa_debug_type_find(info, p->key);
 | 
								ii = spa_debug_type_find(info, p->key);
 | 
				
			||||||
 | 
								if (ii) {
 | 
				
			||||||
 | 
									name = ii->name;
 | 
				
			||||||
 | 
								} else if (p->key >= SPA_PROP_START_CUSTOM) {
 | 
				
			||||||
 | 
									snprintf(custom_name, sizeof(custom_name),
 | 
				
			||||||
 | 
										 "%s%" PRIu32, custom_prefix, p->key - SPA_PROP_START_CUSTOM);
 | 
				
			||||||
 | 
									name = custom_name;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			spa_debugc(ctx, "%*s" "Prop: key %s (%d), flags %08x", indent+2, "",
 | 
								spa_debugc(ctx, "%*s" "Prop: key %s (%" PRIu32 "), flags %08" PRIx32,
 | 
				
			||||||
					ii ? ii->name : "unknown", p->key, p->flags);
 | 
									indent+2, "", name, p->key, p->flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (p->value.size < min_size) {
 | 
				
			||||||
 | 
									spa_debugc(ctx, "%*s" "INVALID value.size < %" PRIu32, indent, "", min_size);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
				spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
 | 
									spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
 | 
				
			||||||
						p->value.type,
 | 
											p->value.type,
 | 
				
			||||||
						SPA_POD_CONTENTS(struct spa_pod_prop, p),
 | 
											SPA_POD_CONTENTS(struct spa_pod_prop, p),
 | 
				
			||||||
						p->value.size);
 | 
											p->value.size);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_TYPE_Sequence:
 | 
						case SPA_TYPE_Sequence:
 | 
				
			||||||
| 
						 | 
					@ -151,20 +185,26 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ti = spa_debug_type_find(info, b->unit);
 | 
							ti = spa_debug_type_find(info, b->unit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "Sequence: size %d, unit %s", indent, "", size,
 | 
							spa_debugc(ctx, "%*s" "Sequence: size %" PRIu32 ", unit %s", indent, "", size,
 | 
				
			||||||
		       ti ? ti->name : "unknown");
 | 
							       ti ? ti->name : "unknown");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		SPA_POD_SEQUENCE_BODY_FOREACH(b, size, c) {
 | 
							SPA_POD_SEQUENCE_BODY_FOREACH(b, size, c) {
 | 
				
			||||||
 | 
								uint32_t min_size = spa_pod_type_size(c->value.type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			ii = spa_debug_type_find(spa_type_control, c->type);
 | 
								ii = spa_debug_type_find(spa_type_control, c->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			spa_debugc(ctx, "%*s" "Control: offset %d, type %s", indent+2, "",
 | 
								spa_debugc(ctx, "%*s" "Control: offset %" PRIu32 ", type %s", indent+2, "",
 | 
				
			||||||
					c->offset, ii ? ii->name : "unknown");
 | 
										c->offset, ii ? ii->name : "unknown");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (c->value.size < min_size) {
 | 
				
			||||||
 | 
									spa_debugc(ctx, "%*s" "INVALID value.size < %" PRIu32, indent, "", min_size);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
				spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
 | 
									spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
 | 
				
			||||||
						c->value.type,
 | 
											c->value.type,
 | 
				
			||||||
						SPA_POD_CONTENTS(struct spa_pod_control, c),
 | 
											SPA_POD_CONTENTS(struct spa_pod_control, c),
 | 
				
			||||||
						c->value.size);
 | 
											c->value.size);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	case SPA_TYPE_Bytes:
 | 
						case SPA_TYPE_Bytes:
 | 
				
			||||||
| 
						 | 
					@ -176,7 +216,7 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
		spa_debugc_mem(ctx, indent + 2, body, size);
 | 
							spa_debugc_mem(ctx, indent + 2, body, size);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		spa_debugc(ctx, "%*s" "unhandled POD type %d", indent, "", type);
 | 
							spa_debugc(ctx, "%*s" "unhandled POD type %" PRIu32, indent, "", type);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -185,10 +225,10 @@ spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa
 | 
				
			||||||
SPA_API_DEBUG_POD int spa_debugc_pod(struct spa_debug_context *ctx, int indent,
 | 
					SPA_API_DEBUG_POD int spa_debugc_pod(struct spa_debug_context *ctx, int indent,
 | 
				
			||||||
		const struct spa_type_info *info, const struct spa_pod *pod)
 | 
							const struct spa_type_info *info, const struct spa_pod *pod)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if (pod->size < spa_pod_type_size(pod->type))
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
	return spa_debugc_pod_value(ctx, indent, info ? info : SPA_TYPE_ROOT,
 | 
						return spa_debugc_pod_value(ctx, indent, info ? info : SPA_TYPE_ROOT,
 | 
				
			||||||
			SPA_POD_TYPE(pod),
 | 
							                    pod->type, SPA_POD_BODY(pod), pod->size);
 | 
				
			||||||
			SPA_POD_BODY(pod),
 | 
					 | 
				
			||||||
			SPA_POD_BODY_SIZE(pod));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SPA_API_DEBUG_POD int
 | 
					SPA_API_DEBUG_POD int
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,10 @@
 | 
				
			||||||
#ifndef SPA_DEBUG_TYPES_H
 | 
					#ifndef SPA_DEBUG_TYPES_H
 | 
				
			||||||
#define SPA_DEBUG_TYPES_H
 | 
					#define SPA_DEBUG_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/type-info.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,10 +18,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/type-info.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <string.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEBUG_TYPES
 | 
					#ifndef SPA_API_DEBUG_TYPES
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEBUG_TYPES SPA_API_IMPL
 | 
					  #define SPA_API_DEBUG_TYPES SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,16 +5,16 @@
 | 
				
			||||||
#ifndef SPA_FILTER_GRAPH_H
 | 
					#ifndef SPA_FILTER_GRAPH_H
 | 
				
			||||||
#define SPA_FILTER_GRAPH_H
 | 
					#define SPA_FILTER_GRAPH_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <sys/types.h>
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
#include <spa/utils/hook.h>
 | 
					#include <spa/utils/hook.h>
 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SPA_API_FILTER_GRAPH
 | 
					#ifndef SPA_API_FILTER_GRAPH
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_FILTER_GRAPH SPA_API_IMPL
 | 
					  #define SPA_API_FILTER_GRAPH SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,13 @@
 | 
				
			||||||
#ifndef SPA_GRAPH_H
 | 
					#ifndef SPA_GRAPH_H
 | 
				
			||||||
#define SPA_GRAPH_H
 | 
					#define SPA_GRAPH_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/atomic.h>
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/utils/list.h>
 | 
				
			||||||
 | 
					#include <spa/utils/hook.h>
 | 
				
			||||||
 | 
					#include <spa/node/node.h>
 | 
				
			||||||
 | 
					#include <spa/node/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -18,13 +25,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/atomic.h>
 | 
					 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/utils/list.h>
 | 
					 | 
				
			||||||
#include <spa/utils/hook.h>
 | 
					 | 
				
			||||||
#include <spa/node/node.h>
 | 
					 | 
				
			||||||
#include <spa/node/io.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_GRAPH
 | 
					#ifndef SPA_API_GRAPH
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_GRAPH SPA_API_IMPL
 | 
					  #define SPA_API_GRAPH SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,15 +5,15 @@
 | 
				
			||||||
#ifndef SPA_DEVICE_H
 | 
					#ifndef SPA_DEVICE_H
 | 
				
			||||||
#define SPA_DEVICE_H
 | 
					#define SPA_DEVICE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
#include <spa/utils/hook.h>
 | 
					#include <spa/utils/hook.h>
 | 
				
			||||||
#include <spa/utils/dict.h>
 | 
					#include <spa/utils/dict.h>
 | 
				
			||||||
#include <spa/pod/event.h>
 | 
					#include <spa/pod/event.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SPA_API_DEVICE
 | 
					#ifndef SPA_API_DEVICE
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEVICE SPA_API_IMPL
 | 
					  #define SPA_API_DEVICE SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_EVENT_DEVICE_H
 | 
					#ifndef SPA_EVENT_DEVICE_H
 | 
				
			||||||
#define SPA_EVENT_DEVICE_H
 | 
					#define SPA_EVENT_DEVICE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/event.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/event.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_device
 | 
					 * \addtogroup spa_device
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,14 +5,14 @@
 | 
				
			||||||
#ifndef SPA_DEVICE_TYPE_INFO_H
 | 
					#ifndef SPA_DEVICE_TYPE_INFO_H
 | 
				
			||||||
#define SPA_DEVICE_TYPE_INFO_H
 | 
					#define SPA_DEVICE_TYPE_INFO_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <spa/utils/type-info.h>
 | 
					#include <spa/utils/type-info.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/monitor/event.h>
 | 
					#include <spa/monitor/event.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_device
 | 
					 * \addtogroup spa_device
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_DEVICE_UTILS_H
 | 
					#ifndef SPA_DEVICE_UTILS_H
 | 
				
			||||||
#define SPA_DEVICE_UTILS_H
 | 
					#define SPA_DEVICE_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/monitor/device.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/monitor/device.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_DEVICE_UTILS
 | 
					#ifndef SPA_API_DEVICE_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_DEVICE_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_DEVICE_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,8 @@
 | 
				
			||||||
#ifndef SPA_COMMAND_NODE_H
 | 
					#ifndef SPA_COMMAND_NODE_H
 | 
				
			||||||
#define SPA_COMMAND_NODE_H
 | 
					#define SPA_COMMAND_NODE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/command.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,8 +16,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/command.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* object id of SPA_TYPE_COMMAND_Node */
 | 
					/* object id of SPA_TYPE_COMMAND_Node */
 | 
				
			||||||
enum spa_node_command {
 | 
					enum spa_node_command {
 | 
				
			||||||
	SPA_NODE_COMMAND_Suspend,	/**< suspend a node, this removes all configured
 | 
						SPA_NODE_COMMAND_Suspend,	/**< suspend a node, this removes all configured
 | 
				
			||||||
| 
						 | 
					@ -36,12 +36,24 @@ enum spa_node_command {
 | 
				
			||||||
	SPA_NODE_COMMAND_ParamEnd,	/**< end a transaction */
 | 
						SPA_NODE_COMMAND_ParamEnd,	/**< end a transaction */
 | 
				
			||||||
	SPA_NODE_COMMAND_RequestProcess,/**< Sent to a driver when some other node emitted
 | 
						SPA_NODE_COMMAND_RequestProcess,/**< Sent to a driver when some other node emitted
 | 
				
			||||||
					  *  the RequestProcess event. */
 | 
										  *  the RequestProcess event. */
 | 
				
			||||||
 | 
						SPA_NODE_COMMAND_User,		/**< User defined command */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPA_NODE_COMMAND_ID(cmd)	SPA_COMMAND_ID(cmd, SPA_TYPE_COMMAND_Node)
 | 
					#define SPA_NODE_COMMAND_ID(cmd)	SPA_COMMAND_ID(cmd, SPA_TYPE_COMMAND_Node)
 | 
				
			||||||
#define SPA_NODE_COMMAND_INIT(id)	SPA_COMMAND_INIT(SPA_TYPE_COMMAND_Node, id)
 | 
					#define SPA_NODE_COMMAND_INIT(id)	SPA_COMMAND_INIT(SPA_TYPE_COMMAND_Node, id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* properties for SPA_TYPE_COMMAND_Node */
 | 
				
			||||||
 | 
					enum spa_command_node {
 | 
				
			||||||
 | 
						SPA_COMMAND_NODE_START,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_COMMAND_NODE_START_User 		= 0x1000,
 | 
				
			||||||
 | 
						SPA_COMMAND_NODE_extra,			/** extra info (String) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_COMMAND_NODE_START_CUSTOM   	= 0x1000000,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \}
 | 
					 * \}
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,8 @@
 | 
				
			||||||
#ifndef SPA_EVENT_NODE_H
 | 
					#ifndef SPA_EVENT_NODE_H
 | 
				
			||||||
#define SPA_EVENT_NODE_H
 | 
					#define SPA_EVENT_NODE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/event.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,8 +16,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/event.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* object id of SPA_TYPE_EVENT_Node */
 | 
					/* object id of SPA_TYPE_EVENT_Node */
 | 
				
			||||||
enum spa_node_event {
 | 
					enum spa_node_event {
 | 
				
			||||||
	SPA_NODE_EVENT_Error,
 | 
						SPA_NODE_EVENT_Error,
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ enum spa_node_event {
 | 
				
			||||||
	SPA_NODE_EVENT_RequestRefresh,
 | 
						SPA_NODE_EVENT_RequestRefresh,
 | 
				
			||||||
	SPA_NODE_EVENT_RequestProcess,		/*< Ask the driver to start processing
 | 
						SPA_NODE_EVENT_RequestProcess,		/*< Ask the driver to start processing
 | 
				
			||||||
						 *  the graph */
 | 
											 *  the graph */
 | 
				
			||||||
 | 
						SPA_NODE_EVENT_User,			/* User defined event */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPA_NODE_EVENT_ID(ev)	SPA_EVENT_ID(ev, SPA_TYPE_EVENT_Node)
 | 
					#define SPA_NODE_EVENT_ID(ev)	SPA_EVENT_ID(ev, SPA_TYPE_EVENT_Node)
 | 
				
			||||||
| 
						 | 
					@ -31,6 +32,11 @@ enum spa_node_event {
 | 
				
			||||||
/* properties for SPA_TYPE_EVENT_Node */
 | 
					/* properties for SPA_TYPE_EVENT_Node */
 | 
				
			||||||
enum spa_event_node {
 | 
					enum spa_event_node {
 | 
				
			||||||
	SPA_EVENT_NODE_START,
 | 
						SPA_EVENT_NODE_START,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_EVENT_NODE_START_User 	= 0x1000,
 | 
				
			||||||
 | 
						SPA_EVENT_NODE_extra,		/** extra info (String) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SPA_EVENT_NODE_START_CUSTOM   	= 0x1000000,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,9 @@
 | 
				
			||||||
#ifndef SPA_IO_H
 | 
					#ifndef SPA_IO_H
 | 
				
			||||||
#define SPA_IO_H
 | 
					#define SPA_IO_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/pod/pod.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,9 +17,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/pod/pod.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** IO areas
 | 
					/** IO areas
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * IO information for a port on a node. This is allocated
 | 
					 * IO information for a port on a node. This is allocated
 | 
				
			||||||
| 
						 | 
					@ -114,23 +114,54 @@ struct spa_io_range {
 | 
				
			||||||
 * Driver nodes are supposed to update the contents of \ref SPA_IO_Clock before
 | 
					 * Driver nodes are supposed to update the contents of \ref SPA_IO_Clock before
 | 
				
			||||||
 * signaling the start of a graph cycle.  These updated clock values become
 | 
					 * signaling the start of a graph cycle.  These updated clock values become
 | 
				
			||||||
 * visible to other nodes in \ref SPA_IO_Position. Non-driver nodes do
 | 
					 * visible to other nodes in \ref SPA_IO_Position. Non-driver nodes do
 | 
				
			||||||
 * not need to update the contents of their \ref SPA_IO_Clock.
 | 
					 * not need to update the contents of their \ref SPA_IO_Clock. Also
 | 
				
			||||||
 | 
					 * see \ref page_driver for further details.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * The host generally gives each node a separate \ref spa_io_clock in \ref
 | 
					 * The host generally gives each node a separate \ref spa_io_clock in \ref
 | 
				
			||||||
 * SPA_IO_Clock, so that updates made by the driver are not visible in the
 | 
					 * SPA_IO_Clock, so that updates made by the driver are not visible in the
 | 
				
			||||||
 * contents of \ref SPA_IO_Clock of other nodes. Instead, \ref SPA_IO_Position
 | 
					 * contents of \ref SPA_IO_Clock of other nodes. Instead, \ref SPA_IO_Position
 | 
				
			||||||
 * is used to look up the current graph time.
 | 
					 * is used to look up the current graph time.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * A node is a driver when \ref spa_io_clock.id in \ref SPA_IO_Clock and
 | 
					 * A node is a driver when \ref spa_io_clock::id and the ID in
 | 
				
			||||||
 * \ref spa_io_position.clock.id in \ref SPA_IO_Position are the same.
 | 
					 * \ref spa_io_position.clock in \ref SPA_IO_Position are the same.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * The flags are set by the graph driver at the start of each cycle.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct spa_io_clock {
 | 
					struct spa_io_clock {
 | 
				
			||||||
#define SPA_IO_CLOCK_FLAG_FREEWHEEL	(1u<<0) /* graph is freewheeling */
 | 
					#define SPA_IO_CLOCK_FLAG_FREEWHEEL	(1u<<0) /**< Graph is freewheeling. It runs at the maximum
 | 
				
			||||||
#define SPA_IO_CLOCK_FLAG_XRUN_RECOVER	(1u<<1) /* recovering from xrun */
 | 
											  *  possible rate, only constrained by the processing
 | 
				
			||||||
#define SPA_IO_CLOCK_FLAG_LAZY		(1u<<2) /* lazy scheduling */
 | 
											  *  power of the machine it runs on. This can be useful
 | 
				
			||||||
#define SPA_IO_CLOCK_FLAG_NO_RATE	(1u<<3) /* the rate of the clock is only approximately.
 | 
											  *  for offline processing, where processing in real
 | 
				
			||||||
						 * it is recommended to use the nsec as a clock source.
 | 
											  *  time is not desired. */
 | 
				
			||||||
 | 
					#define SPA_IO_CLOCK_FLAG_XRUN_RECOVER	(1u<<1) /**< A node's process callback did not complete within
 | 
				
			||||||
 | 
											  *  the last cycle's deadline, resulting in an xrun.
 | 
				
			||||||
 | 
											  *  This flag is not set for the entire graph. Instead,
 | 
				
			||||||
 | 
											  *  it is set at the start of the current cycle before
 | 
				
			||||||
 | 
											  *  a node that experienced an xrun has its process
 | 
				
			||||||
 | 
											  *  callback invoked. After said callback finished, the
 | 
				
			||||||
 | 
											  *  flag is cleared again. That way, the node knows that
 | 
				
			||||||
 | 
											  *  during the last cycle it experienced an xrun. They
 | 
				
			||||||
 | 
											  *  can use this information for example to resynchronize
 | 
				
			||||||
 | 
											  *  or clear custom stale states. */
 | 
				
			||||||
 | 
					#define SPA_IO_CLOCK_FLAG_LAZY		(1u<<2) /**< The driver uses lazy scheduling. For details, see
 | 
				
			||||||
 | 
											  *  \ref PW_KEY_NODE_SUPPORTS_LAZY . */
 | 
				
			||||||
 | 
					#define SPA_IO_CLOCK_FLAG_NO_RATE	(1u<<3) /**< The rate of the clock is only approximately.
 | 
				
			||||||
 | 
											 *   It is recommended to use the nsec as a clock source.
 | 
				
			||||||
						 *   The rate_diff contains the measured inaccuracy. */
 | 
											 *   The rate_diff contains the measured inaccuracy. */
 | 
				
			||||||
 | 
					#define SPA_IO_CLOCK_FLAG_DISCONT	(1u<<4) /**< The clock experienced a discontinuity in its
 | 
				
			||||||
 | 
											 *   timestamps since the last cycle. If this is set,
 | 
				
			||||||
 | 
											 *   nodes know that timestamps between the last and
 | 
				
			||||||
 | 
											 *   the current cycle cannot be assumed to be
 | 
				
			||||||
 | 
											 *   continuous. Nodes that synchronize playback against
 | 
				
			||||||
 | 
											 *   clock timestamps should resynchronize (for example
 | 
				
			||||||
 | 
											 *   by flushing buffers to avoid incorrect delays).
 | 
				
			||||||
 | 
											 *   This differs from an xrun in that it is not necessariy
 | 
				
			||||||
 | 
											 *   an error and that it is not caused by missed process
 | 
				
			||||||
 | 
											 *   deadlines. If for example a custom network time
 | 
				
			||||||
 | 
											 *   based driver starts to follow a different time
 | 
				
			||||||
 | 
											 *   server, and the offset between that server and its
 | 
				
			||||||
 | 
											 *   local clock consequently suddenly changes, then that
 | 
				
			||||||
 | 
											 *   driver should set this flag. */
 | 
				
			||||||
	uint32_t flags;			/**< Clock flags */
 | 
						uint32_t flags;			/**< Clock flags */
 | 
				
			||||||
	uint32_t id;			/**< Unique clock id, set by host application */
 | 
						uint32_t id;			/**< Unique clock id, set by host application */
 | 
				
			||||||
	char name[64];			/**< Clock name prefixed with API, set by node when it receives
 | 
						char name[64];			/**< Clock name prefixed with API, set by node when it receives
 | 
				
			||||||
| 
						 | 
					@ -138,13 +169,16 @@ struct spa_io_clock {
 | 
				
			||||||
					  *  can be used to check if nodes share the same clock. */
 | 
										  *  can be used to check if nodes share the same clock. */
 | 
				
			||||||
	uint64_t nsec;			/**< Time in nanoseconds against monotonic clock
 | 
						uint64_t nsec;			/**< Time in nanoseconds against monotonic clock
 | 
				
			||||||
					  * (CLOCK_MONOTONIC). This fields reflects a real time instant
 | 
										  * (CLOCK_MONOTONIC). This fields reflects a real time instant
 | 
				
			||||||
					  * in the past. The value may have jitter. */
 | 
										  * in the past, when the current cycle started. The value may
 | 
				
			||||||
 | 
										  * have jitter. */
 | 
				
			||||||
	struct spa_fraction rate;	/**< Rate for position/duration/delay/xrun */
 | 
						struct spa_fraction rate;	/**< Rate for position/duration/delay/xrun */
 | 
				
			||||||
	uint64_t position;		/**< Current position, in samples @ \ref rate */
 | 
						uint64_t position;		/**< Current position, in samples @ \ref rate */
 | 
				
			||||||
	uint64_t duration;		/**< Duration of current cycle, in samples @ \ref rate */
 | 
						uint64_t duration;		/**< Duration of current cycle, in samples @ \ref rate */
 | 
				
			||||||
	int64_t delay;			/**< Delay between position and hardware, in samples @ \ref rate */
 | 
						int64_t delay;			/**< Delay between position and hardware, in samples @ \ref rate */
 | 
				
			||||||
	double rate_diff;		/**< Rate difference between clock and monotonic time, as a ratio of
 | 
						double rate_diff;		/**< Rate difference between clock and monotonic time, as a ratio of
 | 
				
			||||||
					  *  clock speeds. */
 | 
										  *  clock speeds. A value higher than 1.0 means that the driver's
 | 
				
			||||||
 | 
										  *  internal clock is faster than the monotonic clock (by that
 | 
				
			||||||
 | 
										  *  factor), and vice versa. */
 | 
				
			||||||
	uint64_t next_nsec;		/**< Estimated next wakeup time in nanoseconds.
 | 
						uint64_t next_nsec;		/**< Estimated next wakeup time in nanoseconds.
 | 
				
			||||||
					  *  This time is a logical start time of the next cycle, and
 | 
										  *  This time is a logical start time of the next cycle, and
 | 
				
			||||||
					  *  is not necessarily in the future.
 | 
										  *  is not necessarily in the future.
 | 
				
			||||||
| 
						 | 
					@ -278,8 +312,8 @@ enum spa_io_position_state {
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * It is set on all nodes in \ref SPA_IO_Position, and the contents of \ref
 | 
					 * It is set on all nodes in \ref SPA_IO_Position, and the contents of \ref
 | 
				
			||||||
 * spa_io_position.clock contain the clock updates made by the driving node in
 | 
					 * spa_io_position.clock contain the clock updates made by the driving node in
 | 
				
			||||||
 * the graph in its \ref SPA_IO_Clock.  Also, \ref spa_io_position.clock.id
 | 
					 * the graph in its \ref SPA_IO_Clock.  Also, the ID in \ref spa_io_position.clock
 | 
				
			||||||
 * will contain the clock id of the driving node in the graph.
 | 
					 * will be the clock id of the driving node in the graph.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * The position clock indicates the logical start time of the current graph
 | 
					 * The position clock indicates the logical start time of the current graph
 | 
				
			||||||
 * cycle.
 | 
					 * cycle.
 | 
				
			||||||
| 
						 | 
					@ -313,7 +347,7 @@ struct spa_io_position {
 | 
				
			||||||
 * and node rates. The \a flags and \a rate fields may be modified by the node.
 | 
					 * and node rates. The \a flags and \a rate fields may be modified by the node.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * The node can request a correction to the resampling rate in its process(), by setting
 | 
					 * The node can request a correction to the resampling rate in its process(), by setting
 | 
				
			||||||
 * \ref SPA_IO_RATE_MATCH_ACTIVE on \a flags, and setting \a rate to the desired rate
 | 
					 * \ref SPA_IO_RATE_MATCH_FLAG_ACTIVE on \a flags, and setting \a rate to the desired rate
 | 
				
			||||||
 * correction.  Usually the rate is obtained from DLL or other adaptive mechanism that
 | 
					 * correction.  Usually the rate is obtained from DLL or other adaptive mechanism that
 | 
				
			||||||
 * e.g. drives the node buffer fill level toward a specific value.
 | 
					 * e.g. drives the node buffer fill level toward a specific value.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,14 @@
 | 
				
			||||||
#ifndef SPA_NODE_H
 | 
					#ifndef SPA_NODE_H
 | 
				
			||||||
#define SPA_NODE_H
 | 
					#define SPA_NODE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <spa/utils/defs.h>
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					#include <spa/utils/hook.h>
 | 
				
			||||||
 | 
					#include <spa/buffer/buffer.h>
 | 
				
			||||||
 | 
					#include <spa/node/event.h>
 | 
				
			||||||
 | 
					#include <spa/node/command.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -19,14 +27,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <errno.h>
 | 
					 | 
				
			||||||
#include <spa/utils/defs.h>
 | 
					 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
#include <spa/utils/hook.h>
 | 
					 | 
				
			||||||
#include <spa/buffer/buffer.h>
 | 
					 | 
				
			||||||
#include <spa/node/event.h>
 | 
					 | 
				
			||||||
#include <spa/node/command.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_NODE
 | 
					#ifndef SPA_API_NODE
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_NODE SPA_API_IMPL
 | 
					  #define SPA_API_NODE SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,12 @@
 | 
				
			||||||
#ifndef SPA_NODE_TYPES_H
 | 
					#ifndef SPA_NODE_TYPES_H
 | 
				
			||||||
#define SPA_NODE_TYPES_H
 | 
					#define SPA_NODE_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/node/command.h>
 | 
				
			||||||
 | 
					#include <spa/node/event.h>
 | 
				
			||||||
 | 
					#include <spa/node/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,12 +20,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <spa/node/command.h>
 | 
					 | 
				
			||||||
#include <spa/node/event.h>
 | 
					 | 
				
			||||||
#include <spa/node/io.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define SPA_TYPE_INFO_IO			SPA_TYPE_INFO_ENUM_BASE "IO"
 | 
					#define SPA_TYPE_INFO_IO			SPA_TYPE_INFO_ENUM_BASE "IO"
 | 
				
			||||||
#define SPA_TYPE_INFO_IO_BASE		SPA_TYPE_INFO_IO ":"
 | 
					#define SPA_TYPE_INFO_IO_BASE		SPA_TYPE_INFO_IO ":"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,11 +46,15 @@ static const struct spa_type_info spa_type_node_event_id[] = {
 | 
				
			||||||
	{ SPA_NODE_EVENT_Buffering,	 SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "Buffering", NULL },
 | 
						{ SPA_NODE_EVENT_Buffering,	 SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "Buffering", NULL },
 | 
				
			||||||
	{ SPA_NODE_EVENT_RequestRefresh, SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "RequestRefresh", NULL },
 | 
						{ SPA_NODE_EVENT_RequestRefresh, SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "RequestRefresh", NULL },
 | 
				
			||||||
	{ SPA_NODE_EVENT_RequestProcess, SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "RequestProcess", NULL },
 | 
						{ SPA_NODE_EVENT_RequestProcess, SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "RequestProcess", NULL },
 | 
				
			||||||
 | 
						{ SPA_NODE_EVENT_User,           SPA_TYPE_EVENT_Node, SPA_TYPE_INFO_NODE_EVENT_BASE "User", NULL },
 | 
				
			||||||
	{ 0, 0, NULL, NULL },
 | 
						{ 0, 0, NULL, NULL },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct spa_type_info spa_type_node_event[] = {
 | 
					static const struct spa_type_info spa_type_node_event[] = {
 | 
				
			||||||
	{ SPA_EVENT_NODE_START, SPA_TYPE_Id, SPA_TYPE_INFO_NODE_EVENT_BASE, spa_type_node_event_id },
 | 
						{ SPA_EVENT_NODE_START, SPA_TYPE_Id, SPA_TYPE_INFO_NODE_EVENT_BASE, spa_type_node_event_id },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{ SPA_EVENT_NODE_extra, SPA_TYPE_String, SPA_TYPE_INFO_NODE_EVENT_BASE "extra", NULL },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{ 0, 0, NULL, NULL },
 | 
						{ 0, 0, NULL, NULL },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,11 +73,15 @@ static const struct spa_type_info spa_type_node_command_id[] = {
 | 
				
			||||||
	{ SPA_NODE_COMMAND_ParamBegin,	SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "ParamBegin",  NULL },
 | 
						{ SPA_NODE_COMMAND_ParamBegin,	SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "ParamBegin",  NULL },
 | 
				
			||||||
	{ SPA_NODE_COMMAND_ParamEnd,	SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "ParamEnd",  NULL },
 | 
						{ SPA_NODE_COMMAND_ParamEnd,	SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "ParamEnd",  NULL },
 | 
				
			||||||
	{ SPA_NODE_COMMAND_RequestProcess, SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "RequestProcess",  NULL },
 | 
						{ SPA_NODE_COMMAND_RequestProcess, SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "RequestProcess",  NULL },
 | 
				
			||||||
 | 
						{ SPA_NODE_COMMAND_User,        SPA_TYPE_COMMAND_Node, SPA_TYPE_INFO_NODE_COMMAND_BASE "User",  NULL },
 | 
				
			||||||
	{ 0, 0, NULL, NULL },
 | 
						{ 0, 0, NULL, NULL },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct spa_type_info spa_type_node_command[] = {
 | 
					static const struct spa_type_info spa_type_node_command[] = {
 | 
				
			||||||
	{ 0, SPA_TYPE_Id, SPA_TYPE_INFO_NODE_COMMAND_BASE, spa_type_node_command_id },
 | 
						{ SPA_COMMAND_NODE_START, SPA_TYPE_Id, SPA_TYPE_INFO_NODE_COMMAND_BASE, spa_type_node_command_id },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{ SPA_COMMAND_NODE_extra, SPA_TYPE_String, SPA_TYPE_INFO_NODE_COMMAND_BASE "extra", NULL },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{ 0, 0, NULL, NULL },
 | 
						{ 0, 0, NULL, NULL },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,10 @@
 | 
				
			||||||
#ifndef SPA_NODE_UTILS_H
 | 
					#ifndef SPA_NODE_UTILS_H
 | 
				
			||||||
#define SPA_NODE_UTILS_H
 | 
					#define SPA_NODE_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/node/node.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,10 +18,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <spa/node/node.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_NODE_UTILS
 | 
					#ifndef SPA_API_NODE_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_NODE_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_NODE_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AAC_TYPES_H
 | 
					#ifndef SPA_AUDIO_AAC_TYPES_H
 | 
				
			||||||
#define SPA_AUDIO_AAC_TYPES_H
 | 
					#define SPA_AUDIO_AAC_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/aac.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/aac.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AAC_UTILS_H
 | 
					#ifndef SPA_AUDIO_AAC_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_AAC_UTILS_H
 | 
					#define SPA_AUDIO_AAC_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +19,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_AAC_UTILS
 | 
					#ifndef SPA_API_AUDIO_AAC_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_AAC_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_AAC_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AAC_H
 | 
					#ifndef SPA_AUDIO_AAC_H
 | 
				
			||||||
#define SPA_AUDIO_AAC_H
 | 
					#define SPA_AUDIO_AAC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					@ -18,19 +18,19 @@ extern "C" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum spa_audio_aac_stream_format {
 | 
					enum spa_audio_aac_stream_format {
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_UNKNOWN,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_UNKNOWN,
 | 
				
			||||||
	/* Raw AAC frames */
 | 
						/** Raw AAC frames */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_RAW,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_RAW,
 | 
				
			||||||
	/* ISO/IEC 13818-7 MPEG-2 Audio Data Transport Stream (ADTS) */
 | 
						/** ISO/IEC 13818-7 MPEG-2 Audio Data Transport Stream (ADTS) */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_MP2ADTS,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_MP2ADTS,
 | 
				
			||||||
	/* ISO/IEC 14496-3 MPEG-4 Audio Data Transport Stream (ADTS) */
 | 
						/** ISO/IEC 14496-3 MPEG-4 Audio Data Transport Stream (ADTS) */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_MP4ADTS,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_MP4ADTS,
 | 
				
			||||||
	/* ISO/IEC 14496-3 Low Overhead Audio Stream (LOAS) */
 | 
						/** ISO/IEC 14496-3 Low Overhead Audio Stream (LOAS) */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_MP4LOAS,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_MP4LOAS,
 | 
				
			||||||
	/* ISO/IEC 14496-3 Low Overhead Audio Transport Multiplex (LATM) */
 | 
						/** ISO/IEC 14496-3 Low Overhead Audio Transport Multiplex (LATM) */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_MP4LATM,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_MP4LATM,
 | 
				
			||||||
	/* ISO/IEC 14496-3 Audio Data Interchange Format (ADIF) */
 | 
						/** ISO/IEC 14496-3 Audio Data Interchange Format (ADIF) */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_ADIF,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_ADIF,
 | 
				
			||||||
	/* ISO/IEC 14496-12 MPEG-4 file format */
 | 
						/** ISO/IEC 14496-12 MPEG-4 file format */
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_MP4FF,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_MP4FF,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SPA_AUDIO_AAC_STREAM_FORMAT_CUSTOM = 0x10000,
 | 
						SPA_AUDIO_AAC_STREAM_FORMAT_CUSTOM = 0x10000,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										69
									
								
								spa/include/spa/param/audio/ac3-utils.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								spa/include/spa/param/audio/ac3-utils.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					/* Simple Plugin API */
 | 
				
			||||||
 | 
					/* SPDX-FileCopyrightText: Copyright © 2025 Carlos Rafael Giani */
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: MIT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SPA_AUDIO_AC3_UTILS_H
 | 
				
			||||||
 | 
					#define SPA_AUDIO_AC3_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 | 
					 * \{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SPA_API_AUDIO_AC3_UTILS
 | 
				
			||||||
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
 | 
					  #define SPA_API_AUDIO_AC3_UTILS SPA_API_IMPL
 | 
				
			||||||
 | 
					 #else
 | 
				
			||||||
 | 
					  #define SPA_API_AUDIO_AC3_UTILS static inline
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPA_API_AUDIO_AC3_UTILS int
 | 
				
			||||||
 | 
					spa_format_audio_ac3_parse(const struct spa_pod *format, struct spa_audio_info_ac3 *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int res;
 | 
				
			||||||
 | 
						res = spa_pod_parse_object(format,
 | 
				
			||||||
 | 
								SPA_TYPE_OBJECT_Format, NULL,
 | 
				
			||||||
 | 
								SPA_FORMAT_AUDIO_rate,		SPA_POD_OPT_Int(&info->rate),
 | 
				
			||||||
 | 
								SPA_FORMAT_AUDIO_channels,	SPA_POD_OPT_Int(&info->channels));
 | 
				
			||||||
 | 
						return res;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SPA_API_AUDIO_AC3_UTILS struct spa_pod *
 | 
				
			||||||
 | 
					spa_format_audio_ac3_build(struct spa_pod_builder *builder, uint32_t id,
 | 
				
			||||||
 | 
								   const struct spa_audio_info_ac3 *info)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct spa_pod_frame f;
 | 
				
			||||||
 | 
						spa_pod_builder_push_object(builder, &f, SPA_TYPE_OBJECT_Format, id);
 | 
				
			||||||
 | 
						spa_pod_builder_add(builder,
 | 
				
			||||||
 | 
								SPA_FORMAT_mediaType,		SPA_POD_Id(SPA_MEDIA_TYPE_audio),
 | 
				
			||||||
 | 
								SPA_FORMAT_mediaSubtype,	SPA_POD_Id(SPA_MEDIA_SUBTYPE_ac3),
 | 
				
			||||||
 | 
								SPA_FORMAT_AUDIO_format,	SPA_POD_Id(SPA_AUDIO_FORMAT_ENCODED),
 | 
				
			||||||
 | 
								0);
 | 
				
			||||||
 | 
						if (info->rate != 0)
 | 
				
			||||||
 | 
							spa_pod_builder_add(builder,
 | 
				
			||||||
 | 
								SPA_FORMAT_AUDIO_rate,		SPA_POD_Int(info->rate), 0);
 | 
				
			||||||
 | 
						if (info->channels != 0)
 | 
				
			||||||
 | 
							spa_pod_builder_add(builder,
 | 
				
			||||||
 | 
								SPA_FORMAT_AUDIO_channels,	SPA_POD_Int(info->channels), 0);
 | 
				
			||||||
 | 
						return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}  /* extern "C" */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* SPA_AUDIO_AC3_UTILS_H */
 | 
				
			||||||
							
								
								
									
										35
									
								
								spa/include/spa/param/audio/ac3.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								spa/include/spa/param/audio/ac3.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					/* Simple Plugin API */
 | 
				
			||||||
 | 
					/* SPDX-FileCopyrightText: Copyright © 2025 Carlos Rafael Giani */
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: MIT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SPA_AUDIO_AC3_H
 | 
				
			||||||
 | 
					#define SPA_AUDIO_AC3_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 | 
					 * \{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Dolby AC-3 audio info. */
 | 
				
			||||||
 | 
					struct spa_audio_info_ac3 {
 | 
				
			||||||
 | 
						uint32_t rate;				/*< sample rate */
 | 
				
			||||||
 | 
						uint32_t channels;			/*< number of channels */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SPA_AUDIO_INFO_AC3_INIT(...)		((struct spa_audio_info_ac3) { __VA_ARGS__ })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}  /* extern "C" */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* SPA_AUDIO_AC3_H */
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_ALAC_UTILS_H
 | 
					#ifndef SPA_AUDIO_ALAC_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_ALAC_UTILS_H
 | 
					#define SPA_AUDIO_ALAC_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +19,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_ALAC_UTILS
 | 
					#ifndef SPA_API_AUDIO_ALAC_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_ALAC_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_ALAC_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_ALAC_H
 | 
					#ifndef SPA_AUDIO_ALAC_H
 | 
				
			||||||
#define SPA_AUDIO_ALAC_H
 | 
					#define SPA_AUDIO_ALAC_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,13 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AMR_TYPES_H
 | 
					#ifndef SPA_AUDIO_AMR_TYPES_H
 | 
				
			||||||
#define SPA_AUDIO_AMR_TYPES_H
 | 
					#define SPA_AUDIO_AMR_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/amr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/utils/type.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/amr.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AMR_UTILS_H
 | 
					#ifndef SPA_AUDIO_AMR_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_AMR_UTILS_H
 | 
					#define SPA_AUDIO_AMR_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +19,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_AMR_UTILS
 | 
					#ifndef SPA_API_AUDIO_AMR_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_AMR_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_AMR_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_AMR_H
 | 
					#ifndef SPA_AUDIO_AMR_H
 | 
				
			||||||
#define SPA_AUDIO_AMR_H
 | 
					#define SPA_AUDIO_AMR_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_APE_UTILS_H
 | 
					#ifndef SPA_AUDIO_APE_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_APE_UTILS_H
 | 
					#define SPA_AUDIO_APE_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +19,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_APE_UTILS
 | 
					#ifndef SPA_API_AUDIO_APE_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_APE_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_APE_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_APE_H
 | 
					#ifndef SPA_AUDIO_APE_H
 | 
				
			||||||
#define SPA_AUDIO_APE_H
 | 
					#define SPA_AUDIO_APE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,12 +7,17 @@
 | 
				
			||||||
#define SPA_AUDIO_COMPRESSED_H
 | 
					#define SPA_AUDIO_COMPRESSED_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/aac.h>
 | 
					#include <spa/param/audio/aac.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/ac3.h>
 | 
				
			||||||
#include <spa/param/audio/alac.h>
 | 
					#include <spa/param/audio/alac.h>
 | 
				
			||||||
#include <spa/param/audio/amr.h>
 | 
					#include <spa/param/audio/amr.h>
 | 
				
			||||||
#include <spa/param/audio/ape.h>
 | 
					#include <spa/param/audio/ape.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/dts.h>
 | 
				
			||||||
#include <spa/param/audio/flac.h>
 | 
					#include <spa/param/audio/flac.h>
 | 
				
			||||||
#include <spa/param/audio/mp3.h>
 | 
					#include <spa/param/audio/mp3.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/mpegh.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/opus.h>
 | 
				
			||||||
#include <spa/param/audio/ra.h>
 | 
					#include <spa/param/audio/ra.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/truehd.h>
 | 
				
			||||||
#include <spa/param/audio/vorbis.h>
 | 
					#include <spa/param/audio/vorbis.h>
 | 
				
			||||||
#include <spa/param/audio/wma.h>
 | 
					#include <spa/param/audio/wma.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_DSD_UTILS_H
 | 
					#ifndef SPA_AUDIO_DSD_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_DSD_UTILS_H
 | 
					#define SPA_AUDIO_DSD_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/iter.h>
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +20,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_DSD_UTILS
 | 
					#ifndef SPA_API_AUDIO_DSD_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_DSD_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_DSD_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					@ -41,7 +42,7 @@ spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_d
 | 
				
			||||||
			SPA_FORMAT_AUDIO_channels,	SPA_POD_OPT_Int(&info->channels),
 | 
								SPA_FORMAT_AUDIO_channels,	SPA_POD_OPT_Int(&info->channels),
 | 
				
			||||||
			SPA_FORMAT_AUDIO_position,	SPA_POD_OPT_Pod(&position));
 | 
								SPA_FORMAT_AUDIO_position,	SPA_POD_OPT_Pod(&position));
 | 
				
			||||||
	if (position == NULL ||
 | 
						if (position == NULL ||
 | 
				
			||||||
	    !spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_AUDIO_MAX_CHANNELS))
 | 
						    !spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_N_ELEMENTS(info->position)))
 | 
				
			||||||
		SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
 | 
							SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return res;
 | 
						return res;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,13 +7,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/param.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/param.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,6 +5,11 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_DSP_UTILS_H
 | 
					#ifndef SPA_AUDIO_DSP_UTILS_H
 | 
				
			||||||
#define SPA_AUDIO_DSP_UTILS_H
 | 
					#define SPA_AUDIO_DSP_UTILS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/pod/parser.h>
 | 
				
			||||||
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/format.h>
 | 
				
			||||||
 | 
					#include <spa/param/format-utils.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -14,11 +19,6 @@ extern "C" {
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/pod/parser.h>
 | 
					 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					 | 
				
			||||||
#include <spa/param/audio/format.h>
 | 
					 | 
				
			||||||
#include <spa/param/format-utils.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef SPA_API_AUDIO_DSP_UTILS
 | 
					#ifndef SPA_API_AUDIO_DSP_UTILS
 | 
				
			||||||
 #ifdef SPA_API_IMPL
 | 
					 #ifdef SPA_API_IMPL
 | 
				
			||||||
  #define SPA_API_AUDIO_DSP_UTILS SPA_API_IMPL
 | 
					  #define SPA_API_AUDIO_DSP_UTILS SPA_API_IMPL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,12 @@
 | 
				
			||||||
#ifndef SPA_AUDIO_DSP_H
 | 
					#ifndef SPA_AUDIO_DSP_H
 | 
				
			||||||
#define SPA_AUDIO_DSP_H
 | 
					#define SPA_AUDIO_DSP_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/param/audio/raw.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/param/audio/raw.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * \addtogroup spa_param
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 * \{
 | 
					 * \{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										39
									
								
								spa/include/spa/param/audio/dts-types.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								spa/include/spa/param/audio/dts-types.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					/* Simple Plugin API */
 | 
				
			||||||
 | 
					/* SPDX-FileCopyrightText: Copyright © 2025 Carlos Rafael Giani */
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: MIT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SPA_AUDIO_DTS_TYPES_H
 | 
				
			||||||
 | 
					#define SPA_AUDIO_DTS_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <spa/utils/type.h>
 | 
				
			||||||
 | 
					#include <spa/param/audio/dts.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \addtogroup spa_param
 | 
				
			||||||
 | 
					 * \{
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SPA_TYPE_INFO_AudioDTSExtType		SPA_TYPE_INFO_ENUM_BASE "AudioDTSExtType"
 | 
				
			||||||
 | 
					#define SPA_TYPE_INFO_AUDIO_DTS_EXT_TYPE_BASE	SPA_TYPE_INFO_AudioDTSExtType ":"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct spa_type_info spa_type_audio_dts_ext_type[] = {
 | 
				
			||||||
 | 
						{ SPA_AUDIO_DTS_EXT_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_DTS_EXT_TYPE_BASE "UNKNOWN", NULL },
 | 
				
			||||||
 | 
						{ SPA_AUDIO_DTS_EXT_NONE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_DTS_EXT_TYPE_BASE "NONE", NULL },
 | 
				
			||||||
 | 
						{ SPA_AUDIO_DTS_EXT_HD_HRA, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_DTS_EXT_TYPE_BASE "HRA", NULL },
 | 
				
			||||||
 | 
						{ SPA_AUDIO_DTS_EXT_HD_MA, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_DTS_EXT_TYPE_BASE "MA", NULL },
 | 
				
			||||||
 | 
						{ 0, 0, NULL, NULL },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * \}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}  /* extern "C" */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* SPA_AUDIO_DTS_TYPES_H */
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue