merge upstream 0.3.65

This commit is contained in:
ctf 2023-04-18 15:39:29 +08:00
parent a623485b4b
commit 3339d3b690
500 changed files with 39102 additions and 10912 deletions

View File

@ -1,7 +1,7 @@
task:
freebsd_instance:
matrix:
- image_family: freebsd-13-0-snap
- image_family: freebsd-13-1-snap
env:
# /usr/ports/Mk/Uses/localbase.mk localbase:ldflags
LOCALBASE: /usr/local

View File

@ -25,7 +25,7 @@ include:
.fedora:
variables:
# Update this tag when you want to trigger a rebuild
FDO_DISTRIBUTION_TAG: '2022-03-05.0'
FDO_DISTRIBUTION_TAG: '2022-11-07.0'
FDO_DISTRIBUTION_VERSION: '35'
FDO_DISTRIBUTION_PACKAGES: >-
alsa-lib-devel
@ -52,6 +52,7 @@ include:
libv4l-devel
libva-devel
libX11-devel
ModemManager-devel
openssl-devel
pulseaudio-libs-devel
python3-docutils
@ -68,6 +69,7 @@ include:
python3-pip
pulseaudio-utils
openal-soft
readline-devel
FDO_DISTRIBUTION_EXEC: >-
pip3 install meson
@ -105,7 +107,7 @@ include:
.alpine:
variables:
# Update this tag when you want to trigger a rebuild
FDO_DISTRIBUTION_TAG: '2022-01-28.2'
FDO_DISTRIBUTION_TAG: '2022-09-07.0'
FDO_DISTRIBUTION_VERSION: '3.15'
FDO_DISTRIBUTION_PACKAGES: >-
alsa-lib-dev
@ -128,6 +130,7 @@ include:
libusb-dev
libx11-dev
meson
modemmanager-dev
ncurses-dev
pulseaudio-dev
readline-dev
@ -176,7 +179,6 @@ include:
- ninja $NINJA_ARGS -C "$BUILD_DIR"
- ninja $NINJA_ARGS -C "$BUILD_DIR" test
- ninja $NINJA_ARGS -C "$BUILD_DIR" install
- ./check_missing_headers.sh
artifacts:
name: pipewire-$CI_COMMIT_SHA
when: always
@ -223,6 +225,8 @@ build_on_ubuntu:
- .fdo.distribution-image@ubuntu
- .build
stage: build
variables:
MESON_OPTIONS: "-Dsession-managers=[]"
.build_on_fedora:
extends:
@ -248,6 +252,7 @@ build_on_fedora:
-Dvulkan=enabled
-Dsdl2=enabled
-Dsndfile=enabled
-Dsession-managers=[]
artifacts:
name: pipewire-$CI_COMMIT_SHA
when: always
@ -262,15 +267,24 @@ build_on_alpine:
- .fdo.distribution-image@alpine
- .build
stage: build
variables:
MESON_OPTIONS: "-Dsession-managers=[]"
# build with all auto() options enabled
build_all:
extends:
- .build_on_fedora
variables:
# Fedora doesn't have libfreeaptx, lc3plus, or roc
# Fedora doesn't have libfreeaptx, lc3plus, lc3, or roc
# libcamera has no stable API, so let's not chase that target
MESON_OPTIONS: "-Dauto_features=enabled -Dbluez5-codec-aptx=disabled -Dbluez5-codec-lc3plus=disabled -Droc=disabled -Dlibcamera=disabled"
MESON_OPTIONS: >-
-Dauto_features=enabled
-Dbluez5-codec-aptx=disabled
-Dbluez5-codec-lc3plus=disabled
-Dbluez5-codec-lc3=disabled
-Droc=disabled
-Dlibcamera=disabled
-Dsession-managers=[]
parallel:
matrix:
- CC: [gcc, clang]
@ -280,7 +294,7 @@ build_with_no_commandline_options:
extends:
- .build_on_fedora
variables:
MESON_OPTIONS: ""
MESON_OPTIONS: "-Dsession-managers=[]"
parallel:
matrix:
- CC: [gcc, clang]
@ -296,7 +310,7 @@ build_with_custom_options:
MESON_OPTION_VALUE: [enabled, disabled]
script:
- echo "Building with -D$MESON_OPTION=$MESON_OPTION_VALUE"
- meson "$BUILD_DIR" . --prefix="$PREFIX" "-D$MESON_OPTION=$MESON_OPTION_VALUE"
- meson "$BUILD_DIR" . --prefix="$PREFIX" "-D$MESON_OPTION=$MESON_OPTION_VALUE" -Dsession-managers=[]
- ninja $NINJA_ARGS -C "$BUILD_DIR"
- ninja $NINJA_ARGS -C "$BUILD_DIR" test
@ -307,7 +321,7 @@ build_release:
extends:
- .build_on_fedora
variables:
MESON_OPTIONS: "-Dtest=enabled -Dbuildtype=release -Db_ndebug=true"
MESON_OPTIONS: "-Dtest=enabled -Dbuildtype=release -Db_ndebug=true -Dsession-managers=[]"
parallel:
matrix:
- CC: [gcc, clang]
@ -363,6 +377,8 @@ valgrind:
- echo "Building with meson options $MESON_OPTIONS"
- meson "$BUILD_DIR" . --prefix="$PREFIX" $MESON_OPTIONS
- meson test -C "$BUILD_DIR" --setup=valgrind
variables:
MESON_OPTIONS: "-Dsession-managers=[]"
build_with_coverity:
extends:
@ -383,6 +399,7 @@ build_with_coverity:
-Dvulkan=enabled
-Dsdl2=enabled
-Dsndfile=enabled
-Dsession-managers=[]
- cov-configure --config coverity_conf.xml
--comptype gcc --compiler cc --template
--xml-option=append_arg@C:--ppp_translator
@ -432,6 +449,18 @@ doccheck:
git grep -q -e "\\\subpage $page" || (echo "\\page $page is missing \\subpage entry in doc/pipewire-modules.dox" && false)
done
check_missing_headers:
extends:
- .fedora
- .not_coverity
- .fdo.distribution-image@fedora
stage: analysis
dependencies:
- build_on_fedora
script:
- export PREFIX=`find -name prefix-*`
- ./.gitlab/ci/check_missing_headers.sh
pages:
extends:
- .not_coverity

View File

@ -38,7 +38,7 @@ gdb:
$(MAKE) run DBG=gdb
valgrind:
$(MAKE) run DBG="DISABLE_RTKIT=1 valgrind --trace-children=yes"
$(MAKE) run DBG="DISABLE_RTKIT=1 PIPEWIRE_DLCLOSE=false valgrind --trace-children=yes"
test: all
ninja -C $(BUILD_ROOT) test

770
NEWS
View File

@ -1,3 +1,771 @@
# PipeWire 0.3.65 (2023-01-26)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Add back the deprecated symbols but make sure a deprecated warning is
emitted for them. This fixes compilation issues in bindings.
- Fix an error in the AVX code that could cause crackling in filter-chain
when using the mixer.
- The convolver in filter-chain can now select an IR from a list of IRs
that best matches the current samplerate. Also resampling of the IR
has been improved.
- A new native module-combine-stream was added. You can use this to create
a 5.1 device from 3 stereo soundcards, for example, or direct the output
to multiple sinks at once.
- Support for Bluetooth MIDI was added. This requires a wireplumber
addition as well.
- An ALSA plugin rule was added to tweak the buffer settings in Davinci
Resolve so that it now runs with acceptable latency. (#1697)
- Support for compress offload was added using tinycompress. This allows
compressed formats to be decoded in hardware using ALSA on some devices.
- Many more buffixes and improvements.
## PipeWire
- Add back the deprecated symbols but make sure a deprecated warning is
emitted for them. (#2952)
- Fix a regression when running older servers and newer clients (such as
flatpaks on older server) where the server would run clients too soon,
causing crashes. (#2964)
- Ensure that environment variables override any config values.
## Tools
- pw-cli has received some improvements in the output.
- pw-cat can now use ffmpeg to demux streams for compress offload.
## modules
- The convolver IR volume is now preserved after resampling.
- Adapter ports can now have a custom prefix.
- module-rt now clamps the realtime priority to the user allowed one if
it is within an acceptable range. Before it would fall back to RTKit
immediately.
- The module-echo-cancel can now have per stream channel layouts which
makes it possible to link to specific audio ports on a device. (#2939)
- Fix an error in the AVX code that could cause crackling in filter-chain
when using the mixer. (#2965)
- The convolver in filter-chain can now select an IR from a list of IRs
that best matches the current sample-rate.
- module-pipe-* now better matches the pulseaudio properties. (#2973)
- A new combine-stream module was added to combine multiple sinks into
one sink. It is also possible to merge multiple sources into one.
- module-rtp-source now has match rules to select what SAP sessions
to stream from. There were also improvements to the buffering and
latency handling.
- module-rtp-sink now handles multicast loopback correctly.
- module-rtp-sink implements min-ptime and max-ptime to control the
send packet latency.
## SPA
- A new modifier flag was added to the video format parser helper to
allow 0 (linear) as a valid modifier. (#2943)
- Params includes were reorganized to make it more scalable. Many compressed
audio formats were added.
- The alsa pcm plugin now handles invalid values from the driver
gracefully. (#2953)
- Fix some potential stuttering cause by wrong scaling and overflow
of the output buffers in audioconvert. (#2680)
- Debug output is now also sent to the log instead of stdout. (#2923)
- A debug context was added to debug macros to implement custom debug
handling. This is used to redirect the debug of pods to the debug log
instead of using some custom duplicated code.
- Fix some warnings for potentially undefined shifts in format
conversion.
- Support for compress offload was added using tinycompress. This is mostly
used on some embedded hardware where decoding of audio formats can be
done in hardware.
## Bluetooth
- Some fixes for LE audio were added.
- Support for Bluetooth MIDI was added. This requires a wireplumber
addition as well.
- Reply OK to empty commands.
- Improve compatibility with some devices that send stray \n such as
the Sennheiser HD 350BT. (#2991)
## pulse-server
- Devices with unsupported formats (by the pulseaudio API) are now also
listed in the pulseaudio API (with invalid formats).
- The native module-combine-stream is used for module-combine-sink.
## JACK
- Make jack.merge-monitor default to true to better match the jack1/2
behaviour. Add an exception for mixxx, which is more usable with
unmerged monitors. (#1760)
## ALSA
- The property handling in the ALSA plugin was improved. alsa.properties
and alsa.rules can now be added to the config file.
- A rule was added to tweak the buffer settings in Davinci Resolve so that
it can run with acceptable latency. (#1697)
- ALSA volume will now also use cubic volumes, like pulseaudio.
- The ALSA ctl plugin now also uses the client-rt.conf file.
- A new alsa.volume-method was added to configure cubic or linear volume.
This can be set per application using the rules.
## GStreamer
- pipewiresrc will now advertize DMABUF support if the pipeline suports
this.
- pipewiresrc will now always be a live source unless told otherwise.
Older versions:
# PipeWire 0.3.64 (2023-01-12)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Clear old buffer memory on ports to fix some SIGBUS errors.
- It is now possible to assign custom port names to the ports from an
adapter. This feature is helpful to those who use a multichannel
interface with long-term connections. This way they can label each
port with its designation, such as an instrument name or anything else
to be displayed in a patchbay or DAW.
- Fix some issues with node suspend and quantum and rate calculations.
- Fix some regressions in pulse-tunnel and RTP-source adaptive resampling
that could cause synchronization problems.
- UCM devices now also have a Pro Audio profile.
- NODE_TARGET (with the object.id) is now deprecated, use TARGET_OBJECT
(with the object.serial, which is not reused and can avoid races).
## PipeWire
- Clear all peer input port buffers when suspending. This fixes some
SIGBUS errors when some plugins were using old memory. (#2914)
- Fix a case where nodes that were not supposed to be suspended, were
kept suspended on a rate change. (#2929)
- Fix an error in the quantum and rate calculations that could cause
nodes to run with wrong quantum and rates when multiple rates were
allowed. (#2925)
## Tools
- pw-dump will now sort dictionaries to make it easier to compare
different outputs.
- Improve output of pw-reserve.
- pw-loopback uses TARGET_OBJECT so you will need to use the serial
id (or better the name) as the target instead of the object id.
## modules
- The filter-chain modules has seen some cleanups, refactoring and
optimizations in the various DSP functions.
- The ROC module now supports setting a custom samplerate.
- ROC 0.2.X is now required.
- The pulse tunnel and RTP source were not updating the rate field
correctly which could cause synchronization problems. (#2891)
- The filter-chain now supports an arbitrary number of control
properties. (#2933)
- It is now possible to assign custom port names to the ports from an
adapter with the PW_KEY_NODE_CHANNELNAMES.
- Support was added for capture and playback props in echo-cancel.
(#2939)
## SPA
- The ACP code now has an option to set the probe samplerate. (#1599)
- UCM devices now also have a Pro Audio profile.
- Filtering of Step ranges is now implemented.
## Pulse-Server
- The channel-map is now set correctly on the echo-cancel module.
- source_master and sink_master are now correctly handled in module
echo-cancel.
- Fix a regression in DRAIN where resuming after a DRAIN would fail.
This caused problems for espeak. (#2928)
- TARGET_OBJECT is now used to make it possible to use the indexes
as a target.
- ladspa-source and remap-source can now also link to monitors.
## ALSA
- The ALSA plugin now handles the target.object correctly when set to
-1. (#2893)
## V4L2
- The v4l2 replacement library now also follows symlinks.
- Support for getting and setting controls was added.
- Support for G_PARM was added.
- The environment variable PIPEWIRE_V4L2_TARGET can be used to force
an application onto a specific camera.
## Bluetooth
- Fix compilation without ldac_abr.
- Fix a missing brace in CIND reply. This could cause some devices to
fail.
- Fix configuration of the initial latency.
## GStreamer
- The device provider now supports setting an fd so that it can connect
to PipeWire sessions from the portal.
- DMABuf support was re-enabled in gstpipewiresrc.
# PipeWire 0.3.63 (2022-12-15)
This is a quick bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Fix a critical bug that causes audio distortion in some cases when using
AVX2.
- Fix a crash in mpv caused by deinit of PipeWire.
- Resample the convolver IR to match the graph samplerate for better
results.
- Many more small bugfixes and improvements.
## PipeWire
- Fix a segfault in the PipeWire deinit code triggered by mpv in some
cases. (#2881)
- Fix docs about SPA_PLUGIN_DIR.
- Always dlclose by default (even under valgrind). Add an option with
PIPEWIRE_DLCLOSE to select alternative behaviour.
- Improve PIPEWIRE_DEBUG category handling.
## modules
- Resample the IR for the convolver when the IR samplerate and graph rate
don't match.
## SPA
- Handle spurious reads from timerfd gracefully.
- Fix potential stack-use-after-scope when starting Audacity.
- Fix distorted audio when using AVX2. (#2885)
- Remove fallback to default channel map in channelmix.
- Improve sorting of MIDI events, use the same order as Ardour. (#1816)
- Enable LFE downmixing by default. (#2425)
- Make IEC958/AC3 and IEC958/DTS work better by enforcing a fixed minimal
buffering for the encoder to avoid stuttering. (#2650)
## Pulse-Server
- Add a new pulse.cmd config section to execute pulse commands, currently
only for loading modules. This removes the dependency on pactl.
- Improve debug of messages.
# PipeWire 0.3.62 (2022-12-09)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- A regression in screensharing was fixed. It was caused by a race when
activating links and driver nodes.
- Video transform metadata was added so that cameras and screen sharing
can report the video orientation and transformations.
- Support for the PulseAudio module-gsettings was added to make paprefs
work.
- Support for bluetooth offloading was added. This allows for the bluetooth
reception, decoding and playback to happen completely in hardware.
This also requires some support in WirePlumber.
- Many bugfixes and improvements.
## PipeWire
- More work on stopping nodes in a more controlled way.
- Fix a race in starting nodes and drivers. In some cases the driver
node would already be started while the link to the peer node was not
ready yet. This caused regressions in screen sharing. The driver is
now only started after all the followers and links completed.
- Fix a case where a slow capture stream would not recycle buffers
anymore and stall. (#2874)
- Fix a subtle bug in pw_loop_invoke that could cause callbacks to be
delayed and cause crashes in some cases.
- Fix a case where IPC was done from the data-thread and could cause
crashes.
## Tools
- Silence some expected errors in the pw-top output.
## modules
- The filter-chain has seen some optimizations in the copy plugin and
the convolver.
- The zeroconf plugin will now only unpublish services from the server
that was removed.
- Fix a potential crash when stopping pw-loopback.
- Some harmless errors were turned into info messages.
- Fix some cases where pw_stream methods were called from the data-thread
that could cause segfaults. (#2633)
## SPA
- There is now a video transform metadata that indicates how a video
frame was transformed (rotated/flipped). libcamera and the GStreamer
elements now have support for this metadata.
- The SPA volume plugin is now disabled from the default build.
- Handle missing control info in libcamera.
- Handle errors from loop better, don't call the callbacks on errors.
- Somewhat improve performance in some audioconvert AVX2 code for format
conversion.
- Fix PortConfig and EnumPortConfig params in audioconvert and
audioadapter to reflect what is actually going on instead of using
hardcoded values.
- Pass ignore-dB property correctly in all cases.
- Probing is now done in 48KHz again. (#2857)
## Pulse-server
- IPv4 addresses are now added first to the list and exposed first with
zeroconf discover.
- module-gsettings was added to make paprefs work.
- The pulse.idle.timeout option was disabled by default and only enabled
for selected apps (speech-dispatcher) because it caused some problems
for other apps. (#2880)
## JACK
- Only process valid ports. Could fix some crashes. (#2863)
## Bluetooth
- Support was added for offloading bluetooth handling. Some hardware can
receive, decode and play the bluetooth audio directly in hardware.
# PipeWire 0.3.61 (2022-11-24)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Fix a bug in audioadapter that could cause crashes when switching
bluetooth profiles.
- Fix sound in QEMU, deadbeef and openal again.
- libcamera plugin fixes, dynamic add and remove should now work with
the next wireplumber version.
- Fix a regression in pw-midiplay where the first buffer would not
play and some events would be missing.
- The network module now doesn't export other network sources
anymore.
- pulse-server now detects clients that keep underrunning for a long time
and will pause them to save power.
- Many more bugfixes and improvements.
## PipeWire
- Optimize away some useless graph recalculations.
- Increase alternative sample rates from 16 to 32.
- FreeBSD and musl build fixes.
- Silence some module loading errors when the error can be ignored.
- Fix initial buffer requested size for pw-stream when operating in
async mode. This also indirectly fixes the first buffer in
pw-midiplay. (#2843)
## Modules
- Set the network property on pulse-tunnel streams so that they are
not exported anymore. (#2384)
- Filter-chain has optimized mix functions now.
## SPA
- Handle some errors in libcamera better.
- Fix libcamera remove events. Fix the id allocation for devices.
- Fix a bug in audioadapter where it would not renegotiate after
a port reconfiguration, leading to crashes, especially when
automatically switching profiles in bluetooth. (#2764)
- Do ALSA probing in 44100Hz again. Some devices seem to fail
otherwise for some unknown reason. (#2718)
- Force playback start when the ALSA buffer is full. This fixes sound
in QEMU. (#2830)
- Support Digital 5.1 AC3 for Asus Xonar SE.
- Improve format renegotiation in audioadapter. This makes the ALSA
plugin work again for deadbeef. (#2832)
- Fix latency reporting on adapter DSP ports.
## pulse-server
- Fix a bug where openal based applications would hang. (#2821)
- Improve zeroconf publish. Only publish on the address of the first
running server. This avoids duplicate entries for IPv4 and IPv6.
Add support for republish entries when new servers are started.
- Add a pulse.idle.timeout option (default to 5 seconds) to pause
streams that have been underrunning for this amount of time. Badly
behaving clients will then not keep the graph and device busy so
that devices can be suspended to save battery. This should give
better default behaviour with speech-dispatcher. (#2839)
## JACK
- Add an option to configure the filter character.
- Fix connect_callbacks. It was only called once for output ports.
(#2841)
- Add option to set node.passive on jack clients. Make some quirks
for qsynth to make it suspend and fade out better.
# PipeWire 0.3.60 (2022-11-10)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- The filter-chain now handles errors better and has fixes for many
crasher bugs.
- A new RTP module was added with a sender and receiver. It uses SAP
to announce and consume RTP streams and is compatible with the
PulseAudio RTP modules.
- Many small bluetooth improvements and fixes.
- The alsa plugin will now only start playback when there is data. This
results in better sync and lower latency between capture and playback.
- The v4l2 and libcamera plugins have seen a lot of improvements. They
support control properties now. Also pw-v4l2 has seen many improvements
and mostly passes the v4l2-compliance test now.
- Many more bugfixes and improvements.
## PipeWire
- Code cleanups, compiler warning fixes.
- Add some extra checks to avoid scheduling an inactive node.
- Rework the sequence of events to start and stop nodes.
- Improve param enumeration.
- An option was added to give priority to the Buffer params of the
consumer. This makes it possible to use the default values of the
consumer (instead of the producer) when capturing from a source.
- The graph rate selection was improved to pick a rate closest to the
requested one (instead of picking the default).
## Modules
- Fix some crashes in filter-chain. (#2737)
- X11 Bell module will now be loaded by default when available.
- A new RTP module was added with a sender and receiver. It uses SAP
to announce and consume RTP streams and is compatible with the
PulseAudio RTP modules.
- Improve RAOP compatibility.
- The echo-cancel module now uses the resampler prefill option to align
input and output samples without buffering. Better latency control
when starting and stopping has been implemented.
- The pulse tunnel will now write aligned samples to pulseaudio even
when the ringbuffer wraps around. This fixes playback issues with
multichannel sinks.
- Add a delay option to module-loopback using a ringbuffer.
- Implement echo-cancel params.
- The filter-chain module has better error reporting.
- The LADSPA search path was extended with some more common paths.
- The echo-canceler input can now also be a monitor of a sink. This
improves compatibility with some proton games that expect a real
sink instead of a virtual one.
## Tools
- Better error reporting in pw-link.
- pw-top now also shows IEC958 passthrough formats and JPEG/H264 video
formats.
- pw-top refreshes the screen faster.
- pw-top now prints the state of the node and shows less info for
inactive nodes.
- pw-dump now uses the new seq field in the spa_param_info to discard
old param updates and avoid duplicate params in the output.
## Bluetooth
- Add ModemManager support in the native backend.
- Clean up GetManagedObjects handling.
- Handle QoS from the endpoints in the codec.
- Increase the socket buffer to have more control over the rate and QoS.
- Simplify the packet flushing code.
- Stop processing nodes before destroying them.
- Fix timers when a source switches drivers.
- Codecs can now share endpoints. This reduces the amount of endpoints and
avoids problems with devices that can't handle a large amount of
codec endpoints.
- Report batery status to UPower for HFP AG.
- Fix bitpool increase.
## SPA
- The audioresampler now avoids clicks and pops between activating and
deactivating the adaptive resampler when used by the stream API.
- Use default locale to parse float parameters.
- The upmix functions now have SSE optimizations.
- Avoid recalculating the complete channelmix setup when only the
volume changes.
- The alsa plugin will now only start playback when there is data. This
results in better sync and lower latency between capture and playback.
- The ALSA MIDI sequencer will now pull data from the graph even when it
did not output anything. Fixes some graph stalls with the sequencer in
some cases. (#2775)
- v4l2 and libcamera sources now recycle buffers when nothing is consuming
them. This avoids stalling the graph.
- libcamera now suggests a more appropriate frame size than the smallest
poster frame.
- Improve state changes in audioconvert. (#2764)
- A new seq field was added to spa_param_info to keep track of pending
param updates.
- Support speaker output only on RealTek ALC4080. (#2744)
- The v4l2 source now supports setting controls.
- The libcamera plugin now supports enumerating and setting controls.
- A new unit test for 6.1 channel mapping was added. (#2809) More debug
info was added to audioconvert for the channel matrix.
- Audioconvert will now also upmix a rear-center channel when needed.
## pulse-server
- Add support for the RTP send and recv modules with the new native
RTP module.
- Add option to set latency for pulse-tunnel streams and
module-zeroconf-discover.
- The socket will now be given the same permissions as what pulseaudio
did (0777).
- Implement module-loopback latency_msec correctly with the new delay
parameter.
- sysfs.path is now filled with the same data as pulseaudio.
- The manager now uses the new seq field in the spa_param_info.
- Fix a bug where in some cases the read pointer would get out of sync
and cause too large requests. (#2799)
## ALSA
- The alsa plugin now reuses the stream in prepare which results in
better performance.
- Some deadlocks have been fixed in the ALSA plugin.
- The ALSA plugin reports more accurate timing information in some cases.
## V4l2
- The v4l2 compatibility layer has received a lot of updates.
- Improved node names and format enumeration.
- Support for multiple /dev/videoX devices, each mapped to a unique
PipeWire node.
- Passes the v4l2-compliance test now with both the v4l2 and libcamera
backend in PipeWire.
- Improved mmap support for inline buffer memory. This makes it possible to
consume PipeWire streams.
- Negotiation works more reliably now.
## JACK
- Implement jack_acquire_real_time_scheduling() and
jack_drop_real_time_scheduling() by keeping the thread utils in a global
state.
- Fix jack_client_thread_id() to return NULL when the client is not active,
just like jack1 and jack2.
- An option was added to let the jack_set_buffer_size() function update the
global metadata. A quirk was added so that jack_bufsize uses this new feature
to make the buffer size settings persistent and global, just like jack.
- jack_port_register() and jack_port_unregister() can be called on an
active client so make this thread safe. (#2652)
# PipeWire 0.3.59 (2022-09-30)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Fix possible wrong samplerate in loopback streams after suspend and
rate switch.
- module-filter-chain can now adapt to the graph samplerate.
- Fix some potential stuttering and crackling in pulse-server.
- Add Bluetooth LE support. This requires experimental kernel and bluez
support.
- The ALSA plugin has more options to control the buffer size. This can
be used to work around high latency in davinci resolve.
- Many bugfixes and improvements.
## PipeWire
- Add audio capture example with volume meter.
- Fix a case where a rate switch would not suspend all the nodes of the
driver first. This could cause wrong samplerates in streams.
- Fix a case where a node would be Paused while still added to the
graph, causing potential crashes. (#2701)
## Modules
- module-filter-chain and module-loopback now use the resample.prefill
option to avoid buffering extra samples and causing unwanted latency
when resampling is activated.
- module-filter-chain can now adapt to the graph samplerate.
- Improve module-raop to support the ALAC codec as raw PCM.
- Improve RTSP parsing to improve compatibility.
## Tools
- Fix 100% CPU in pw-cli monitor mode. (#2709)
- spa-acp-tool can now be exited with ctrl-D.
## SPA
- Various libcamera fixes and improvements.
- Set stride on audioconvert output buffers.
- Make sure we always place the last requested size from the resampler
on the buffers in pw-stream.
- Add resample.prefill option in the resampler to fill the history with
0 so that we don't have smaller buffers at the start.
- Make sure that when an overflow corrupts a POD, that it will always
stay corrupted.
- Rate limit some ALSA warnings and reduce some unwanted warnings.
- Don't recalculate the audioconverter state for each pause/play. (#2701)
- Fix some POD parsing inconsistencies and potential overflows.
- Add support for Asus Xonar SE.
- Fix Flush command handling. It should not stop playback. (#2726)
- Refactor the peaks function and add some unit tests and optimizations.
- The channelmix has an optimized nXm converter and new unit tests.
- Normalization in the channelmixer was fixed.
## pulse-server
- The requested latency of record streams was reduced to fix some
stuttering in Teamspeak. (#2702)
- Tweak the max amount of bytes sent to a client. (#2711) (#2715)
- Improve maxlength calculations, this fixes some crackling noise with
high samplerate and channel counts in some players (audacious).
## Bluetooth
- Merge Bluetooth LE support.
- Make sure we are backward compatible with WirePlumber.
- Fix some HFP and HSP AT command parsing. (#2463)
- Use HFP by default over HSP.
## ALSA
- Increase max number of periods.
- The parameters handling was improved. There is now an option to set the
buffer-bytes of the ALSA plugin.
- PIPEWIRE_ALSA can now be used as an environment variable to restrict the
plugin formats and buffer size.
# PipeWire 0.3.58 (2022-09-15)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Fix a regression that could cause audio crackling.
- Fix a regression in RTKit because rlimit was not set correctly.
- JAVA sound applications will now alsa work with the pulseaudio-alsa plugin.
- pw-top will now show the negotiated formats of devices and streams.
- Fix some potential crashes when starting streams.
- The ALSA plugin has had improved timing reporting and poll descriptor
handling that should improve compatibility.
- Many more improvements and bugfixes.
## PipeWire
- Avoid scheduling nodes before they are added to the graph. This could
avoid some crashes when scheduling nodes that were not completely
started yet. (#2677)
## Tools
- pw-top now also shows the negotiated formats of streams and devices.
(#2566)
- pw-top prints microseconds as "us" now to avoid unicode problems.
## Modules
- Fix compilation with newer lv2.
- Fix setting realtime priority with RTKit, it was not setting rlimit
correctly and RTKit would refuse to change the priority.
- Fix some playback problems with RAOP sink. (#2673)
- Filter chain will now warn when a non-existing control property is
used in the config file. (#2685)
- Filter chain can now handle control port names with ":" in the name.
(#2685)
- The echo-cancel module and interface now has activate/deactivate
functions to make it possible for plugins to reset their state.
## SPA
- Make sure audioconvert uses the given channelmap and channels for the
volumes, even when not negotiated yet. This makes it possible to change
the volume before the node has been negotiated.
- Refactor the peaks resampler. Fix an error in the SSE code.
- Fix DSD min/max rates, avoid exposing impossible rates.
- Set monitor port buffer size correctly. This could cause some crackling
and hickups. (#2677)
- Make ALSA sequencer port names unique.
## Pulse-server
- Rework the capture buffer attributes to better match pulseaudio. This
fixes a regression where opening pavucontrol could cause crackling.
(#2671)
- Implement TRIGGER and PREBUF methods.
- Handle clients that send more than the requested amount of data.
PipeWire will now also keep this as extra buffered data like PulseAudio.
This fixes JAVA sound applications when they are running on top of the
PulseAudio ALSA plugin. (#2626,#2674)
- Update the requested amount of bytes more like PulseAudio. Fixes
stuttering after resume with the GStreamer pulseaudio sink. (#2680)
## ALSA Plugin
- More debug info was added. The time reporting was improved.
- The poll descriptor handling was improved, avoiding some spurious
wakeups. (#1697)
# PipeWire 0.3.57 (2022-09-02)
This is a bugfix release that is API and ABI compatible with previous
0.3.x releases.
## Highlights
- Support masking of conf.d/ files. (#2629)
- Use org.freedesktop.portal.Realtime when available. This does the
correct PID/TID mappings to make realtime also work from flatpaks.
- Fix rate adjustement logic in pulse-tunnel. This would cause
increasing delays and hickups when using tunnels. (#2548)
- Add OPUS as a new vendor codec. Add OPUS-A2DP spec. PipeWire can now
send and reveive OPUS data over bluetooth.
- An AAC decoder was added so that PipeWire can now also function as
an A2DP AAC receiver.
- Fix some issues where the wrong samplerate was used. (#2614)
- Fix rate match for sources. This fixes an error where follower sources
would generate many resync warnings.
- Many more bugfixes and improvements.
## PipeWire
- Support masking of conf.d/ files. (#2629)
- Add some more debug info to memfd.
- Improve data-loop invoke method. Also flush pending items. (#2631)
- Add a filter-chain systemd service file than can be used to start
custom filters placed in ~/.conf/pipewire/filter-chain.d/ (#2553)
- Improve triggered timestamps for remote nodes.
- Fix some potential cross compilation problems due to wrong
host_machine.
- Check return values of pw_getrandom().
## Tools
- Updates to pw-cli manpages. (#2552)
- Remove the pw-cli dump command. It is mostly implemented as part of
wpctl status, pw-dump, pw-link, pw-top and others.
- Clean up resource in pw-cat correctly on errors. (#2651)
## Modules
- Fix compilation of AVB on big-endian. Enable AVB only on Linux.
- Use org.freedesktop.portal.Realtime when available. This does the
correct PID/TID mappings to make realtime also work from flatpaks.
- Fix compilation of ROC module when headers are missing. (#2513)
- Improve some error cleanup paths in protocol-native. Improve connect
and disconnect.
- Fix a potential crash in FFT unload in filter-chain.
- Implement PIPEWIRE_NOTIFICATION_FD for notification when the socket
is ready.
- Try to use rtkit if set_nice() fails.
- Fix rate adjustement logic in pulse-tunnel. This would cause
increasing delays and hickups when using tunnels. (#2548)
- Handle disconnect in pulse-tunnel.
## Bluetooth
- Add OPUS as a new vendor codec. Add OPUS-A2DP spec. PipeWire can now
send and reveive OPUS data over bluetooth.
- An AAC decoder was added so that PipeWire can now also function as
an A2DP AAC receiver.
## SPA
- Tweak the resampler window function some more. (#2574)
- Improve format convert performance in some fallback cases.
- Fix rounding in format conversion on ARM NEON.
- Fix libcamera build error. (#2575)
- Fix some issues where the wrong samplerate was used. (#2614)
- Don't wait for more samples that can fit in the ringbuffer in ALSA.
- Improve buffer size handling in audioconvert, scale the buffers based
on the rate conversion and make things work with really large rate
conversions as well.
- Add more and better debug for ALSA devices.
- Improve channel mix: Filter FC and LFE when copying from a different
layout. Implement STEREO from FC. Avoid generating REAR from FC in PSD
mode.
- Fix rate match for sources. This fixes an error where follower sources
would generate many resync warnings.
- Improve ALSA format negotiation. If the ALSA node is not running and
there was a previously configured format, close and reopen the device
to enumerate and accept all possible formats again. (#2625).
## ALSA
- The alsa plugin will now also save the volumes set with the control
API. This saves the volumes set with alsa-mixer, for example.
## Pulse-server
- Flatpak apps with devices=all (Zoom) will now be granted Manager
permissions.
- Small tweaks to the amount of data sent to clients to work around an
issue in freerdp.
## JACK
- Clean up the transport correctly when closing a client. (#2569)
- Match context properties in addition to node properties for the jack
client rules. (#2580)
- Make sure to return an error when disconnected from the server. (#2606)
- Fix thread cast problem in jack_client_thread_id().
- Increase jack_client_name_size() length and make sure we have space for
the \0 byte.
- JACK clients from the same application will be added to the same group
so that they share the quantum and rate.
# PipeWire 0.3.56 (2022-07-19)
This is a quick bugfix release that is API and ABI compatible with previous
@ -52,8 +820,6 @@ This is a quick bugfix release that is API and ABI compatible with previous
- Add the resampler delay to delay reporting as well.
Older versions:
# PipeWire 0.3.55 (2022-07-12)
This is a quick bugfix release that is API and ABI compatible with previous

View File

@ -55,7 +55,8 @@ applications:
samplerate. This function will attempt to change
the graph samplerate to `denom` and use the
specified `num` as the buffer size.
* `PIPEWIRE_NODE=<id>` to request a link to the specified node
* `PIPEWIRE_NODE=<id>` to request a link to the specified node. The
id can be a node.name or object.serial of the target node.
### Using tools
@ -209,3 +210,9 @@ Join us on IRC at #pipewire on [OFTC](https://www.oftc.net/).
We adhere to the Contributor Covenant for our [code of conduct](CODE_OF_CONDUCT.md).
[Donate using Liberapay](https://liberapay.com/PipeWire/donate).
## Getting help
You can ask for help on the IRC channel (see above). You can also ask
questions by [raising](https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/new)
a gitlab issue.

View File

@ -1,28 +0,0 @@
#!/bin/sh
# This script will tell you if there are headers in the source tree
# that have not been installed in $PREFIX
LIST=""
for i in $(find spa/include -name '*.h' | sed s#spa/include/##);
do
[ -f "$PREFIX/include/spa-0.2/$i" ] || LIST="$i $LIST"
done
for i in $(find src/pipewire -name '*.h' -a -not -name '*private.h' | sed s#src/##);
do
[ -f "$PREFIX/include/pipewire-0.3/$i" ] || LIST="$i $LIST"
done
for i in $LIST;
do
echo "$i not installed"
done
if [ "$LIST" != "" ];
then
exit 1
fi
exit 0

6
debian/changelog vendored
View File

@ -1,3 +1,9 @@
pipewire (0.3.65-ok1) yangtze; urgency=medium
* Build for openkylin.
-- fengzhaoxiang <fengzhaoxiang@kylinos.cn> Tue, 18 Apr 2023 15:20:41 +0800
pipewire (0.3.56-ok2) yangtze; urgency=medium
* Bug号: 无

View File

@ -0,0 +1,21 @@
From: ctf <fengzhaoxiang@kylinos.cn>
Date: Fri, 30 Dec 2022 10:06:11 +0800
Subject: fix: echo cancel module reloading issues
Description: echo cancel module reloading issues
---
src/modules/module-protocol-pulse/modules/module-echo-cancel.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
index 9ecf19f..7811b0e 100644
--- a/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
+++ b/src/modules/module-protocol-pulse/modules/module-echo-cancel.c
@@ -247,6 +247,7 @@ out:
DEFINE_MODULE_INFO(module_echo_cancel) = {
.name = "module-echo-cancel",
+ .load_once = true,
.prepare = module_echo_cancel_prepare,
.load = module_echo_cancel_load,
.unload = module_echo_cancel_unload,

View File

@ -3,9 +3,14 @@ Date: Sun, 17 Jan 2021 11:40:01 +0000
Subject: Don't automatically start pipewire for root logins
---
src/daemon/systemd/user/pipewire.service.in | 1 +
src/daemon/systemd/user/pipewire.socket | 1 +
2 files changed, 2 insertions(+)
--- pipewire-0.3.56.orig/src/daemon/systemd/user/pipewire.service.in
+++ pipewire-0.3.56/src/daemon/systemd/user/pipewire.service.in
diff --git a/src/daemon/systemd/user/pipewire.service.in b/src/daemon/systemd/user/pipewire.service.in
index b9b1373..4236c6b 100644
--- a/src/daemon/systemd/user/pipewire.service.in
+++ b/src/daemon/systemd/user/pipewire.service.in
@@ -14,6 +14,7 @@ Description=PipeWire Multimedia Service
# After=pipewire.socket is not needed, as it is already implicit in the
# socket-service relationship, see systemd.socket(5).
@ -14,8 +19,10 @@ Subject: Don't automatically start pipewire for root logins
[Service]
LockPersonality=yes
--- pipewire-0.3.56.orig/src/daemon/systemd/user/pipewire.socket
+++ pipewire-0.3.56/src/daemon/systemd/user/pipewire.socket
diff --git a/src/daemon/systemd/user/pipewire.socket b/src/daemon/systemd/user/pipewire.socket
index 232bbb8..96bea66 100644
--- a/src/daemon/systemd/user/pipewire.socket
+++ b/src/daemon/systemd/user/pipewire.socket
@@ -1,5 +1,6 @@
[Unit]
Description=PipeWire Multimedia System Socket

View File

@ -1 +1,2 @@
Don-t-automatically-start-pipewire-for-root-logins.patch
0002-fix-echo-cancel-module-reloading-issues.patch

View File

@ -1,13 +1,12 @@
PROJECT_NAME = PipeWire
PROJECT_NUMBER = @PACKAGE_VERSION@
OUTPUT_DIRECTORY = doc
OUTPUT_DIRECTORY = "@output_directory@"
FULL_PATH_NAMES = NO
JAVADOC_AUTOBRIEF = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_ALL = YES
EXTRACT_STATIC = YES
FULL_PATH_NAMES = YES
STRIP_FROM_PATH = @path_prefixes@
STRIP_FROM_INC_PATH = @path_prefixes@
SHOW_FILES = NO

View File

@ -40,5 +40,6 @@ More information on how to configure and use PipeWire.
- [PipeWire: The Linux audio/video bus (LWN)](https://lwn.net/Articles/847412)
- [PipeWire Wikipedia](https://en.wikipedia.org/wiki/PipeWire)
- [Bluetooth, PipeWire and Whatsapp calls](https://gjhenrique.com/pipewire.html)
- [Intoduction to PipeWire](https://bootlin.com/blog/an-introduction-to-pipewire/)
*/

View File

@ -3,6 +3,7 @@ doxyfile_conf.set('PACKAGE_NAME', meson.project_name())
doxyfile_conf.set('PACKAGE_VERSION', meson.project_version())
doxyfile_conf.set('top_srcdir', meson.project_source_root())
doxyfile_conf.set('top_builddir', meson.project_build_root())
doxyfile_conf.set('output_directory', meson.current_build_dir())
dot_found = find_program('dot', required: false).found()
summary({'dot (used with doxygen)': dot_found}, bool_yn: true, section: 'Optional programs')

View File

@ -133,15 +133,14 @@ Allowed configuration file sections are:
# Logging
The `PIPEWIRE_DEBUG` environment variable can be used to enable
more debugging. This variable supports one of two formats:
more debugging. This variable supports the following format:
- `PIPEWIRE_DEBUG=<level>` where `<level>` is either a numerical log level or its
respective key, see below.
- `PIPEWIRE_DEBUG=<glob1>:<level1>,<glob2>:<level2>,...` where the globs are
- `PIPEWIRE_DEBUG=[<level>][,<glob1>:<level1>][,<glob2>:<level2>,...]` where the globs are
shell globs to match on log topics and the levels are the respective
log level to set for that topic. Globs are applied in order and a matching
glob overrides an earlier glob for that category. For example,
`PIPEWIRE_DEBUG=*:E,mod.*:D,mod.foo:X` enables global error messages,
glob overrides an earlier glob for that category. A level without a glob
prefix will set the global log level and is a more preformant version of
`*:<level>`. For example, `PIPEWIRE_DEBUG=E,mod.*:D,mod.foo:X` enables global error messages,
debugging on all modules but no messages on the foo module.
- `<level>` specifies the log level:

View File

@ -54,6 +54,7 @@ List of known modules:
- \subpage page_module_avb
- \subpage page_module_client_device
- \subpage page_module_client_node
- \subpage page_module_combine_stream
- \subpage page_module_echo_cancel
- \subpage page_module_example_sink
- \subpage page_module_example_source
@ -73,6 +74,8 @@ List of known modules:
- \subpage page_module_raop_discover
- \subpage page_module_roc_sink
- \subpage page_module_roc_source
- \subpage page_module_rtp_sink
- \subpage page_module_rtp_source
- \subpage page_module_rt
- \subpage page_module_session_manager
- \subpage page_module_x11_bell

View File

@ -19,7 +19,7 @@ To use a plugin, the following steps are required:
In pseudo-code, loading a logger interface looks like this:
\code{.py}
handle = dlopen("$SPA_PLUGIN_PATH/support/libspa-support.so")
handle = dlopen("$SPA_PLUGIN_DIR/support/libspa-support.so")
factory_enumeration_func = dlsym(handle, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)
spa_log *logger = NULL
@ -49,8 +49,8 @@ are versioned and many versions can live on the same system.
The `spa-inspect` tool provides a CLI interface to inspect SPA plugins:
\verbatim
$ export SPA_PLUGIN_PATH=$(pkg-config --variable plugindir libspa-0.2)
$ spa-inspect ${SPA_PLUGIN_PATH}/support/libspa-support.so
$ export SPA_PLUGIN_DIR=$(pkg-config --variable plugindir libspa-0.2)
$ spa-inspect ${SPA_PLUGIN_DIR}/support/libspa-support.so
...
factory version: 1
factory name: 'support.cpu'
@ -87,11 +87,11 @@ later, instead of hardcoding the plugin name.
To `dlopen` a plugin we then need to prefix the plugin path like this:
\code{.c}
#define SPA_PLUGIN_PATH /usr/lib64/spa-0.2/"
void *hnd = dlopen(SPA_PLUGIN_PATH"/support/libspa-support.so", RTLD_NOW);
#define SPA_PLUGIN_DIR /usr/lib64/spa-0.2/"
void *hnd = dlopen(SPA_PLUGIN_DIR"/support/libspa-support.so", RTLD_NOW);
\endcode
The environment variable `SPA_PLUGIN_PATH` and `pkg-config` variable
The environment variable `SPA_PLUGIN_DIR` and `pkg-config` variable
`plugindir` are usually used to find the location of the plugins. You will
have to do some more work to construct the shared object path.

View File

@ -7,32 +7,36 @@
#include <pipewire/pipewire.h>
/* [roundtrip] */
static int roundtrip(struct pw_core *core, struct pw_main_loop *loop)
struct roundtrip_data {
int pending;
struct pw_main_loop *loop;
};
static void on_core_done(void *data, uint32_t id, int seq)
{
struct spa_hook core_listener;
int pending, done = 0;
void core_event_done(void *object, uint32_t id, int seq) {
if (id == PW_ID_CORE && seq == pending) {
done = 1;
pw_main_loop_quit(loop);
}
}
const struct pw_core_events core_events = {
PW_VERSION_CORE_EVENTS,
.done = core_event_done,
};
struct roundtrip_data *d = data;
spa_zero(core_listener);
pw_core_add_listener(core, &core_listener,
&core_events, NULL);
if (id == PW_ID_CORE && seq == d->pending)
pw_main_loop_quit(d->loop);
}
pending = pw_core_sync(core, PW_ID_CORE, 0);
static void roundtrip(struct pw_core *core, struct pw_main_loop *loop)
{
static const struct pw_core_events core_events = {
PW_VERSION_CORE_EVENTS,
.done = on_core_done,
};
while (!done) {
pw_main_loop_run(loop);
}
spa_hook_remove(&core_listener);
return 0;
struct roundtrip_data d = { .loop = loop };
struct spa_hook core_listener;
pw_core_add_listener(core, &core_listener, &core_events, &d);
d.pending = pw_core_sync(core, PW_ID_CORE, 0);
pw_main_loop_run(loop);
spa_hook_remove(&core_listener);
}
/* [roundtrip] */
@ -50,37 +54,36 @@ static const struct pw_registry_events registry_events = {
int main(int argc, char *argv[])
{
struct pw_main_loop *loop;
struct pw_context *context;
struct pw_core *core;
struct pw_registry *registry;
struct spa_hook registry_listener;
struct pw_main_loop *loop;
struct pw_context *context;
struct pw_core *core;
struct pw_registry *registry;
struct spa_hook registry_listener;
pw_init(&argc, &argv);
pw_init(&argc, &argv);
loop = pw_main_loop_new(NULL /* properties */);
context = pw_context_new(pw_main_loop_get_loop(loop),
NULL /* properties */,
0 /* user_data size */);
loop = pw_main_loop_new(NULL /* properties */);
context = pw_context_new(pw_main_loop_get_loop(loop),
NULL /* properties */,
0 /* user_data size */);
core = pw_context_connect(context,
NULL /* properties */,
0 /* user_data size */);
core = pw_context_connect(context,
NULL /* properties */,
0 /* user_data size */);
registry = pw_core_get_registry(core, PW_VERSION_REGISTRY,
0 /* user_data size */);
registry = pw_core_get_registry(core, PW_VERSION_REGISTRY,
0 /* user_data size */);
spa_zero(registry_listener);
pw_registry_add_listener(registry, &registry_listener,
&registry_events, NULL);
pw_registry_add_listener(registry, &registry_listener,
&registry_events, NULL);
roundtrip(core, loop);
roundtrip(core, loop);
pw_proxy_destroy((struct pw_proxy*)registry);
pw_core_disconnect(core);
pw_context_destroy(context);
pw_main_loop_destroy(loop);
pw_proxy_destroy((struct pw_proxy*)registry);
pw_core_disconnect(core);
pw_context_destroy(context);
pw_main_loop_destroy(loop);
return 0;
return 0;
}
/* [code] */

View File

@ -15,10 +15,9 @@ Let's take the following small method first:
Let's take a look at what this method does.
\code{.c}
struct spa_hook core_listener;
spa_zero(core_listener);
pw_core_add_listener(core, &core_listener,
&core_events, NULL);
struct spa_hook core_listener;
pw_core_add_listener(core, &core_listener, &core_events, &d);
\endcode
First of all we add a listener for the events of the core
@ -26,37 +25,31 @@ object. We are only interested in the `done` event in this
tutorial. This is the event handler:
\code{.c}
int pending, done = 0;
static void on_core_done(void *data, uint32_t id, int seq)
{
struct roundtrip_data *d = data;
void core_event_done(void *data, uint32_t id, int seq) {
if (id == PW_ID_CORE && seq == pending) {
done = 1;
pw_main_loop_quit(loop);
}
}
const struct pw_core_events core_events = {
PW_VERSION_CORE_EVENTS,
.done = core_event_done,
};
if (id == PW_ID_CORE && seq == d->pending)
pw_main_loop_quit(d->loop);
}
\endcode
When the done event is received for an object with id `PW_ID_CORE`
and a certain sequence number `seq`, this function will set the done
variable to 1 and call `pw_main_loop_quit()`.
When the done event is received for an object with id `PW_ID_CORE` and
a certain sequence number `seq`, this function will call `pw_main_loop_quit()`.
Next we do:
\code{.c}
pending = pw_core_sync(core, PW_ID_CORE, 0);
d.pending = pw_core_sync(core, PW_ID_CORE, 0);
\endcode
This triggers the `sync` method on the core object with id
`PW_ID_CORE` and sequence number 0.
Because this is a method on a proxy object, it will be executed
asynchronously and the returns value will reflect this. PipeWire
asynchronously and the return value will reflect this. PipeWire
uses the return values of the underlying SPA (Simple Plugin API)
helper objects (See also [error codes](spa-design.md#error-codes)).
helper objects (See also \ref page_spa_design ).
Because all messages on the PipeWire server are handled sequentially,
the sync method will be executed after all previous methods are
@ -68,9 +61,7 @@ We then run the mainloop to send the messages to the server and
receive the events:
\code{.c}
while (!done) {
pw_main_loop_run(loop);
}
pw_main_loop_run(loop);
\endcode
When we get the done event, we can compare it to the sync method
@ -79,7 +70,7 @@ more pending methods on the server. We can quit the mainloop and
remove the listener:
\code{.c}
spa_hook_remove(&core_listener);
spa_hook_remove(&core_listener);
\endcode
If we add this roundtrip method to our code and call it instead of the
@ -100,7 +91,7 @@ the objects we created. Let's destroy each of them in reverse order that we
created them:
\code{.c}
pw_proxy_destroy((struct pw_proxy*)registry);
pw_proxy_destroy((struct pw_proxy*)registry);
\endcode
The registry is a proxy and can be destroyed with the generic proxy destroy
@ -110,7 +101,7 @@ an error to destroy an object more than once.
We can disconnect from the server with:
\code{.c}
pw_core_disconnect(core);
pw_core_disconnect(core);
\endcode
This will also destroy the core proxy object and will remove the proxies
@ -119,8 +110,8 @@ that might have been created on this connection.
We can finally destroy our context and mainloop to conclude this tutorial:
\code{.c}
pw_context_destroy(context);
pw_main_loop_destroy(loop);
pw_context_destroy(context);
pw_main_loop_destroy(loop);
\endcode
\ref page_tutorial2 | \ref page_tutorial "Index" | \ref page_tutorial4

View File

@ -47,6 +47,8 @@ PipeWire is available from @PACKAGE_URL@
SEE ALSO
========
``pw-top(1)``,
``pw-dump(1)``,
``pw-mon(1)``,
``pw-cat(1)``,
``pw-cli(1)``,

View File

@ -26,9 +26,14 @@ capturing raw or encoded media files on a PipeWire
server. It understands all audio file formats supported by
``libsndfile`` for PCM capture and playback.
It understands standard MIDI files for playback and recording,
It understands standard MIDI files for playback and recording. This tool
will not render MIDI files, it will simply make the MIDI events available
to the graph. You need a MIDI renderer such as qsynth, timidity or a hardware
MIDI rendered to hear the MIDI.
DSD playback is supported with the DSF file format.
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 such
hardware was found.
When the *FILE* is - input and output will be from STDIN and
STDOUT respectively.
@ -60,10 +65,15 @@ OPTIONS
-m | --midi
MIDI mode. *FILE* is a MIDI file. If the tool is called under the name
**pw-midiplay** or **pw-midirecord** 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.
-d | --dsd
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* render the DSD audio. You need a DSD capable
device to play DSD content or this program will exit with an error.
--media-type=VALUE
Set the media type property (default Audio/Midi depending on mode).
@ -150,7 +160,7 @@ OPTIONS
--volume=VALUE
The stream volume, default 1.000.
Depending on the locale you have configured, "," or "." may be
used as a decimal seperator. Check with **locale** command.
used as a decimal separator. Check with **locale** command.
AUTHORS
=======

View File

@ -34,17 +34,20 @@ Use the 'help' command to list the available commands.
GENERAL COMMANDS
================
help
Show a quick help on the commands available.
help | h
Show a quick help on the commands available. It also lists the aliases
for many commands.
quit
quit | q
Exit from **pw-cli**
MODULE MANAGEMENT
=================
| Modules are loaded and unloaded in the local instance and can add
| functionality or objects to the local instance.
| Modules are loaded and unloaded in the local instance, thus the pw-cli
| binary itself and can add functionality or objects to the local
| instance. It is not possible in PipeWire to load modules in another
| instance.
load-module *name* [*arguments...*]
Load a module specified by its name and arguments. For most
@ -105,14 +108,22 @@ create-node *factory-name* [*properties...*]
This command returns a *node variable*.
destroy-node *node-var*
Destroy a node.
export-node *node-id* [*remote-var*]
Export a node from the local instance to the specified instance.
When no instance is specified, the node will be exported to the current
instance.
DEVICE MANAGEMENT
=================
create-device *factory-name* [*properties...*]
Create a device from a factory in the current instance.
Properties are key=value pairs separated by whitespace.
This command returns a *device variable*.
LINK MANAGEMENT
===============
@ -125,8 +136,44 @@ create-link *node-id* *port-id* *node-id* *port-id* [*properties...*]
This command returns a *link variable*.
destroy-link *link-var*
Destroy a link.
GLOBALS MANAGEMENT
==================
destroy *object-id*
Destroy a global object.
PARAMETER MANAGEMENT
====================
enum-params *object-id* *param-id*
Enumerate params of an object.
*param-id* can also be given as the param short name.
set-param *object-id* *param-id* *param-json*
Set param of an object.
*param-id* can also be given as the param short name.
PERMISSION MANAGEMENT
=====================
permissions *client-id* *object-id* *permission*
Set permissions for a client.
*object-id* can be *-1* to set the default permissions.
get-permissions *client-id*
Get permissions of a client.
COMMAND MANAGEMENT
==================
send-command *object-id*
Send a command to an object.
EXAMPLES
========

View File

@ -65,7 +65,7 @@ output ports and their links.
CONNECTING PORTS
================
Whithout any list option (-i, -o or -l), the given ports will be linked.
Without any list option (-i, -o or -l), the given ports will be linked.
Valid port specifications are:
*port-id*

View File

@ -27,6 +27,8 @@ When this program is stopped, a set of **gnuplot** files and a script to generat
SVG files from the .plot files is generated, along with a .html file to
visualize the profiling results in a browser.
This function uses the same data used by *pw-top*.
OPTIONS
=======
@ -52,3 +54,4 @@ SEE ALSO
========
``pipewire(1)``,
``pw-top(1)``,

View File

@ -27,13 +27,15 @@ a tree-like representation.
The columns presented are as follows:
S
Measurement status.
! representing inactive - no connections
Blank representing active
Node status.
E = ERROR
C = CREATING
S = SUSPENDED
I = IDLE
R = RUNNING
ID
The ID of the pipewire node/device, as found in *pw-dump*
The ID of the pipewire node/device, as found in *pw-dump* and *pw-cli*
QUANT
The current quantum (for drivers) and the suggested quantum for follower
@ -61,7 +63,7 @@ RATE
The current rate (for drivers) and the suggested rate for follower
nodes.
This is the rate at which the graph processes data and needs to be combined with
This is the rate at which the *graph* processes data and needs to be combined with
the QUANT value to derive the duration of a processing cycle in the graph.
Some nodes can have a 0 RATE, which means that they don't have any rate
@ -72,7 +74,8 @@ RATE
The RATE on (audio) driver nodes usually also translates directly to the
samplerate used by the device. Although some devices might not be able to
operate at the given samplerate, in which case resampling will need to be
done.
done. The negotiated samplerate with the device and stream can be found in
the FORMAT column.
WAIT
The waiting time of a node is the elapsed time between when the node
@ -125,6 +128,21 @@ ERR
Xruns for followers are incremented when the node started processing but
did not complete before the end of the graph cycle deadline.
FORMAT
The format used by the driver node or the stream. This is the hardware format
negotiated with the device or stream.
If the stream of driver has a different rate than the graph, resampling will
be done.
For raw audio formats, the layout is <sampleformat> <channels> <samplerate>.
For IEC958 passthrough audio formats, the layout is IEC958 <codec> <samplerate>.
For DSD formats, the layout is <dsd-rate> <channels>.
For Video formats, the layout is <pixelformat> <width>x<height>.
NAME
Name assigned to the device/node, as found in *pw-dump* node.name
@ -154,4 +172,7 @@ SEE ALSO
========
``pipewire(1)``,
``pw-dump(1)``,
``pw-cli(1)``,
``pw-profiler(1)``,

View File

@ -1,9 +1,9 @@
project('pipewire', ['c' ],
version : '0.3.56',
version : '0.3.65',
license : [ 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ],
meson_version : '>= 0.59.0',
default_options : [ 'warning_level=3',
'c_std=gnu99',
'c_std=gnu11',
'cpp_std=c++17',
'b_pie=true',
#'b_sanitize=address,undefined',
@ -67,6 +67,7 @@ cc = meson.get_compiler('c')
common_flags = [
'-fvisibility=hidden',
'-fno-strict-aliasing',
'-Werror=suggest-attribute=format',
'-Wsign-compare',
'-Wpointer-arith',
@ -97,7 +98,7 @@ have_cpp = add_languages('cpp', native: false, required : false)
if have_cpp
cxx = meson.get_compiler('cpp')
cxx_flags = common_flags
cxx_flags = common_flags + [ '-Wno-c99-designator' ]
add_project_arguments(cxx.get_supported_arguments(cxx_flags), language: 'cpp')
endif
@ -259,12 +260,25 @@ cdata.set('HAVE_DBUS', dbus_dep.found())
sdl_dep = dependency('sdl2', required : get_option('sdl2'))
summary({'SDL2 (video examples)': sdl_dep.found()}, bool_yn: true, section: 'Misc dependencies')
drm_dep = dependency('libdrm', required : false)
readline_dep = dependency('readline', required : false)
readline_dep = dependency('readline', required : get_option('readline'))
if not readline_dep.found()
readline_dep = cc.find_library('readline', required: false)
readline_dep = cc.find_library('readline', required : get_option('readline'))
endif
# Both the FFmpeg SPA plugin and the pw-cat FFmpeg integration use libavcodec.
# But only the latter also needs libavformat.
# Search for these libraries here, globally, so both of these subprojects can reuse the results.
pw_cat_ffmpeg = get_option('pw-cat-ffmpeg')
ffmpeg = get_option('ffmpeg')
if pw_cat_ffmpeg.allowed() or ffmpeg.allowed()
avcodec_dep = dependency('libavcodec', required: pw_cat_ffmpeg.enabled() or ffmpeg.enabled())
avformat_dep = dependency('libavformat', required: pw_cat_ffmpeg.enabled())
else
avcodec_dep = dependency('', required: false)
endif
cdata.set('HAVE_PW_CAT_FFMPEG_INTEGRATION', pw_cat_ffmpeg.allowed())
summary({'readline (for pw-cli)': readline_dep.found()}, bool_yn: true, section: 'Misc dependencies')
cdata.set('HAVE_READLINE', readline_dep.found())
ncurses_dep = dependency('ncursesw', required : false)
@ -295,6 +309,14 @@ 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'))
summary({'GLib-2.0 (Flatpak support)': glib2_dep.found()}, bool_yn: true, section: 'Misc dependencies')
flatpak_support = glib2_dep.found()
cdata.set('HAVE_GLIB2', flatpak_support)
gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
summary({'GIO (GSettings)': gio_dep.found()}, bool_yn: true, section: 'Misc dependencies')
gst_option = get_option('gstreamer')
gst_deps_def = {
'glib-2.0': {'version': '>=2.32.0'},
@ -337,11 +359,11 @@ summary({'WebRTC Echo Canceling': webrtc_dep.found()}, bool_yn: true, section: '
cdata.set('HAVE_WEBRTC', webrtc_dep.found())
# On FreeBSD and MidnightBSD, epoll-shim library is required for eventfd() and timerfd()
epoll_shim_dep = (build_machine.system() == 'freebsd' or build_machine.system() == 'midnightbsd'
epoll_shim_dep = (host_machine.system() == 'freebsd' or host_machine.system() == 'midnightbsd'
? dependency('epoll-shim', required: true)
: dependency('', required: false))
libinotify_dep = (build_machine.system() == 'freebsd' or build_machine.system() == 'midnightbsd'
libinotify_dep = (host_machine.system() == 'freebsd' or host_machine.system() == 'midnightbsd'
? dependency('libinotify', required: true)
: dependency('', required: false))
@ -356,7 +378,7 @@ need_alsa = get_option('pipewire-alsa').enabled() or 'media-session' in get_opti
alsa_dep = dependency('alsa', version : '>=1.1.7', required: need_alsa)
summary({'pipewire-alsa': alsa_dep.found()}, bool_yn: true)
if build_machine.system() == 'freebsd' or build_machine.system() == 'midnightbsd'
if host_machine.system() == 'freebsd' or host_machine.system() == 'midnightbsd'
# On FreeBSD and MidnightBSD the OpenSSL library may come from base or a package.
# Check for a package first and fallback to the base library if we can't find it via pkgconfig
openssl_lib = dependency('openssl', required: false)

View File

@ -92,6 +92,10 @@ option('bluez5-backend-hfp-native',
description: 'Enable HFP in native backend in bluez5 spa plugin',
type: 'feature',
value: 'enabled')
option('bluez5-backend-native-mm',
description: 'Enable ModemManager in native backend in bluez5 spa plugin',
type: 'feature',
value: 'disabled')
option('bluez5-backend-ofono',
description: 'Enable oFono HFP backend in bluez5 spa plugin (no dependency on oFono)',
type: 'feature',
@ -116,6 +120,14 @@ option('bluez5-codec-lc3plus',
description: 'Enable LC3plus open source codec implementation',
type: 'feature',
value: 'auto')
option('bluez5-codec-opus',
description: 'Enable Opus open source codec implementation',
type: 'feature',
value: 'auto')
option('bluez5-codec-lc3',
description: 'Enable LC3 open source codec implementation',
type: 'feature',
value: 'disabled')
option('control',
description: 'Enable control spa plugin integration',
type: 'feature',
@ -165,9 +177,9 @@ option('videotestsrc',
type: 'feature',
value: 'enabled')
option('volume',
description: 'Enable volume spa plugin integration',
description: 'Build the legacy volume spa plugin',
type: 'feature',
value: 'enabled')
value: 'disabled')
option('vulkan',
description: 'Enable vulkan spa plugin integration',
type: 'feature',
@ -176,6 +188,10 @@ option('pw-cat',
description: 'Build pw-cat/pw-play/pw-record',
type: 'feature',
value: 'auto')
option('pw-cat-ffmpeg',
description: 'Enable FFmpeg integration in pw-cat/pw-play/pw-record',
type: 'feature',
value: 'disabled')
option('udev',
description: 'Enable Udev integration',
type: 'feature',
@ -220,7 +236,7 @@ option('libusb',
option('session-managers',
description : 'Session managers to build (can be [] for none or an absolute path)',
type : 'array',
value : ['media-session'])
value : ['wireplumber'])
option('raop',
description: 'Enable module for Remote Audio Output Protocol',
type: 'feature',
@ -249,3 +265,19 @@ option('avb',
description: 'Enable AVB code',
type: 'feature',
value: 'auto')
option('flatpak',
description: 'Enable Flatpak support',
type: 'feature',
value: 'enabled')
option('readline',
description: 'Enable code that depends on libreadline',
type: 'feature',
value: 'auto')
option('gsettings',
description: 'Enable code that depends on gsettings',
type: 'feature',
value: 'auto')
option('compress-offload',
description: 'Enable ALSA Compress-Offload support',
type: 'feature',
value: 'disabled')

View File

@ -37,7 +37,10 @@
PW_LOG_TOPIC_STATIC(alsa_log_topic, "alsa.ctl");
#define PW_LOG_TOPIC_DEFAULT alsa_log_topic
#define VOLUME_MAX 65536
#define DEFAULT_VOLUME_METHOD "cubic"
#define VOLUME_MIN ((uint32_t) 0U)
#define VOLUME_MAX ((uint32_t) 0x10000U)
struct volume {
uint32_t channels;
@ -47,6 +50,8 @@ struct volume {
typedef struct {
snd_ctl_ext_t ext;
struct pw_properties *props;
struct spa_system *system;
struct pw_thread_loop *mainloop;
@ -74,6 +79,9 @@ typedef struct {
struct volume source_volume;
int subscribed;
#define VOLUME_METHOD_LINEAR (0)
#define VOLUME_METHOD_CUBIC (1)
int volume_method;
#define UPDATE_SINK_VOL (1<<0)
#define UPDATE_SINK_MUTE (1<<1)
@ -84,6 +92,32 @@ typedef struct {
struct spa_list globals;
} snd_ctl_pipewire_t;
static inline uint32_t volume_from_linear(float vol, int method)
{
if (vol <= 0.0f)
vol = 0.0f;
switch (method) {
case VOLUME_METHOD_CUBIC:
vol = cbrtf(vol);
break;
}
return SPA_CLAMP((uint64_t)lroundf(vol * VOLUME_MAX),
VOLUME_MIN, VOLUME_MAX);
}
static inline float volume_to_linear(uint32_t vol, int method)
{
float v = ((float)vol) / VOLUME_MAX;
switch (method) {
case VOLUME_METHOD_CUBIC:
v = v * v * v;
break;
}
return v;
}
struct global;
struct global_info {
@ -416,7 +450,7 @@ static int pipewire_get_integer_info(snd_ctl_ext_t * ext,
long *imax, long *istep)
{
*istep = 1;
*imin = 0;
*imin = VOLUME_MIN;
*imax = VOLUME_MAX;
return 0;
@ -476,7 +510,8 @@ finish:
return err;
}
static struct spa_pod *build_volume_mute(struct spa_pod_builder *b, struct volume *volume, int *mute)
static struct spa_pod *build_volume_mute(struct spa_pod_builder *b, struct volume *volume,
int *mute, int volume_method)
{
struct spa_pod_frame f[1];
@ -488,7 +523,7 @@ static struct spa_pod *build_volume_mute(struct spa_pod_builder *b, struct volum
n_volumes = volume->channels;
for (i = 0; i < n_volumes; i++)
volumes[i] = volume->values[i] / (float) VOLUME_MAX;
volumes[i] = volume_to_linear(volume->values[i], volume_method);
spa_pod_builder_prop(b, SPA_PROP_channelVolumes, 0);
spa_pod_builder_array(b, sizeof(float),
@ -532,10 +567,11 @@ static int set_volume_mute(snd_ctl_pipewire_t *ctl, const char *name, struct vol
spa_pod_builder_add(&b,
SPA_PARAM_ROUTE_index, SPA_POD_Int(id),
SPA_PARAM_ROUTE_device, SPA_POD_Int(device_id),
SPA_PARAM_ROUTE_save, SPA_POD_Bool(true),
0);
spa_pod_builder_prop(&b, SPA_PARAM_ROUTE_props, 0);
build_volume_mute(&b, volume, mute);
build_volume_mute(&b, volume, mute, ctl->volume_method);
param = spa_pod_builder_pop(&b, &f[0]);
pw_log_debug("set device %d mute/volume for node %d", dg->id, g->id);
@ -545,7 +581,7 @@ static int set_volume_mute(snd_ctl_pipewire_t *ctl, const char *name, struct vol
if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_W | PW_PERM_X))
return -EPERM;
param = build_volume_mute(&b, volume, mute);
param = build_volume_mute(&b, volume, mute, ctl->volume_method);
pw_log_debug("set node %d mute/volume", g->id);
pw_node_set_param((struct pw_node*)g->proxy,
@ -760,6 +796,7 @@ static void snd_ctl_pipewire_free(snd_ctl_pipewire_t *ctl)
spa_system_close(ctl->system, ctl->fd);
if (ctl->mainloop)
pw_thread_loop_destroy(ctl->mainloop);
pw_properties_free(ctl->props);
free(ctl);
}
@ -815,6 +852,7 @@ static void parse_props(struct global *g, const struct spa_pod *param, bool devi
{
struct spa_pod_prop *prop;
struct spa_pod_object *obj = (struct spa_pod_object *) param;
snd_ctl_pipewire_t *ctl = g->ctl;
SPA_POD_OBJECT_FOREACH(obj, prop) {
switch (prop->key) {
@ -840,7 +878,8 @@ static void parse_props(struct global *g, const struct spa_pod *param, bool devi
g->node.channel_volume.channels = n_volumes;
for (i = 0; i < n_volumes; i++)
g->node.channel_volume.values[i] = volumes[i] * VOLUME_MAX;
g->node.channel_volume.values[i] =
volume_from_linear(volumes[i], ctl->volume_method);
SPA_FLAG_UPDATE(g->node.flags, NODE_FLAG_DEVICE_VOLUME, device);
pw_log_debug("update node %d channelVolumes", g->id);
@ -1082,6 +1121,7 @@ static void proxy_destroy(void *data)
struct global *g = data;
spa_list_remove(&g->link);
g->proxy = NULL;
pw_properties_free(g->props);
}
static const struct pw_proxy_events proxy_events = {
@ -1228,6 +1268,14 @@ static const struct pw_core_events core_events = {
.done = on_core_done,
};
static int execute_match(void *data, const char *location, const char *action,
const char *val, size_t len)
{
snd_ctl_pipewire_t *ctl = data;
if (spa_streq(action, "update-props"))
pw_properties_update_string(ctl->props, val, len);
return 1;
}
SPA_EXPORT
SND_CTL_PLUGIN_DEFINE_FUNC(pipewire)
@ -1240,7 +1288,6 @@ SND_CTL_PLUGIN_DEFINE_FUNC(pipewire)
const char *fallback_name = NULL;
int err;
const char *str;
struct pw_properties *props = NULL;
snd_ctl_pipewire_t *ctl;
struct pw_loop *loop;
@ -1303,10 +1350,6 @@ SND_CTL_PLUGIN_DEFINE_FUNC(pipewire)
return -EINVAL;
}
str = getenv("PIPEWIRE_REMOTE");
if (str != NULL && str[0] != '\0')
server = str;
if (fallback_name && name && spa_streq(name, fallback_name))
fallback_name = NULL; /* no fallback for the same name */
@ -1341,30 +1384,57 @@ SND_CTL_PLUGIN_DEFINE_FUNC(pipewire)
goto error;
}
ctl->context = pw_context_new(loop, NULL, 0);
ctl->context = pw_context_new(loop,
pw_properties_new(
PW_KEY_CLIENT_API, "alsa",
PW_KEY_CONFIG_NAME, "client-rt.conf",
NULL),
0);
if (ctl->context == NULL) {
err = -errno;
goto error;
}
props = pw_properties_new(NULL, NULL);
if (props == NULL) {
ctl->props = pw_properties_new(NULL, NULL);
if (ctl->props == NULL) {
err = -errno;
goto error;
}
pw_properties_setf(props, PW_KEY_APP_NAME, "PipeWire ALSA [%s]",
pw_get_prgname());
if (server)
pw_properties_set(props, PW_KEY_REMOTE_NAME, server);
pw_properties_set(ctl->props, PW_KEY_REMOTE_NAME, server);
pw_context_conf_update_props(ctl->context, "alsa.properties", ctl->props);
pw_context_conf_section_match_rules(ctl->context, "alsa.rules",
&pw_context_get_properties(ctl->context)->dict,
execute_match, ctl);
if (pw_properties_get(ctl->props, PW_KEY_APP_NAME) == NULL)
pw_properties_setf(ctl->props, PW_KEY_APP_NAME, "PipeWire ALSA [%s]",
pw_get_prgname());
str = getenv("PIPEWIRE_ALSA");
if (str != NULL)
pw_properties_update_string(ctl->props, str, strlen(str));
if ((str = pw_properties_get(ctl->props, "alsa.volume-method")) == NULL)
str = DEFAULT_VOLUME_METHOD;
if (spa_streq(str, "cubic"))
ctl->volume_method = VOLUME_METHOD_CUBIC;
else if (spa_streq(str, "linear"))
ctl->volume_method = VOLUME_METHOD_LINEAR;
else {
ctl->volume_method = VOLUME_METHOD_CUBIC;
SNDERR("unknown alsa.volume-method %s, using cubic", str);
}
if ((err = pw_thread_loop_start(ctl->mainloop)) < 0)
goto error;
pw_thread_loop_lock(ctl->mainloop);
ctl->core = pw_context_connect(ctl->context, props, 0);
props = NULL;
ctl->core = pw_context_connect(ctl->context, pw_properties_copy(ctl->props), 0);
if (ctl->core == NULL) {
err = -errno;
goto error_unlock;

View File

@ -21,7 +21,7 @@ pipewire_alsa_ctl_plugin = shared_library('asound_module_ctl_pipewire',
pipewire_alsa_plugin_ctl_sources,
c_args : pipewire_alsa_plugin_c_args,
include_directories : [configinc],
dependencies : [pipewire_dep, alsa_dep],
dependencies : [pipewire_dep, alsa_dep, mathlib],
install : true,
install_dir : pipewire_libdir / 'alsa-lib',
)

View File

@ -44,6 +44,15 @@
#include <pipewire/pipewire.h>
#define ATOMIC_INC(s) __atomic_add_fetch(&(s), 1, __ATOMIC_SEQ_CST)
#define ATOMIC_LOAD(s) __atomic_load_n(&(s), __ATOMIC_SEQ_CST)
#define SEQ_WRITE(s) ATOMIC_INC(s)
#define SEQ_WRITE_SUCCESS(s1,s2) ((s1) + 1 == (s2) && ((s2) & 1) == 0)
#define SEQ_READ(s) ATOMIC_LOAD(s)
#define SEQ_READ_SUCCESS(s1,s2) ((s1) == (s2) && ((s2) & 1) == 0)
PW_LOG_TOPIC_STATIC(alsa_log_topic, "alsa.pcm");
#define PW_LOG_TOPIC_DEFAULT alsa_log_topic
@ -55,12 +64,17 @@ PW_LOG_TOPIC_STATIC(alsa_log_topic, "alsa.pcm");
#define MIN_PERIOD 64
#define MIN_PERIOD_BYTES (128)
#define MAX_PERIOD_BYTES (2*1024*1024)
#define MIN_BUFFER_BYTES (2*MIN_PERIOD_BYTES)
#define MAX_BUFFER_BYTES (2*MAX_PERIOD_BYTES)
typedef struct {
snd_pcm_ioplug_t io;
char *node_name;
char *target;
char *role;
snd_output_t *output;
FILE *log_file;
int fd;
int error;
@ -69,6 +83,7 @@ typedef struct {
unsigned int draining:1;
unsigned int xrun_detected:1;
unsigned int hw_params_changed:1;
unsigned int active:1;
snd_pcm_uframes_t hw_ptr;
snd_pcm_uframes_t boundary;
@ -80,62 +95,67 @@ typedef struct {
struct spa_system *system;
struct pw_thread_loop *main_loop;
struct pw_properties *props;
struct pw_context *context;
struct pw_core *core;
struct spa_hook core_listener;
uint32_t flags;
struct pw_stream *stream;
struct spa_hook stream_listener;
struct pw_time time;
int64_t delay;
uint64_t transfered;
uint64_t buffered;
int64_t now;
uintptr_t seq;
struct spa_audio_info_raw format;
} snd_pcm_pipewire_t;
static int snd_pcm_pipewire_stop(snd_pcm_ioplug_t *io);
static int block_check(snd_pcm_ioplug_t *io)
static int check_active(snd_pcm_ioplug_t *io)
{
snd_pcm_pipewire_t *pw = io->private_data;
snd_pcm_sframes_t avail;
uint64_t val;
bool active;
avail = snd_pcm_ioplug_avail(io, pw->hw_ptr, io->appl_ptr);
if (avail >= 0 && avail < (snd_pcm_sframes_t)pw->min_avail) {
spa_system_eventfd_read(pw->system, io->poll_fd, &val);
return 1;
}
return 0;
}
static int pcm_poll_block_check(snd_pcm_ioplug_t *io)
{
snd_pcm_pipewire_t *pw = io->private_data;
if (io->state == SND_PCM_STATE_DRAINING) {
uint64_t val;
spa_system_eventfd_read(pw->system, io->poll_fd, &val);
return 0;
} else if (io->state == SND_PCM_STATE_RUNNING ||
(io->state == SND_PCM_STATE_PREPARED && io->stream == SND_PCM_STREAM_CAPTURE)) {
return block_check(io);
active = pw->drained;
}
return 0;
else if (avail >= 0 && avail < (snd_pcm_sframes_t)pw->min_avail) {
active = false;
}
else if (avail >= (snd_pcm_sframes_t)pw->min_avail) {
active = true;
} else {
active = false;
}
if (pw->active != active) {
pw_log_trace("%p: avail:%lu min-avail:%lu state:%s hw:%lu appl:%lu active:%d->%d state:%s",
pw, avail, pw->min_avail, snd_pcm_state_name(io->state),
pw->hw_ptr, io->appl_ptr, pw->active, active,
snd_pcm_state_name(io->state));
}
return active;
}
static inline int pcm_poll_unblock_check(snd_pcm_ioplug_t *io)
static int update_active(snd_pcm_ioplug_t *io)
{
snd_pcm_pipewire_t *pw = io->private_data;
snd_pcm_uframes_t avail;
pw->active = check_active(io);
uint64_t val;
avail = snd_pcm_ioplug_avail(io, pw->hw_ptr, io->appl_ptr);
if (avail >= pw->min_avail || io->state == SND_PCM_STATE_DRAINING) {
spa_system_eventfd_write(pw->system, pw->fd, 1);
return 1;
}
return 0;
if (pw->active || pw->error < 0)
spa_system_eventfd_write(pw->system, io->poll_fd, 1);
else
spa_system_eventfd_read(pw->system, io->poll_fd, &val);
return pw->active;
}
static void snd_pcm_pipewire_free(snd_pcm_pipewire_t *pw)
@ -143,7 +163,7 @@ static void snd_pcm_pipewire_free(snd_pcm_pipewire_t *pw)
if (pw == NULL)
return;
pw_log_debug("%p:", pw);
pw_log_debug("%p: free", pw);
if (pw->main_loop)
pw_thread_loop_stop(pw->main_loop);
if (pw->stream)
@ -154,15 +174,16 @@ static void snd_pcm_pipewire_free(snd_pcm_pipewire_t *pw)
spa_system_close(pw->system, pw->fd);
if (pw->main_loop)
pw_thread_loop_destroy(pw->main_loop);
free(pw->node_name);
free(pw->target);
pw_properties_free(pw->props);
snd_output_close(pw->output);
fclose(pw->log_file);
free(pw);
}
static int snd_pcm_pipewire_close(snd_pcm_ioplug_t *io)
{
snd_pcm_pipewire_t *pw = io->private_data;
pw_log_debug("%p:", pw);
pw_log_debug("%p: close", pw);
snd_pcm_pipewire_free(pw);
return 0;
}
@ -170,7 +191,7 @@ static int snd_pcm_pipewire_close(snd_pcm_ioplug_t *io)
static int snd_pcm_pipewire_poll_descriptors(snd_pcm_ioplug_t *io, struct pollfd *pfds, unsigned int space)
{
snd_pcm_pipewire_t *pw = io->private_data;
pcm_poll_unblock_check(io); /* unblock socket for polling if needed */
update_active(io);
pfds->fd = pw->fd;
pfds->events = POLLIN | POLLERR | POLLNVAL;
return 1;
@ -188,8 +209,10 @@ static int snd_pcm_pipewire_poll_revents(snd_pcm_ioplug_t *io,
return pw->error;
*revents = pfds[0].revents & ~(POLLIN | POLLOUT);
if (pfds[0].revents & POLLIN && !pcm_poll_block_check(io))
if (pfds[0].revents & POLLIN && check_active(io)) {
*revents |= (io->stream == SND_PCM_STREAM_PLAYBACK) ? POLLOUT : POLLIN;
update_active(io);
}
return 0;
}
@ -213,29 +236,40 @@ static snd_pcm_sframes_t snd_pcm_pipewire_pointer(snd_pcm_ioplug_t *io)
static int snd_pcm_pipewire_delay(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp)
{
snd_pcm_pipewire_t *pw = io->private_data;
int64_t elapsed = 0, filled, avail;
uintptr_t seq1, seq2;
int64_t elapsed = 0, delay, now, avail;
struct timespec ts;
int64_t diff;
if (pw->time.rate.num != 0) {
struct timespec ts;
int64_t diff;
do {
seq1 = SEQ_READ(pw->seq);
delay = pw->delay + pw->transfered;
now = pw->now;
if (io->stream == SND_PCM_STREAM_PLAYBACK)
avail = snd_pcm_ioplug_hw_avail(io, pw->hw_ptr, io->appl_ptr);
else
avail = snd_pcm_ioplug_avail(io, pw->hw_ptr, io->appl_ptr);
seq2 = SEQ_READ(pw->seq);
} while (!SEQ_READ_SUCCESS(seq1, seq2));
if (now != 0 && (io->state == SND_PCM_STATE_RUNNING ||
io->state == SND_PCM_STATE_DRAINING)) {
clock_gettime(CLOCK_MONOTONIC, &ts);
diff = SPA_TIMESPEC_TO_NSEC(&ts) - pw->time.now;
elapsed = (pw->time.rate.denom * diff) / (pw->time.rate.num * SPA_NSEC_PER_SEC);
diff = SPA_TIMESPEC_TO_NSEC(&ts) - now;
elapsed = (io->rate * diff) / SPA_NSEC_PER_SEC;
if (io->stream == SND_PCM_STREAM_PLAYBACK)
delay -= SPA_MIN(elapsed, delay);
else
delay += SPA_MIN(elapsed, (int64_t)io->buffer_size);
}
if (io->stream == SND_PCM_STREAM_PLAYBACK)
avail = snd_pcm_ioplug_hw_avail(io, pw->hw_ptr, io->appl_ptr);
else
avail = snd_pcm_ioplug_avail(io, pw->hw_ptr, io->appl_ptr);
filled = pw->time.delay + avail;
*delayp = delay + avail;
if (io->stream == SND_PCM_STREAM_PLAYBACK)
*delayp = filled - SPA_MIN(elapsed, filled);
else
*delayp = filled + elapsed;
pw_log_trace("avail:%"PRIi64" filled %"PRIi64" elapsed:%"PRIi64" delay:%ld %lu %lu",
avail, filled, elapsed, *delayp, pw->hw_ptr, io->appl_ptr);
pw_log_trace("avail:%"PRIi64" filled %"PRIi64" elapsed:%"PRIi64" delay:%ld hw:%lu appl:%lu",
avail, delay, elapsed, *delayp, pw->hw_ptr, io->appl_ptr);
return 0;
}
@ -388,21 +422,19 @@ static void on_stream_process(void *data)
snd_pcm_ioplug_t *io = &pw->io;
struct pw_buffer *b;
snd_pcm_uframes_t hw_avail, before, want, xfer;
struct pw_time pwt;
int64_t delay;
pw_stream_get_time_n(pw->stream, &pw->time, sizeof(pw->time));
pw_stream_get_time_n(pw->stream, &pwt, sizeof(pwt));
if (pw->time.rate.num != 0) {
pw->time.delay = pw->time.delay * io->rate * pw->time.rate.num / pw->time.rate.denom;
pw->time.rate.denom = io->rate;
pw->time.rate.num = 1;
}
delay = pwt.delay;
if (pwt.rate.num != 0)
delay = delay * io->rate * pwt.rate.num / pwt.rate.denom;
before = hw_avail = snd_pcm_ioplug_hw_avail(io, pw->hw_ptr, io->appl_ptr);
if (pw->drained) {
pcm_poll_unblock_check(io); /* unblock socket for polling if needed */
return;
}
if (pw->drained)
goto done;
b = pw_stream_dequeue_buffer(pw->stream);
if (b == NULL)
@ -410,15 +442,28 @@ static void on_stream_process(void *data)
want = b->requested ? b->requested : hw_avail;
SEQ_WRITE(pw->seq);
if (pw->now != pwt.now) {
pw->transfered = pw->buffered;
pw->buffered = 0;
}
xfer = snd_pcm_pipewire_process(pw, b, &hw_avail, want);
pw_log_trace("%p: avail-before:%lu avail:%lu want:%lu xfer:%lu",
pw, before, hw_avail, want, xfer);
pw->delay = delay;
/* the buffer is now queued in the stream and consumed */
if (io->stream == SND_PCM_STREAM_PLAYBACK)
pw->time.delay += xfer;
else
pw->time.delay -= SPA_MIN(pw->time.delay, (int64_t)xfer);
pw->transfered += xfer;
/* more then requested data transfered, use them in next iteration */
pw->buffered = (want == 0 || pw->transfered < want) ? 0 : (pw->transfered % want);
pw->now = pwt.now;
SEQ_WRITE(pw->seq);
pw_log_trace("%p: avail-before:%lu avail:%lu want:%lu xfer:%lu hw:%lu appl:%lu",
pw, before, hw_avail, want, xfer, pw->hw_ptr, io->appl_ptr);
pw_stream_queue_buffer(pw->stream, b);
@ -431,7 +476,8 @@ static void on_stream_process(void *data)
pw->drained = false;
}
}
pcm_poll_unblock_check(io); /* unblock socket for polling if needed */
done:
update_active(io);
}
static const struct pw_stream_events stream_events = {
@ -475,7 +521,6 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
const struct spa_pod *params[1];
uint8_t buffer[1024];
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
struct pw_properties *props;
uint32_t min_period;
pw_thread_loop_lock(pw->main_loop);
@ -484,6 +529,8 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
if (snd_pcm_sw_params_current(io->pcm, swparams) == 0) {
snd_pcm_sw_params_get_avail_min(swparams, &pw->min_avail);
snd_pcm_sw_params_get_boundary(swparams, &pw->boundary);
snd_pcm_sw_params_dump(swparams, pw->output);
fflush(pw->log_file);
} else {
pw->min_avail = io->period_size;
pw->boundary = io->buffer_size;
@ -492,49 +539,31 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
min_period = (MIN_PERIOD * io->rate / 48000);
pw->min_avail = SPA_MAX(pw->min_avail, min_period);
pw_log_debug("%p: prepare %d %p %lu %ld", pw,
pw->error, pw->stream, io->period_size, pw->min_avail);
pw_log_debug("%p: prepare error:%d stream:%p buffer-size:%lu "
"period-size:%lu min-avail:%ld", pw, pw->error,
pw->stream, io->buffer_size, io->period_size, pw->min_avail);
if (pw->error >= 0 && pw->stream != NULL && !pw->hw_params_changed)
goto done;
pw->hw_params_changed = false;
pw_properties_setf(pw->props, PW_KEY_NODE_LATENCY, "%lu/%u", pw->min_avail, io->rate);
pw_properties_setf(pw->props, PW_KEY_NODE_RATE, "1/%u", io->rate);
params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &pw->format);
if (pw->stream != NULL) {
pw_stream_destroy(pw->stream);
pw->stream = NULL;
pw_stream_update_properties(pw->stream, &pw->props->dict);
pw_stream_update_params(pw->stream, params, 1);
goto done;
}
props = pw_properties_new(NULL, NULL);
if (props == NULL)
goto error;
pw_properties_set(props, PW_KEY_CLIENT_API, "alsa");
pw_properties_setf(props, PW_KEY_APP_NAME, "%s", pw_get_prgname());
if (pw_properties_get(props, PW_KEY_NODE_LATENCY) == NULL)
pw_properties_setf(props, PW_KEY_NODE_LATENCY, "%lu/%u", pw->min_avail, io->rate);
if (pw_properties_get(props, PW_KEY_NODE_RATE) == NULL)
pw_properties_setf(props, PW_KEY_NODE_RATE, "1/%u", io->rate);
if (pw->target != NULL &&
pw_properties_get(props, PW_KEY_NODE_TARGET) == NULL)
pw_properties_setf(props, PW_KEY_NODE_TARGET, "%s", pw->target);
if (pw_properties_get(props, PW_KEY_MEDIA_TYPE) == NULL)
pw_properties_set(props, PW_KEY_MEDIA_TYPE, "Audio");
if (pw_properties_get(props, PW_KEY_MEDIA_CATEGORY) == NULL)
pw_properties_set(props, PW_KEY_MEDIA_CATEGORY,
io->stream == SND_PCM_STREAM_PLAYBACK ?
"Playback" : "Capture");
if (pw->role != NULL &&
pw_properties_get(props, PW_KEY_MEDIA_ROLE) == NULL)
pw_properties_setf(props, PW_KEY_MEDIA_ROLE, "%s", pw->role);
pw->stream = pw_stream_new(pw->core, pw->node_name, props);
pw->stream = pw_stream_new(pw->core, NULL, pw_properties_copy(pw->props));
if (pw->stream == NULL)
goto error;
pw_stream_add_listener(pw->stream, &pw->stream_listener, &stream_events, pw);
params[0] = spa_format_audio_raw_build(&b, SPA_PARAM_EnumFormat, &pw->format);
pw->error = 0;
pw_stream_connect(pw->stream,
@ -542,7 +571,6 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
PW_DIRECTION_OUTPUT :
PW_DIRECTION_INPUT,
PW_ID_ANY,
pw->flags |
PW_STREAM_FLAG_AUTOCONNECT |
PW_STREAM_FLAG_MAP_BUFFERS |
PW_STREAM_FLAG_RT_PROCESS,
@ -550,6 +578,7 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
done:
pw->hw_ptr = 0;
pw->now = 0;
pw->xrun_detected = false;
pw->drained = false;
pw->draining = false;
@ -568,9 +597,8 @@ static int snd_pcm_pipewire_start(snd_pcm_ioplug_t *io)
snd_pcm_pipewire_t *pw = io->private_data;
pw_thread_loop_lock(pw->main_loop);
pw_log_debug("%p:", pw);
pw_log_debug("%p: start", pw);
pipewire_start(pw);
block_check(io); /* unblock socket for polling if needed */
pw_thread_loop_unlock(pw->main_loop);
return 0;
}
@ -579,8 +607,8 @@ static int snd_pcm_pipewire_stop(snd_pcm_ioplug_t *io)
{
snd_pcm_pipewire_t *pw = io->private_data;
pw_log_debug("%p:", pw);
pcm_poll_unblock_check(io);
pw_log_debug("%p: stop", pw);
update_active(io);
pw_thread_loop_lock(pw->main_loop);
if (pw->activated && pw->stream != NULL) {
@ -593,7 +621,7 @@ static int snd_pcm_pipewire_stop(snd_pcm_ioplug_t *io)
static int snd_pcm_pipewire_pause(snd_pcm_ioplug_t * io, int enable)
{
pw_log_debug("%p:", io);
pw_log_debug("%p: pause", io);
if (enable)
snd_pcm_pipewire_stop(io);
@ -646,6 +674,9 @@ static int snd_pcm_pipewire_hw_params(snd_pcm_ioplug_t * io,
snd_pcm_pipewire_t *pw = io->private_data;
bool planar;
snd_pcm_hw_params_dump(params, pw->output);
fflush(pw->log_file);
pw_log_debug("%p: hw_params buffer_size:%lu period_size:%lu", pw, io->buffer_size, io->period_size);
switch(io->access) {
@ -799,10 +830,9 @@ static const struct chmap_info chmap_info[] = {
static enum snd_pcm_chmap_position channel_to_chmap(enum spa_audio_channel channel)
{
uint32_t i;
for (i = 0; i < SPA_N_ELEMENTS(chmap_info); i++)
if (chmap_info[i].channel == channel)
return chmap_info[i].pos;
SPA_FOR_EACH_ELEMENT_VAR(chmap_info, info)
if (info->channel == channel)
return info->pos;
return SND_CHMAP_UNKNOWN;
}
@ -822,7 +852,10 @@ static int snd_pcm_pipewire_set_chmap(snd_pcm_ioplug_t * io,
pw->format.channels = map->channels;
for (i = 0; i < map->channels; i++) {
pw->format.position[i] = chmap_to_channel(map->pos[i]);
pw_log_debug("map %d: %d %d", i, map->pos[i], pw->format.position[i]);
pw_log_debug("map %d: %s / %s", i,
snd_pcm_chmap_name(map->pos[i]),
spa_debug_type_find_short_name(spa_type_audio_channel,
pw->format.position[i]));
}
return 1;
}
@ -892,8 +925,7 @@ static snd_pcm_ioplug_callback_t pipewire_pcm_callback = {
.query_chmaps = snd_pcm_pipewire_query_chmaps,
};
static int pipewire_set_hw_constraint(snd_pcm_pipewire_t *pw, int rate,
snd_pcm_format_t format, int channels, int period_bytes)
static int pipewire_set_hw_constraint(snd_pcm_pipewire_t *pw)
{
unsigned int access_list[] = {
SND_PCM_ACCESS_MMAP_INTERLEAVED,
@ -919,32 +951,51 @@ static int pipewire_set_hw_constraint(snd_pcm_pipewire_t *pw, int rate,
#endif
SND_PCM_FORMAT_U8,
};
int val;
int min_rate;
int max_rate;
int min_channels;
int max_channels;
int min_period_bytes;
int max_period_bytes;
int min_buffer_bytes;
int max_buffer_bytes;
const char *str;
snd_pcm_format_t format;
int err;
if (rate > 0) {
min_rate = max_rate = rate;
val = pw_properties_get_uint32(pw->props, "alsa.rate", 0);
if (val > 0) {
min_rate = max_rate = SPA_CLAMP(val, 1, MAX_RATE);
} else {
min_rate = 1;
max_rate = MAX_RATE;
}
if (channels > 0) {
min_channels = max_channels = channels;
val = pw_properties_get_uint32(pw->props, "alsa.channels", 0);
if (val > 0) {
min_channels = max_channels = SPA_CLAMP(val, 1, MAX_CHANNELS);
} else {
min_channels = 1;
max_channels = MAX_CHANNELS;
}
if (period_bytes > 0) {
min_period_bytes = max_period_bytes = period_bytes;
val = pw_properties_get_uint32(pw->props, "alsa.period-bytes", 0);
if (val > 0) {
min_period_bytes = max_period_bytes = SPA_CLAMP(val,
MIN_PERIOD_BYTES, MAX_PERIOD_BYTES);
} else {
min_period_bytes = 128;
max_period_bytes = 2*1024*1024;
min_period_bytes = MIN_PERIOD_BYTES;
max_period_bytes = MAX_PERIOD_BYTES;
}
val = pw_properties_get_uint32(pw->props, "alsa.buffer-bytes", 0);
if (val > 0) {
min_buffer_bytes = max_buffer_bytes = SPA_CLAMP(val,
MIN_BUFFER_BYTES, MAX_BUFFER_BYTES);
} else {
min_buffer_bytes = MIN_BUFFER_BYTES;
max_buffer_bytes = MAX_BUFFER_BYTES;
}
if (min_period_bytes * 2 > max_buffer_bytes)
min_period_bytes = max_period_bytes = max_buffer_bytes / 2;
if ((err = snd_pcm_ioplug_set_param_list(&pw->io, SND_PCM_IOPLUG_HW_ACCESS,
SPA_N_ELEMENTS(access_list), access_list)) < 0 ||
@ -953,17 +1004,20 @@ static int pipewire_set_hw_constraint(snd_pcm_pipewire_t *pw, int rate,
(err = snd_pcm_ioplug_set_param_minmax(&pw->io, SND_PCM_IOPLUG_HW_RATE,
min_rate, max_rate)) < 0 ||
(err = snd_pcm_ioplug_set_param_minmax(&pw->io, SND_PCM_IOPLUG_HW_BUFFER_BYTES,
MIN_BUFFERS*min_period_bytes,
MIN_BUFFERS*max_period_bytes)) < 0 ||
min_buffer_bytes,
max_buffer_bytes)) < 0 ||
(err = snd_pcm_ioplug_set_param_minmax(&pw->io,
SND_PCM_IOPLUG_HW_PERIOD_BYTES,
min_period_bytes,
max_period_bytes)) < 0 ||
(err = snd_pcm_ioplug_set_param_minmax(&pw->io, SND_PCM_IOPLUG_HW_PERIODS,
MIN_BUFFERS, MAX_BUFFERS)) < 0) {
MIN_BUFFERS, 1024)) < 0) {
pw_log_warn("Can't set param list: %s", snd_strerror(err));
return err;
}
format = SND_PCM_FORMAT_UNKNOWN;
if ((str = pw_properties_get(pw->props, "alsa.format")))
format = snd_pcm_format_value(str);
if (format != SND_PCM_FORMAT_UNKNOWN) {
err = snd_pcm_ioplug_set_param_list(&pw->io,
@ -996,7 +1050,7 @@ static void on_core_error(void *data, uint32_t id, int seq, int res, const char
if (id == PW_ID_CORE) {
pw->error = res;
if (pw->fd != -1)
pcm_poll_unblock_check(&pw->io);
update_active(&pw->io);
}
pw_thread_loop_signal(pw->main_loop, false);
}
@ -1006,24 +1060,40 @@ static const struct pw_core_events core_events = {
.error = on_core_error,
};
static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
const char *node_name,
const char *server_name,
const char *playback_node,
const char *capture_node,
const char *role,
snd_pcm_stream_t stream,
int mode,
uint32_t flags,
int rate,
snd_pcm_format_t format,
int channels,
int period_bytes)
static ssize_t log_write(void *cookie, const char *buf, size_t size)
{
int len;
while (size > 0) {
len = strcspn(buf, "\n");
if (len > 0)
pw_log_debug("%.*s", (int)len, buf);
buf += len + 1;
size -= len + 1;
}
return size;
}
static cookie_io_functions_t io_funcs = {
.write = log_write,
};
static int execute_match(void *data, const char *location, const char *action,
const char *val, size_t len)
{
snd_pcm_pipewire_t *pw = data;
if (spa_streq(action, "update-props"))
pw_properties_update_string(pw->props, val, len);
return 1;
}
static int snd_pcm_pipewire_open(snd_pcm_t **pcmp,
struct pw_properties *props, snd_pcm_stream_t stream, int mode)
{
snd_pcm_pipewire_t *pw;
int err;
const char *str;
struct pw_properties *props = NULL;
const char *str, *node_name = NULL;
struct pw_loop *loop;
assert(pcmp);
@ -1031,44 +1101,20 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
if (!pw)
return -ENOMEM;
str = getenv("PIPEWIRE_REMOTE");
if (str != NULL && str[0] != '\0')
server_name = str;
str = getenv("PIPEWIRE_NODE");
pw_log_debug("%p: open %s %d %d %08x %d %s %d %d '%s'", pw, name,
stream, mode, flags, rate,
format != SND_PCM_FORMAT_UNKNOWN ? snd_pcm_format_name(format) : "none",
channels, period_bytes, str);
pw->props = props;
pw->fd = -1;
pw->io.poll_fd = -1;
pw->flags = flags;
if (node_name == NULL)
pw->node_name = spa_aprintf("ALSA %s",
stream == SND_PCM_STREAM_PLAYBACK ? "Playback" : "Capture");
else
pw->node_name = strdup(node_name);
if (pw->node_name == NULL) {
pw->log_file = fopencookie(pw, "w", io_funcs);
if (pw->log_file == NULL) {
pw_log_error("can't create log file: %m");
err = -errno;
goto error;
}
pw->target = NULL;
if (str != NULL)
pw->target = strdup(str);
else {
if (stream == SND_PCM_STREAM_PLAYBACK)
pw->target = playback_node ? strdup(playback_node) : NULL;
else
pw->target = capture_node ? strdup(capture_node) : NULL;
if ((err = snd_output_stdio_attach(&pw->output, pw->log_file, 0)) < 0) {
pw_log_error("can't attach log file: %s", snd_strerror(err));
goto error;
}
pw->role = (role && *role) ? strdup(role) : NULL;
pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
if (pw->main_loop == NULL) {
err = -errno;
@ -1079,26 +1125,48 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
if ((pw->context = pw_context_new(loop,
pw_properties_new(
PW_KEY_CONFIG_NAME, "client-rt.conf",
PW_KEY_CLIENT_API, "alsa",
NULL),
0)) == NULL) {
err = -errno;
goto error;
}
props = pw_properties_new(NULL, NULL);
pw_context_conf_update_props(pw->context, "alsa.properties", pw->props);
pw_properties_setf(props, PW_KEY_APP_NAME, "PipeWire ALSA [%s]",
pw_get_prgname());
pw_context_conf_section_match_rules(pw->context, "alsa.rules",
&pw_context_get_properties(pw->context)->dict, execute_match, pw);
if (server_name)
pw_properties_set(props, PW_KEY_REMOTE_NAME, server_name);
if (pw_properties_get(pw->props, PW_KEY_APP_NAME) == NULL)
pw_properties_setf(pw->props, PW_KEY_APP_NAME, "PipeWire ALSA [%s]",
pw_get_prgname());
if (pw_properties_get(pw->props, PW_KEY_NODE_NAME) == NULL)
pw_properties_setf(pw->props, PW_KEY_NODE_NAME, "ALSA %s",
stream == SND_PCM_STREAM_PLAYBACK ? "Playback" : "Capture");
if (pw_properties_get(pw->props, PW_KEY_MEDIA_TYPE) == NULL)
pw_properties_set(pw->props, PW_KEY_MEDIA_TYPE, "Audio");
if (pw_properties_get(pw->props, PW_KEY_MEDIA_CATEGORY) == NULL)
pw_properties_set(pw->props, PW_KEY_MEDIA_CATEGORY,
stream == SND_PCM_STREAM_PLAYBACK ?
"Playback" : "Capture");
str = getenv("PIPEWIRE_ALSA");
if (str != NULL)
pw_properties_update_string(pw->props, str, strlen(str));
str = getenv("PIPEWIRE_NODE");
if (str != NULL && str[0])
pw_properties_set(pw->props, PW_KEY_TARGET_OBJECT, str);
node_name = pw_properties_get(pw->props, PW_KEY_NODE_NAME);
if (pw_properties_get(pw->props, PW_KEY_MEDIA_NAME) == NULL)
pw_properties_set(pw->props, PW_KEY_MEDIA_NAME, node_name);
if ((err = pw_thread_loop_start(pw->main_loop)) < 0)
goto error;
pw_thread_loop_lock(pw->main_loop);
pw->core = pw_context_connect(pw->context, props, 0);
props = NULL;
pw->core = pw_context_connect(pw->context, pw_properties_copy(pw->props), 0);
if (pw->core == NULL) {
err = -errno;
pw_thread_loop_unlock(pw->main_loop);
@ -1123,21 +1191,21 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
#endif
pw->io.flags |= SND_PCM_IOPLUG_FLAG_MONOTONIC;
if ((err = snd_pcm_ioplug_create(&pw->io, name, stream, mode)) < 0)
if ((err = snd_pcm_ioplug_create(&pw->io, node_name, stream, mode)) < 0)
goto error;
pw_log_debug("%p: open %s %d %d", pw, name, pw->io.stream, mode);
if ((err = pipewire_set_hw_constraint(pw, rate, format, channels,
period_bytes)) < 0)
if ((err = pipewire_set_hw_constraint(pw)) < 0)
goto error;
pw_log_debug("%p: opened name:%s stream:%s mode:%d", pw, node_name,
snd_pcm_stream_name(pw->io.stream), mode);
*pcmp = pw->io.pcm;
return 0;
error:
pw_properties_free(props);
pw_log_debug("%p: failed to open %s :%s", pw, node_name, spa_strerror(err));
snd_pcm_pipewire_free(pw);
return err;
}
@ -1147,22 +1215,19 @@ SPA_EXPORT
SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
{
snd_config_iterator_t i, next;
const char *node_name = NULL;
const char *server_name = NULL;
const char *playback_node = NULL;
const char *capture_node = NULL;
const char *role = NULL;
snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
int rate = 0;
int channels = 0;
int period_bytes = 0;
uint32_t flags = 0;
struct pw_properties *props;
const char *str;
long val;
int err;
pw_init(NULL, NULL);
if (strstr(pw_get_library_version(), "0.2") != NULL)
return -ENOTSUP;
props = pw_properties_new(NULL, NULL);
if (props == NULL)
return -errno;
PW_LOG_TOPIC_INIT(alsa_log_topic);
snd_config_for_each(i, next, conf) {
@ -1173,76 +1238,93 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
if (spa_streq(id, "comment") || spa_streq(id, "type") || spa_streq(id, "hint"))
continue;
if (spa_streq(id, "name")) {
snd_config_get_string(n, &node_name);
if (snd_config_get_string(n, &str) == 0)
pw_properties_set(props, PW_KEY_NODE_NAME, str);
continue;
}
if (spa_streq(id, "server")) {
snd_config_get_string(n, &server_name);
if (snd_config_get_string(n, &str) == 0)
pw_properties_set(props, PW_KEY_REMOTE_NAME, str);
continue;
}
if (spa_streq(id, "playback_node")) {
snd_config_get_string(n, &playback_node);
if (stream == SND_PCM_STREAM_PLAYBACK &&
snd_config_get_string(n, &str) == 0)
if (str != NULL && !spa_streq(str, "-1"))
pw_properties_set(props, PW_KEY_TARGET_OBJECT, str);
continue;
}
if (spa_streq(id, "capture_node")) {
snd_config_get_string(n, &capture_node);
if (stream == SND_PCM_STREAM_CAPTURE &&
snd_config_get_string(n, &str) == 0)
if (str != NULL && !spa_streq(str, "-1"))
pw_properties_set(props, PW_KEY_TARGET_OBJECT, str);
continue;
}
if (spa_streq(id, "role")) {
snd_config_get_string(n, &role);
if (snd_config_get_string(n, &str) == 0)
if (str != NULL && *str)
pw_properties_set(props, PW_KEY_MEDIA_ROLE, str);
continue;
}
if (spa_streq(id, "exclusive")) {
if (snd_config_get_bool(n))
flags |= PW_STREAM_FLAG_EXCLUSIVE;
pw_properties_set(props, PW_KEY_NODE_EXCLUSIVE, "true");
continue;
}
if (spa_streq(id, "rate")) {
long val;
if (snd_config_get_integer(n, &val) == 0)
rate = val;
else
if (snd_config_get_integer(n, &val) == 0) {
if (val != 0)
pw_properties_setf(props, "alsa.rate", "%ld", val);
} else {
SNDERR("%s: invalid type", id);
}
continue;
}
if (spa_streq(id, "format")) {
const char *str;
if (snd_config_get_string(n, &str) == 0) {
format = snd_pcm_format_value(str);
if (format == SND_PCM_FORMAT_UNKNOWN)
SNDERR("%s: invalid value %s", id, str);
if (str != NULL && *str)
pw_properties_set(props, "alsa.format", str);
} else {
SNDERR("%s: invalid type", id);
}
continue;
}
if (spa_streq(id, "channels")) {
long val;
if (snd_config_get_integer(n, &val) == 0)
channels = val;
else
if (snd_config_get_integer(n, &val) == 0) {
if (val != 0)
pw_properties_setf(props, "alsa.channels", "%ld", val);
} else {
SNDERR("%s: invalid type", id);
}
continue;
}
if (spa_streq(id, "period_bytes")) {
if (snd_config_get_integer(n, &val) == 0) {
if (val != 0)
pw_properties_setf(props, "alsa.period-bytes", "%ld", val);
} else {
SNDERR("%s: invalid type", id);
}
continue;
}
if (spa_streq(id, "buffer_bytes")) {
long val;
if (snd_config_get_integer(n, &val) == 0)
period_bytes = val;
else
if (snd_config_get_integer(n, &val) == 0) {
if (val != 0)
pw_properties_setf(props, "alsa.buffer-bytes", "%ld", val);
} else {
SNDERR("%s: invalid type", id);
}
continue;
}
SNDERR("Unknown field %s", id);
pw_properties_free(props);
return -EINVAL;
}
err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node,
capture_node, role, stream, mode, flags, rate, format,
channels, period_bytes);
err = snd_pcm_pipewire_open(pcmp, props, stream, mode);
return err;
}

View File

@ -4,9 +4,14 @@ defaults.pipewire.server "pipewire-0"
defaults.pipewire.node "-1"
defaults.pipewire.exclusive false
defaults.pipewire.role ""
defaults.pipewire.rate 0
defaults.pipewire.format ""
defaults.pipewire.channels 0
defaults.pipewire.period_bytes 0
defaults.pipewire.buffer_bytes 0
pcm.pipewire {
@args [ SERVER NODE EXCLUSIVE ROLE ]
@args [ SERVER NODE EXCLUSIVE ROLE RATE FORMAT CHANNELS PERIOD_BYTES BUFFER_BYTES ]
@args.SERVER {
type string
default {
@ -35,7 +40,41 @@ pcm.pipewire {
name defaults.pipewire.role
}
}
@args.RATE {
type integer
default {
@func refer
name defaults.pipewire.rate
}
}
@args.FORMAT {
type string
default {
@func refer
name defaults.pipewire.format
}
}
@args.CHANNELS {
type integer
default {
@func refer
name defaults.pipewire.channels
}
}
@args.PERIOD_BYTES {
type integer
default {
@func refer
name defaults.pipewire.period_bytes
}
}
@args.BUFFER_BYTES {
type integer
default {
@func refer
name defaults.pipewire.buffer_bytes
}
}
type pipewire
server $SERVER
@ -43,6 +82,11 @@ pcm.pipewire {
capture_node $NODE
exclusive $EXCLUSIVE
role $ROLE
rate $RATE
format $FORMAT
channels $CHANNELS
period_bytes $PERIOD_BYTES
buffer_bytes $BUFFER_BYTES
hint {
show on
description "PipeWire Sound Server"

View File

@ -1,18 +1,18 @@
/*
Copyright (C) 2013 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
@ -30,7 +30,7 @@ extern "C" {
#define JACK_UUID_STRING_SIZE (JACK_UUID_SIZE+1) /* includes trailing null */
#define JACK_UUID_EMPTY_INITIALIZER 0
extern jack_uuid_t jack_client_uuid_generate ();
extern jack_uuid_t jack_client_uuid_generate (void);
extern jack_uuid_t jack_port_uuid_generate (uint32_t port_id);
extern uint32_t jack_uuid_to_index (jack_uuid_t);

View File

@ -24,6 +24,7 @@
#ifndef PIPEWIRE_JACK_EXTENSIONS_H
#define PIPEWIRE_JACK_EXTENSIONS_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {

View File

@ -62,7 +62,7 @@
#define DEFAULT_RT_MAX 88
#define JACK_CLIENT_NAME_SIZE 128
#define JACK_CLIENT_NAME_SIZE 256
#define JACK_PORT_NAME_SIZE 256
#define JACK_PORT_TYPE_SIZE 32
#define MONITOR_EXT " Monitor"
@ -98,6 +98,7 @@ struct globals {
pthread_mutex_t lock;
struct pw_array descriptions;
struct spa_list free_objects;
struct spa_thread_utils *thread_utils;
};
static struct globals globals;
@ -311,6 +312,7 @@ struct client {
struct spa_hook proxy_listener;
struct metadata *metadata;
struct metadata *settings;
uint32_t node_id;
uint32_t serial;
@ -401,6 +403,8 @@ struct client {
int self_connect_mode;
int rt_max;
unsigned int fix_midi_events:1;
unsigned int global_buffer_size:1;
char filter_char;
jack_position_t jack_position;
jack_transport_state_t jack_state;
@ -610,13 +614,9 @@ static void free_port(struct client *c, struct port *p)
{
struct mix *m;
if (!p->valid)
return;
spa_list_consume(m, &p->mix, port_link)
free_mix(c, m);
p->valid = false;
pw_map_remove(&c->ports[p->direction], p->port_id);
free_object(c, p->object);
pw_properties_free(p->props);
@ -800,7 +800,7 @@ void jack_get_version(int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto
} else { \
if (c->active) \
(expr); \
pw_log_debug("skip " #callback \
pw_log_debug("skip " #callback \
" cb:%p active:%d", c->callback, \
c->active); \
} \
@ -817,6 +817,9 @@ void jack_get_version(int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto
res = c->callback(__VA_ARGS__); \
c->rt_locked = false; \
pthread_mutex_unlock(&c->rt_lock); \
} else { \
pw_log_debug("skip " #callback \
" cb:%p", c->callback); \
} \
} \
res; \
@ -871,6 +874,8 @@ static int do_sync(struct client *client)
pw_log_warn("sync requested from callback");
return 0;
}
if (client->last_res == -EPIPE)
return -EPIPE;
client->last_res = 0;
client->pending_sync = pw_proxy_sync((struct pw_proxy*)client->core, client->pending_sync);
@ -997,6 +1002,38 @@ static inline void fix_midi_event(uint8_t *data, size_t size)
}
}
static inline int event_sort(struct spa_pod_control *a, struct spa_pod_control *b)
{
if (a->offset < b->offset)
return -1;
if (a->offset > b->offset)
return 1;
if (a->type != b->type)
return 0;
switch(a->type) {
case SPA_CONTROL_Midi:
{
/* 11 (controller) > 12 (program change) >
* 8 (note off) > 9 (note on) > 10 (aftertouch) >
* 13 (channel pressure) > 14 (pitch bend) */
static int priotab[] = { 5,4,3,7,6,2,1,0 };
uint8_t *da, *db;
if (SPA_POD_BODY_SIZE(&a->value) < 1 ||
SPA_POD_BODY_SIZE(&b->value) < 1)
return 0;
da = SPA_POD_BODY(&a->value);
db = SPA_POD_BODY(&b->value);
if ((da[0] & 0xf) != (db[0] & 0xf))
return 0;
return priotab[(db[0]>>4) & 7] - priotab[(da[0]>>4) & 7];
}
default:
return 0;
}
}
static void convert_to_midi(struct spa_pod_sequence **seq, uint32_t n_seq, void *midi, bool fix)
{
struct spa_pod_control *c[n_seq];
@ -1009,15 +1046,13 @@ static void convert_to_midi(struct spa_pod_sequence **seq, uint32_t n_seq, void
while (true) {
struct spa_pod_control *next = NULL;
uint32_t next_index = 0;
uint8_t *data;
size_t size;
for (i = 0; i < n_seq; i++) {
if (!spa_pod_control_is_inside(&seq[i]->body,
SPA_POD_BODY_SIZE(seq[i]), c[i]))
continue;
if (next == NULL || c[i]->offset < next->offset) {
if (next == NULL || event_sort(c[i], next) <= 0) {
next = c[i];
next_index = i;
}
@ -1025,11 +1060,12 @@ static void convert_to_midi(struct spa_pod_sequence **seq, uint32_t n_seq, void
if (SPA_UNLIKELY(next == NULL))
break;
data = SPA_POD_BODY(&next->value);
size = SPA_POD_BODY_SIZE(&next->value);
switch(next->type) {
case SPA_CONTROL_Midi:
{
uint8_t *data = SPA_POD_BODY(&next->value);
size_t size = SPA_POD_BODY_SIZE(&next->value);
if (fix)
fix_midi_event(data, size);
@ -1038,6 +1074,7 @@ static void convert_to_midi(struct spa_pod_sequence **seq, uint32_t n_seq, void
spa_strerror(res));
break;
}
}
c[next_index] = spa_pod_control_next(c[next_index]);
}
}
@ -1051,7 +1088,7 @@ static inline void *get_buffer_output(struct port *p, uint32_t frames, uint32_t
struct buffer *b;
struct spa_data *d;
if (frames == 0)
if (frames == 0 || !p->valid)
return NULL;
if (SPA_UNLIKELY((mix = p->global_mix) == NULL))
@ -1139,6 +1176,8 @@ static void complete_process(struct client *c, uint32_t frames)
if (pw_map_item_is_free(item))
continue;
p = item->data;
if (!p->valid)
continue;
spa_list_for_each(mix, &p->mix, port_link) {
if (SPA_LIKELY(mix->io != NULL))
mix->io->status = SPA_STATUS_NEED_DATA;
@ -1148,6 +1187,8 @@ static void complete_process(struct client *c, uint32_t frames)
if (pw_map_item_is_free(item))
continue;
p = item->data;
if (!p->valid)
continue;
prepare_output(p, frames);
p->io.status = SPA_STATUS_NEED_DATA;
}
@ -2178,7 +2219,7 @@ static int client_node_port_use_buffers(void *data,
if (n_buffers > MAX_BUFFERS) {
pw_log_error("%p: too many buffers %u > %u", c, n_buffers, MAX_BUFFERS);
return -EINVAL;
return -ENOSPC;
}
if (p->object->port.type_id == TYPE_ID_VIDEO && direction == SPA_DIRECTION_INPUT) {
@ -2479,7 +2520,7 @@ static int client_node_port_set_mix_info(void *data,
else
mix->peer_port = l->port_link.our_input;
pw_log_info("peer port %p %p %p", mix->peer_port,
pw_log_debug("peer port %p %p %p", mix->peer_port,
l->port_link.our_output, l->port_link.our_input);
if (!l->port_link.is_complete) {
@ -2571,11 +2612,18 @@ static int impl_acquire_rt(void *object, struct spa_thread *thread, int priority
return spa_thread_utils_acquire_rt(c->context.old_thread_utils, thread, priority);
}
static int impl_drop_rt(void *object, struct spa_thread *thread)
{
struct client *c = (struct client *) object;
return spa_thread_utils_drop_rt(c->context.old_thread_utils, thread);
}
static struct spa_thread_utils_methods thread_utils_impl = {
SPA_VERSION_THREAD_UTILS_METHODS,
.create = impl_create,
.join = impl_join,
.acquire_rt = impl_acquire_rt,
.drop_rt = impl_drop_rt,
};
static jack_port_type_id_t string_to_type(const char *port_type)
@ -2716,6 +2764,24 @@ static const struct pw_proxy_events metadata_proxy_events = {
.destroy = metadata_proxy_destroy,
};
static void settings_proxy_removed(void *data)
{
struct client *c = data;
pw_proxy_destroy((struct pw_proxy*)c->settings->proxy);
}
static void settings_proxy_destroy(void *data)
{
struct client *c = data;
spa_hook_remove(&c->settings->proxy_listener);
c->settings = NULL;
}
static const struct pw_proxy_events settings_proxy_events = {
PW_VERSION_PROXY_EVENTS,
.removed = settings_proxy_removed,
.destroy = settings_proxy_destroy,
};
static void proxy_removed(void *data)
{
struct object *o = data;
@ -2764,12 +2830,12 @@ static const struct pw_port_events port_events = {
#define FILTER_NAME " ()[].:*$"
#define FILTER_PORT " ()[].*$"
static void filter_name(char *str, const char *filter)
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 = ' ';
*p = filter_char;
}
}
@ -2834,7 +2900,7 @@ static void registry_event_global(void *data, uint32_t id,
snprintf(tmp, sizeof(tmp), "%s", str);
if (c->filter_name)
filter_name(tmp, FILTER_NAME);
filter_name(tmp, FILTER_NAME, c->filter_char);
ot = find_node(c, tmp);
if (ot != NULL && o->node.client_id != ot->node.client_id) {
@ -2951,7 +3017,7 @@ static void registry_event_global(void *data, uint32_t id,
snprintf(tmp, sizeof(tmp), "%s:%s", ot->node.name, str);
if (c->filter_name)
filter_name(tmp, FILTER_PORT);
filter_name(tmp, FILTER_PORT, c->filter_char);
op = find_port_by_name(c, tmp);
if (op != NULL)
@ -3028,24 +3094,34 @@ static void registry_event_global(void *data, uint32_t id,
if (c->metadata != NULL)
goto exit;
if ((str = spa_dict_lookup(props, PW_KEY_METADATA_NAME)) != NULL &&
!spa_streq(str, "default"))
if ((str = spa_dict_lookup(props, PW_KEY_METADATA_NAME)) == NULL)
goto exit;
proxy = pw_registry_bind(c->registry,
id, type, PW_VERSION_METADATA, sizeof(struct metadata));
if (spa_streq(str, "default")) {
proxy = pw_registry_bind(c->registry,
id, type, PW_VERSION_METADATA, sizeof(struct metadata));
c->metadata = pw_proxy_get_user_data(proxy);
c->metadata->proxy = (struct pw_metadata*)proxy;
c->metadata->default_audio_sink[0] = '\0';
c->metadata->default_audio_source[0] = '\0';
c->metadata = pw_proxy_get_user_data(proxy);
c->metadata->proxy = (struct pw_metadata*)proxy;
c->metadata->default_audio_sink[0] = '\0';
c->metadata->default_audio_source[0] = '\0';
pw_proxy_add_listener(proxy,
&c->metadata->proxy_listener,
&metadata_proxy_events, c);
pw_metadata_add_listener(proxy,
&c->metadata->listener,
&metadata_events, c);
pw_proxy_add_listener(proxy,
&c->metadata->proxy_listener,
&metadata_proxy_events, c);
pw_metadata_add_listener(proxy,
&c->metadata->listener,
&metadata_events, c);
} else if (spa_streq(str, "settings")) {
proxy = pw_registry_bind(c->registry,
id, type, PW_VERSION_METADATA, sizeof(struct metadata));
c->settings = pw_proxy_get_user_data(proxy);
c->settings->proxy = (struct pw_metadata*)proxy;
pw_proxy_add_listener(proxy,
&c->settings->proxy_listener,
&settings_proxy_events, c);
}
goto exit;
}
else {
@ -3279,7 +3355,7 @@ jack_client_t * jack_client_open (const char *client_name,
"jack.properties", client->props);
pw_context_conf_section_match_rules(client->context.context, "jack.rules",
&client->props->dict, execute_match, client);
&client->context.context->properties->dict, execute_match, client);
support = pw_context_get_support(client->context.context, &n_support);
@ -3298,6 +3374,8 @@ jack_client_t * jack_client_open (const char *client_name,
if (client->context.old_thread_utils == NULL)
client->context.old_thread_utils = pw_thread_utils_get();
globals.thread_utils = client->context.old_thread_utils;
client->context.thread_utils.iface = SPA_INTERFACE_INIT(
SPA_TYPE_INTERFACE_ThreadUtils,
SPA_VERSION_THREAD_UTILS,
@ -3347,6 +3425,8 @@ jack_client_t * jack_client_open (const char *client_name,
pw_properties_set(client->props, PW_KEY_NODE_LATENCY, str);
if ((str = getenv("PIPEWIRE_RATE")) != NULL)
pw_properties_set(client->props, PW_KEY_NODE_RATE, str);
if ((str = getenv("PIPEWIRE_LINK_PASSIVE")) != NULL)
pw_properties_set(client->props, PW_KEY_NODE_PASSIVE, str);
if ((str = pw_properties_get(client->props, PW_KEY_NODE_LATENCY)) != NULL) {
uint32_t num, denom;
@ -3356,6 +3436,8 @@ jack_client_t * jack_client_open (const char *client_name,
}
if (pw_properties_get(client->props, PW_KEY_NODE_NAME) == NULL)
pw_properties_set(client->props, PW_KEY_NODE_NAME, client_name);
if (pw_properties_get(client->props, PW_KEY_NODE_GROUP) == NULL)
pw_properties_setf(client->props, PW_KEY_NODE_GROUP, "jack-%d", getpid());
if (pw_properties_get(client->props, PW_KEY_NODE_DESCRIPTION) == NULL)
pw_properties_set(client->props, PW_KEY_NODE_DESCRIPTION, client_name);
if (pw_properties_get(client->props, PW_KEY_MEDIA_TYPE) == NULL)
@ -3398,12 +3480,16 @@ jack_client_t * jack_client_open (const char *client_name,
client->info.change_mask = 0;
client->show_monitor = pw_properties_get_bool(client->props, "jack.show-monitor", true);
client->merge_monitor = pw_properties_get_bool(client->props, "jack.merge-monitor", false);
client->merge_monitor = pw_properties_get_bool(client->props, "jack.merge-monitor", true);
client->short_name = pw_properties_get_bool(client->props, "jack.short-name", false);
client->filter_name = pw_properties_get_bool(client->props, "jack.filter-name", false);
client->filter_char = ' ';
if ((str = pw_properties_get(client->props, "jack.filter-char")) != NULL && str[0] != '\0')
client->filter_char = str[0];
client->locked_process = pw_properties_get_bool(client->props, "jack.locked-process", true);
client->default_as_system = pw_properties_get_bool(client->props, "jack.default-as-system", false);
client->fix_midi_events = pw_properties_get_bool(client->props, "jack.fix-midi-events", true);
client->global_buffer_size = pw_properties_get_bool(client->props, "jack.global-buffer-size", false);
client->self_connect_mode = SELF_CONNECT_ALLOW;
if ((str = pw_properties_get(client->props, "jack.self-connect-mode")) != NULL) {
@ -3492,6 +3578,8 @@ int jack_client_close (jack_client_t *client)
res = jack_deactivate(client);
clean_transport(c);
if (c->context.loop)
pw_thread_loop_stop(c->context.loop);
@ -3500,10 +3588,11 @@ int jack_client_close (jack_client_t *client)
pw_proxy_destroy((struct pw_proxy*)c->registry);
}
if (c->metadata && c->metadata->proxy) {
spa_hook_remove(&c->metadata->listener);
spa_hook_remove(&c->metadata->proxy_listener);
pw_proxy_destroy((struct pw_proxy*)c->metadata->proxy);
}
if (c->settings && c->settings->proxy) {
pw_proxy_destroy((struct pw_proxy*)c->settings->proxy);
}
if (c->core) {
spa_hook_remove(&c->core_listener);
@ -3577,8 +3666,9 @@ char *jack_get_internal_client_name (jack_client_t *client,
SPA_EXPORT
int jack_client_name_size (void)
{
pw_log_trace("%d", JACK_CLIENT_NAME_SIZE);
return JACK_CLIENT_NAME_SIZE;
/* The JACK API specifies that this value includes the final NULL character. */
pw_log_trace("%d", JACK_CLIENT_NAME_SIZE+1);
return JACK_CLIENT_NAME_SIZE+1;
}
SPA_EXPORT
@ -3763,14 +3853,10 @@ SPA_EXPORT
jack_native_thread_t jack_client_thread_id (jack_client_t *client)
{
struct client *c = (struct client *) client;
void *thr;
spa_return_val_if_fail(c != NULL, -EINVAL);
spa_return_val_if_fail(c != NULL, (pthread_t){0});
thr = pw_data_loop_get_thread(c->loop);
if (thr == NULL)
return pthread_self();
return *(pthread_t*)thr;
return (jack_native_thread_t)pw_data_loop_get_thread(c->loop);
}
SPA_EXPORT
@ -4127,15 +4213,22 @@ int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes)
pw_log_info("%p: buffer-size %u", client, nframes);
pw_thread_loop_lock(c->context.loop);
pw_properties_setf(c->props, PW_KEY_NODE_FORCE_QUANTUM, "%u", nframes);
if (c->global_buffer_size && c->settings && c->settings->proxy) {
char val[256];
snprintf(val, sizeof(val), "%u", nframes == 1 ? 0: nframes);
pw_metadata_set_property(c->settings->proxy, 0,
"clock.force-quantum", "", val);
} else {
pw_properties_setf(c->props, PW_KEY_NODE_FORCE_QUANTUM, "%u", nframes);
c->info.change_mask |= SPA_NODE_CHANGE_MASK_PROPS;
c->info.props = &c->props->dict;
c->info.change_mask |= SPA_NODE_CHANGE_MASK_PROPS;
c->info.props = &c->props->dict;
pw_client_node_update(c->node,
PW_CLIENT_NODE_UPDATE_INFO,
0, NULL, &c->info);
c->info.change_mask = 0;
pw_client_node_update(c->node,
PW_CLIENT_NODE_UPDATE_INFO,
0, NULL, &c->info);
c->info.change_mask = 0;
}
pw_thread_loop_unlock(c->context.loop);
return 0;
@ -4359,6 +4452,15 @@ jack_port_t * jack_port_register (jack_client_t *client,
return (jack_port_t *) o;
}
static int
do_invalidate_port(struct spa_loop *loop,
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
{
struct port *p = user_data;
p->valid = false;
return 0;
}
SPA_EXPORT
int jack_port_unregister (jack_client_t *client, jack_port_t *port)
{
@ -4379,6 +4481,9 @@ int jack_port_unregister (jack_client_t *client, jack_port_t *port)
res = -EINVAL;
goto done;
}
pw_data_loop_invoke(c->loop,
do_invalidate_port, 1, NULL, 0, !c->data_locked, p);
pw_log_info("%p: port %p unregister \"%s\"", client, port, o->port.name);
pw_client_node_port_update(c->node,
@ -4556,6 +4661,8 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
return SPA_PTROFF(d->data, offset, void);
}
if (!p->valid)
return NULL;
ptr = p->get_buffer(p, frames);
pw_log_trace_fp("%p: port %p buffer %p empty:%u", p->client, p, ptr, p->empty_out);
@ -5103,7 +5210,7 @@ int jack_connect (jack_client_t *client,
items[props.n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_LINK_INPUT_NODE, val[2]);
items[props.n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_LINK_INPUT_PORT, val[3]);
items[props.n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_OBJECT_LINGER, "true");
if ((str = getenv("PIPEWIRE_LINK_PASSIVE")) != NULL &&
if ((str = pw_properties_get(c->props, PW_KEY_NODE_PASSIVE)) != NULL &&
pw_properties_parse_bool(str))
items[props.n_items++] = SPA_DICT_ITEM_INIT(PW_KEY_LINK_PASSIVE, "true");
@ -5484,16 +5591,13 @@ const char ** jack_get_ports (jack_client_t *client,
struct object *o;
struct pw_array tmp;
const char *str;
uint32_t i, count, id;
uint32_t i, count;
int r;
regex_t port_regex, type_regex;
spa_return_val_if_fail(c != NULL, NULL);
if ((str = getenv("PIPEWIRE_NODE")) != NULL)
id = pw_properties_parse_int(str);
else
id = SPA_ID_INVALID;
str = getenv("PIPEWIRE_NODE");
if (port_name_pattern && port_name_pattern[0]) {
if ((r = regcomp(&port_regex, port_name_pattern, REG_EXTENDED | REG_NOSUB)) != 0) {
@ -5508,7 +5612,7 @@ const char ** jack_get_ports (jack_client_t *client,
}
}
pw_log_debug("%p: ports id:%d name:\"%s\" type:\"%s\" flags:%08lx", c, id,
pw_log_debug("%p: ports target:%s name:\"%s\" type:\"%s\" flags:%08lx", c, str,
port_name_pattern, type_name_pattern, flags);
pthread_mutex_lock(&c->context.lock);
@ -5524,8 +5628,11 @@ const char ** jack_get_ports (jack_client_t *client,
continue;
if (!SPA_FLAG_IS_SET(o->port.flags, flags))
continue;
if (id != SPA_ID_INVALID && o->port.node_id != id)
continue;
if (str != NULL && o->port.node != NULL) {
if (!spa_strstartswith(o->port.name, str) &&
o->port.node->serial != atoll(str))
continue;
}
if (port_name_pattern && port_name_pattern[0]) {
bool match;
@ -5705,7 +5812,7 @@ jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t usec
}
SPA_EXPORT
jack_time_t jack_get_time()
jack_time_t jack_get_time(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
@ -6105,15 +6212,21 @@ int jack_client_max_real_time_priority (jack_client_t *client)
SPA_EXPORT
int jack_acquire_real_time_scheduling (jack_native_thread_t thread, int priority)
{
pw_log_info("acquire");
return pw_thread_utils_acquire_rt((struct spa_thread*)thread, priority);
struct spa_thread *t = (struct spa_thread*)thread;
pw_log_info("acquire %p", t);
spa_return_val_if_fail(globals.thread_utils != NULL, -1);
spa_return_val_if_fail(t != NULL, -1);
return spa_thread_utils_acquire_rt(globals.thread_utils, t, priority);
}
SPA_EXPORT
int jack_drop_real_time_scheduling (jack_native_thread_t thread)
{
pw_log_info("drop");
return pw_thread_utils_drop_rt((struct spa_thread*)thread);
struct spa_thread *t = (struct spa_thread*)thread;
pw_log_info("drop %p", t);
spa_return_val_if_fail(globals.thread_utils != NULL, -1);
spa_return_val_if_fail(t != NULL, -1);
return spa_thread_utils_drop_rt(globals.thread_utils, t);
}
/**

View File

@ -33,7 +33,7 @@
#include <pipewire/pipewire.h>
SPA_EXPORT
jack_uuid_t jack_client_uuid_generate ()
jack_uuid_t jack_client_uuid_generate (void)
{
static uint32_t uuid_cnt = 0;
jack_uuid_t uuid = 0x2; /* JackUUIDClient */;

File diff suppressed because it is too large Load Diff

View File

@ -54,10 +54,16 @@ done
shift $(( OPTIND - 1 ))
if [ "$LD_PRELOAD" = "" ] ; then
LD_PRELOAD='@LIBV4L2_PATH@/libpw-v4l2.so'
if [ "$PW_UNINSTALLED" = 1 ] ; then
PW_V4L2_LD_PRELOAD="$PW_BUILDDIR"'/pipewire-v4l2/src/libpw-v4l2.so'
else
LD_PRELOAD="$LD_PRELOAD "'@LIBV4L2_PATH@/libpw-v4l2.so'
PW_V4L2_LD_PRELOAD='@LIBV4L2_PATH@/libpw-v4l2.so'
fi
if [ "$LD_PRELOAD" = "" ] ; then
LD_PRELOAD="$PW_V4L2_LD_PRELOAD"
else
LD_PRELOAD="$LD_PRELOAD $PW_V4L2_LD_PRELOAD"
fi
export LD_PRELOAD

View File

@ -21,6 +21,7 @@ hu
id
it
ja
ka
kk
kn
ko

257
po/ca.po
View File

@ -5,6 +5,7 @@
# Xavier Conde Rueda <xavi.conde@gmail.com>, 2008.
# Agustí Grau <fletxa@gmail.com>, 2009.
# Judith Pintó Subirada <judithp@gmail.com>
# Jordi Mas i Herǹandez, <jmas@softcatala.org>, 2022
#
# 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
@ -26,11 +27,10 @@
msgid ""
msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/issues/new\n"
"POT-Creation-Date: 2021-04-18 16:54+0800\n"
"PO-Revision-Date: 2012-01-30 09:52+0000\n"
"Last-Translator: Josep Torné Llavall <josep.torne@gmail.com>\n"
"PO-Revision-Date: 2022-09-01 19:24+0000\n"
"Last-Translator: Jordi Mas i Herǹandez, <jmas@softcatala.org>,\n"
"Language-Team: Catalan <fedora@softcatala.net>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
@ -45,14 +45,18 @@ msgid ""
" --version Show version\n"
" -c, --config Load config (Default %s)\n"
msgstr ""
"%s [opcions]\n"
" -h, --help Mostra aquesta ajuda\n"
" --version Mostra la versió\n"
" -c, --config Carrega la configuració (predeterminada %s)\n"
#: src/daemon/pipewire.desktop.in:4
msgid "PipeWire Media System"
msgstr ""
msgstr "Sistema multimèdia PipeWire"
#: src/daemon/pipewire.desktop.in:5
msgid "Start the PipeWire Media System"
msgstr ""
msgstr "Inicia el sistema multimèdia PipeWire"
#: src/examples/media-session/alsa-monitor.c:526
#: spa/plugins/alsa/acp/compat.c:187
@ -66,7 +70,7 @@ msgstr "Mòdem"
#: src/examples/media-session/alsa-monitor.c:539
msgid "Unknown device"
msgstr ""
msgstr "Dispositiu desconegut"
#: src/tools/pw-cat.c:991
#, c-format
@ -77,9 +81,13 @@ msgid ""
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [opcions] <fitxer>\n"
" -h, --help Mostra aquesta ajuda\n"
" --version Mostra la versió\n"
" -v, --verbose Habilita les operacions detallades\n"
#: src/tools/pw-cat.c:998
#, c-format
#, c-format, fuzzy
msgid ""
" -R, --remote Remote daemon name\n"
" --media-type Set media type (default %s)\n"
@ -90,42 +98,58 @@ msgid ""
" --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"
" the rate is the one of the source file\n"
" --list-targets List available targets for --target\n"
"\n"
msgstr ""
"-R, --remote Nom del dimoni remot\n"
" --media-type Estableix el tipus de mitjà (per defecte %s)\n"
" --media-category Estableix la categoria dels mitjans (per defecte %s)\n"
" --media-role Estableix el rol del mitjà (per defecte %s)\n"
" --target Estableix l'objectiu del node (per defecte %s)\n"
" 0 vol dir que no enllaça\n"
" --latency Estableix latència del node (per defecte %s)\n"
" Xunit (unitat = s, ms, us, ns)\n"
" o mostres directes (256)\n"
" la taxa és la del fitxer d'origen\n"
" --list-targets Llista d'objectius disponibles per a --target"
#: src/tools/pw-cat.c:1016
#, c-format
#, c-format, fuzzy
msgid ""
" --rate Sample rate (req. for rec) (default "
"%u)\n"
" --channels Number of channels (req. for rec) "
"(default %u)\n"
" --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"
" 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"
" -q --quality Resampler quality (0 - 15) (default %d)\n"
"\n"
msgstr ""
"--rate Freqüència de mostreig (req. per rec) (predeterminat %u)\n"
" --channels Nombre de canals (req. per rec) (predeterminat %u)\n"
" --channel-map Mapa de canals\n"
" un dels següents: \"estèreo\", \"surround-51\",... o\n"
" Llista separada per comes dels noms dels canals: per exemple. \"FL,FR\"\n"
" --format Format de mostra %s (req. per a rec) (predeterminat %s)\n"
" --volume Volum de flux 0-1.0 (predeterminat %.3f)\n"
" -q --qualitat Remostrador de qualitat (0 - 15) (per defecte %d)"
#: src/tools/pw-cat.c:1033
#, fuzzy
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
"\n"
msgstr ""
"-p, --playback Mode de reproducció\n"
" -r, --record mode d'enregistrament\n"
" -m, --midi Mode MIDI"
#: src/tools/pw-cli.c:2932
#, c-format
#, c-format, fuzzy
msgid ""
"%s [options] [command]\n"
" -h, --help Show this help\n"
@ -134,10 +158,15 @@ msgid ""
" -r, --remote Remote daemon name\n"
"\n"
msgstr ""
"%s ]opcions] ]ordre]\n"
" -h, --help Mostra aquesta ajuda\n"
" --version Mostra la versió\n"
" -d, --daemon Inicia com a dimoni (fals predeterminat)\n"
" -r, --remote Nom del dimoni remot"
#: spa/plugins/alsa/acp/acp.c:290
msgid "Pro Audio"
msgstr ""
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:411 spa/plugins/alsa/acp/alsa-mixer.c:4704
#: spa/plugins/bluez5/bluez5-device.c:1000
@ -252,25 +281,23 @@ msgstr "Entrada analògica"
#: spa/plugins/alsa/acp/alsa-mixer.c:2801
msgid "Dock Microphone"
msgstr ""
msgstr "Micròfon de l'acoblador"
#: spa/plugins/alsa/acp/alsa-mixer.c:2803
msgid "Headset Microphone"
msgstr ""
msgstr "Micròfon d'auriculars"
#: spa/plugins/alsa/acp/alsa-mixer.c:2807
msgid "Analog Output"
msgstr "Sortida analògica"
#: spa/plugins/alsa/acp/alsa-mixer.c:2809
#, fuzzy
msgid "Headphones 2"
msgstr "Auriculars"
msgstr "Auriculars 2"
#: spa/plugins/alsa/acp/alsa-mixer.c:2810
#, fuzzy
msgid "Headphones Mono Output"
msgstr "Sortida mono analògica"
msgstr "Sortida mono dels auriculars"
#: spa/plugins/alsa/acp/alsa-mixer.c:2811
msgid "Line Out"
@ -297,49 +324,41 @@ msgid "Digital Input (S/PDIF)"
msgstr "Entrada digital (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2817
#, fuzzy
msgid "Multichannel Input"
msgstr "Multicanal"
msgstr "Entrada multicanal"
#: spa/plugins/alsa/acp/alsa-mixer.c:2818
#, fuzzy
msgid "Multichannel Output"
msgstr "Multicanal"
msgstr "Sortida multicanal"
#: spa/plugins/alsa/acp/alsa-mixer.c:2819
#, fuzzy
msgid "Game Output"
msgstr "Sortida %s"
msgstr "Sortida del joc"
#: spa/plugins/alsa/acp/alsa-mixer.c:2820
#: spa/plugins/alsa/acp/alsa-mixer.c:2821
#, fuzzy
msgid "Chat Output"
msgstr "Sortida %s"
msgstr "Sortida del xat"
#: spa/plugins/alsa/acp/alsa-mixer.c:2822
#, fuzzy
msgid "Chat Input"
msgstr "Entrada %s"
msgstr "Entrada del xat"
#: spa/plugins/alsa/acp/alsa-mixer.c:2823
#, fuzzy
msgid "Virtual Surround 7.1"
msgstr "Envoltant analògic 7.1"
msgstr "Envoltant virtual 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4527
msgid "Analog Mono"
msgstr "Mono analògic"
#: spa/plugins/alsa/acp/alsa-mixer.c:4528
#, fuzzy
msgid "Analog Mono (Left)"
msgstr "Mono analògic"
msgstr "Mono analògic (esquerra)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4529
#, fuzzy
msgid "Analog Mono (Right)"
msgstr "Mono analògic"
msgstr "Mono analògic (dreta)"
#. Note: Not translated to "Analog Stereo Input", because the source
#. * name gets "Input" appended to it automatically, so adding "Input"
@ -364,13 +383,12 @@ msgstr "Estèreo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4698
#: spa/plugins/bluez5/bluez5-device.c:1135
msgid "Headset"
msgstr "Auricular"
msgstr "Auriculars"
#: spa/plugins/alsa/acp/alsa-mixer.c:4541
#: spa/plugins/alsa/acp/alsa-mixer.c:4699
#, fuzzy
msgid "Speakerphone"
msgstr "Altaveu"
msgstr "Altaveu del telèfon"
#: spa/plugins/alsa/acp/alsa-mixer.c:4542
#: spa/plugins/alsa/acp/alsa-mixer.c:4543
@ -379,23 +397,23 @@ msgstr "Multicanal"
#: spa/plugins/alsa/acp/alsa-mixer.c:4544
msgid "Analog Surround 2.1"
msgstr "So envoltant analògic 2.1"
msgstr "Envoltant analògic 2.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4545
msgid "Analog Surround 3.0"
msgstr "So envoltant analògic 3.0"
msgstr "Envoltant analògic 3.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4546
msgid "Analog Surround 3.1"
msgstr "So envoltant analògic 4.1"
msgstr "Envoltant analògic 3.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4547
msgid "Analog Surround 4.0"
msgstr "Envoltant analògic 4.0 "
msgstr "Envoltant analògic 4.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4548
msgid "Analog Surround 4.1"
msgstr "Envoltant analògic 4.1 "
msgstr "Envoltant analògic 4.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4549
msgid "Analog Surround 5.0"
@ -407,15 +425,15 @@ msgstr "Envoltant analògic 5.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4551
msgid "Analog Surround 6.0"
msgstr "So envoltant analògic 6.0"
msgstr "Envoltant analògic 6.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4552
msgid "Analog Surround 6.1"
msgstr "So envoltant analògic 6.1"
msgstr "Envoltant analògic 6.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4553
msgid "Analog Surround 7.0"
msgstr "So envoltant analògic 7.0"
msgstr "Envoltant analògic 7.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4554
msgid "Analog Surround 7.1"
@ -431,11 +449,11 @@ msgstr "Envoltant digital 4.0 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4557
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Envolvent digital 5.1 (IEC958/AC3)"
msgstr "Envoltant digital 5.1 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4558
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "So envoltant digital 5.1 (IEC958/DTS)"
msgstr "Envoltant digital 5.1 (IEC958/DTS)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4559
msgid "Digital Stereo (HDMI)"
@ -443,15 +461,15 @@ msgstr "Estèreo digital (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4560
msgid "Digital Surround 5.1 (HDMI)"
msgstr "So envoltant digital 5.1 (HDMI)"
msgstr "Envoltant digital 5.1 (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4561
msgid "Chat"
msgstr ""
msgstr "Xat"
#: spa/plugins/alsa/acp/alsa-mixer.c:4562
msgid "Game"
msgstr ""
msgstr "Joc"
#: spa/plugins/alsa/acp/alsa-mixer.c:4696
msgid "Analog Mono Duplex"
@ -466,18 +484,16 @@ msgid "Digital Stereo Duplex (IEC958)"
msgstr "Dúplex estèreo digital (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4701
#, fuzzy
msgid "Multichannel Duplex"
msgstr "Multicanal"
msgstr "Dúplex Multicanal"
#: spa/plugins/alsa/acp/alsa-mixer.c:4702
#, fuzzy
msgid "Stereo Duplex"
msgstr "Dúplex estèreo analògic"
msgstr "Dúplex estèreo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4703
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Xat mono + 7.1 envoltant"
#: spa/plugins/alsa/acp/alsa-mixer.c:4806
#, c-format
@ -492,115 +508,87 @@ msgstr "Entrada %s"
#: spa/plugins/alsa/acp/alsa-util.c:1175 spa/plugins/alsa/acp/alsa-util.c:1269
#, fuzzy, 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."
"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."
"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() ha retornat un valor excepcionalment gran: %lu bytes (%lu "
"ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu d'aquest incident als desenvolupadors de l'ALSA."
msgstr[1] ""
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu "
"ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
"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:1241
#, fuzzy, 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."
"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."
"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() ha retornat un valor excepcionalment gran: %li bytes (%s%lu "
"ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu d'aquest incident als desenvolupadors de l'ALSA."
msgstr[1] ""
"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu "
"ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_delay() ha retornat un valor excepcionalment gran: %li bytes (%s%lu ms).\n"
"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:1288
#, 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."
"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() ha retornat un valor excepcionalment gran: %lu bytes (%lu "
"ms).\n"
"Probablement es tracta d'un error del controlador d'ALSA «%s». Informeu "
"d'aquest problema als desenvolupadors d'ALSA."
"snd_pcm_avail() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
"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:1331
#, fuzzy, 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."
"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."
"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() ha retornat un valor excepcionalment gran: %lu bytes "
"(%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu d'aquest incident als desenvolupadors de l'ALSA."
msgstr[1] ""
"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes "
"(%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
"d'aquest incident als desenvolupadors de l'ALSA."
"snd_pcm_mmap_begin() ha retornat un valor excepcionalment gran: %lu bytes (%lu ms).\n"
"Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu d'aquest incident als desenvolupadors de l'ALSA."
#: spa/plugins/bluez5/bluez5-device.c:1010
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr ""
msgstr "Passarel·la d'àudio (A2DP Source & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1033
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr ""
msgstr "Reproducció d'alta fidelitat (Sink A2DP, còdec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1035
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr ""
msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink, còdec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1041
msgid "High Fidelity Playback (A2DP Sink)"
msgstr ""
msgstr "Reproducció d'alta fidelitat (A2DP Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1043
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr ""
msgstr "Dúplex d'alta fidelitat (A2DP Source/Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1070
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr ""
msgstr "Unitat d'ariculars pel cap (HSP/HFP, còdec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1074
msgid "Headset Head Unit (HSP/HFP)"
msgstr ""
msgstr "Unitat d'ariculars pel cap (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1140
msgid "Handsfree"
@ -612,7 +600,7 @@ msgstr "Auricular"
#: spa/plugins/bluez5/bluez5-device.c:1160
msgid "Portable"
msgstr ""
msgstr "Portable"
#: spa/plugins/bluez5/bluez5-device.c:1165
msgid "Car"
@ -620,13 +608,12 @@ msgstr "Cotxe"
#: spa/plugins/bluez5/bluez5-device.c:1170
msgid "HiFi"
msgstr ""
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1175
msgid "Phone"
msgstr "Telèfon"
#: spa/plugins/bluez5/bluez5-device.c:1181
#, fuzzy
msgid "Bluetooth"
msgstr "Entrada bluetooth"
msgstr "Bluetooth"

354
po/cs.po
View File

@ -8,10 +8,10 @@
msgid ""
msgstr ""
"Project-Id-Version: pipewire.master-tx\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"POT-Creation-Date: 2021-04-18 16:54+0800\n"
"PO-Revision-Date: 2021-10-12 14:18+0200\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2022-09-15 15:26+0000\n"
"PO-Revision-Date: 2022-10-21 16:44+0200\n"
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@ -19,9 +19,9 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Poedit 3.0\n"
"X-Generator: Poedit 3.1.1\n"
#: src/daemon/pipewire.c:43
#: src/daemon/pipewire.c:46
#, c-format
msgid ""
"%s [options]\n"
@ -42,36 +42,52 @@ msgstr "Multimediální systém PipeWire"
msgid "Start the PipeWire Media System"
msgstr "Spustit multimediální systém PipeWire"
#: src/examples/media-session/alsa-monitor.c:526
#: spa/plugins/alsa/acp/compat.c:187
msgid "Built-in Audio"
msgstr "Vnitřní zvukový systém"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunel do %s/%s"
#: src/examples/media-session/alsa-monitor.c:530
#: spa/plugins/alsa/acp/compat.c:192
msgid "Modem"
msgstr "Modem"
#: src/modules/module-fallback-sink.c:51
#| msgid "Game Output"
msgid "Dummy Output"
msgstr "Předstíraný výstup"
#: src/examples/media-session/alsa-monitor.c:539
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel pro %s@%s"
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr "Neznámé zařízení"
#: src/tools/pw-cat.c:991
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s na %s@%s"
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s na %s"
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] <file>\n"
"%s [options] [<file>|-]\n"
" -h, --help Show this help\n"
" --version Show version\n"
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [volby] <soubor>\n"
"%s [volby] [<soubor>|-]\n"
" -h, --help Zobrazit tuto nápovědu\n"
" --version Zobrazit verzi\n"
" -v, --verbose Povolit podrobné operace\n"
"\n"
#: src/tools/pw-cat.c:998
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -85,7 +101,7 @@ msgid ""
" or direct samples (256)\n"
" the rate is the one of the source "
"file\n"
" --list-targets List available targets for --target\n"
" -P --properties Set node properties\n"
"\n"
msgstr ""
" -R, --remote Název vzdáleného démonu\n"
@ -102,10 +118,10 @@ msgstr ""
" nebo přímé vzorky (256)\n"
" frekvence je stejná jako u "
"zdrojového souboru\n"
" --list-targets Zobrazit dostupné cíle pro --target\n"
" -P --properties Nastavit vlastnosti uzlu\n"
"\n"
#: src/tools/pw-cat.c:1016
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -141,19 +157,21 @@ msgstr ""
"je %d)\n"
"\n"
#: src/tools/pw-cat.c:1033
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
" -d, --dsd DSD mode\n"
"\n"
msgstr ""
" -p, --playback Playback mód\n"
" -r, --record Recording mód\n"
" -m, --midi Midi mód\n"
" -d, --dsd DSD mód\n"
"\n"
#: src/tools/pw-cli.c:2932
#: src/tools/pw-cli.c:2255
#, c-format
msgid ""
"%s [options] [command]\n"
@ -171,199 +189,195 @@ msgstr ""
" -r, --remote Název vzdáleného démonu\n"
"\n"
#: spa/plugins/alsa/acp/acp.c:290
#: spa/plugins/alsa/acp/acp.c:321
msgid "Pro Audio"
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:411 spa/plugins/alsa/acp/alsa-mixer.c:4704
#: spa/plugins/bluez5/bluez5-device.c:1000
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Vypnuto"
#: spa/plugins/alsa/acp/channelmap.h:466
msgid "(invalid)"
msgstr "(neplatné)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2709
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
msgid "Input"
msgstr "Vstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2710
#: spa/plugins/alsa/acp/alsa-mixer.c:2653
msgid "Docking Station Input"
msgstr "Vstup dokovací stanice"
#: spa/plugins/alsa/acp/alsa-mixer.c:2711
#: spa/plugins/alsa/acp/alsa-mixer.c:2654
msgid "Docking Station Microphone"
msgstr "Mikrofon dokovací stanice"
#: spa/plugins/alsa/acp/alsa-mixer.c:2712
#: spa/plugins/alsa/acp/alsa-mixer.c:2655
msgid "Docking Station Line In"
msgstr "Linkový vstup dokovací stanice"
#: spa/plugins/alsa/acp/alsa-mixer.c:2713
#: spa/plugins/alsa/acp/alsa-mixer.c:2804
#: spa/plugins/alsa/acp/alsa-mixer.c:2656
#: spa/plugins/alsa/acp/alsa-mixer.c:2747
msgid "Line In"
msgstr "Linkový vstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2714
#: spa/plugins/alsa/acp/alsa-mixer.c:2798
#: spa/plugins/bluez5/bluez5-device.c:1145
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2715
#: spa/plugins/alsa/acp/alsa-mixer.c:2799
#: spa/plugins/alsa/acp/alsa-mixer.c:2658
#: spa/plugins/alsa/acp/alsa-mixer.c:2742
msgid "Front Microphone"
msgstr "Přední mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2716
#: spa/plugins/alsa/acp/alsa-mixer.c:2800
#: spa/plugins/alsa/acp/alsa-mixer.c:2659
#: spa/plugins/alsa/acp/alsa-mixer.c:2743
msgid "Rear Microphone"
msgstr "Zadní mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2717
#: spa/plugins/alsa/acp/alsa-mixer.c:2660
msgid "External Microphone"
msgstr "Externí mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2718
#: spa/plugins/alsa/acp/alsa-mixer.c:2802
#: spa/plugins/alsa/acp/alsa-mixer.c:2661
#: spa/plugins/alsa/acp/alsa-mixer.c:2745
msgid "Internal Microphone"
msgstr "Interní mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2719
#: spa/plugins/alsa/acp/alsa-mixer.c:2805
#: spa/plugins/alsa/acp/alsa-mixer.c:2662
#: spa/plugins/alsa/acp/alsa-mixer.c:2748
msgid "Radio"
msgstr "Rádio"
#: spa/plugins/alsa/acp/alsa-mixer.c:2720
#: spa/plugins/alsa/acp/alsa-mixer.c:2806
#: spa/plugins/alsa/acp/alsa-mixer.c:2663
#: spa/plugins/alsa/acp/alsa-mixer.c:2749
msgid "Video"
msgstr "Obraz"
#: spa/plugins/alsa/acp/alsa-mixer.c:2721
#: spa/plugins/alsa/acp/alsa-mixer.c:2664
msgid "Automatic Gain Control"
msgstr "Automatické řízení zesílení"
#: spa/plugins/alsa/acp/alsa-mixer.c:2722
#: spa/plugins/alsa/acp/alsa-mixer.c:2665
msgid "No Automatic Gain Control"
msgstr "Bez automatického řízení zesílení"
#: spa/plugins/alsa/acp/alsa-mixer.c:2723
#: spa/plugins/alsa/acp/alsa-mixer.c:2666
msgid "Boost"
msgstr "Zdůraznění"
#: spa/plugins/alsa/acp/alsa-mixer.c:2724
#: spa/plugins/alsa/acp/alsa-mixer.c:2667
msgid "No Boost"
msgstr "Bez zdůraznění"
#: spa/plugins/alsa/acp/alsa-mixer.c:2725
#: spa/plugins/alsa/acp/alsa-mixer.c:2668
msgid "Amplifier"
msgstr "Zesilovač"
#: spa/plugins/alsa/acp/alsa-mixer.c:2726
#: spa/plugins/alsa/acp/alsa-mixer.c:2669
msgid "No Amplifier"
msgstr "Bez zesilovače"
#: spa/plugins/alsa/acp/alsa-mixer.c:2727
#: spa/plugins/alsa/acp/alsa-mixer.c:2670
msgid "Bass Boost"
msgstr "Zdůraznění basů"
#: spa/plugins/alsa/acp/alsa-mixer.c:2728
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
msgid "No Bass Boost"
msgstr "Bez zdůraznění basů"
#: spa/plugins/alsa/acp/alsa-mixer.c:2729
#: spa/plugins/bluez5/bluez5-device.c:1150
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Reproduktor"
#: spa/plugins/alsa/acp/alsa-mixer.c:2730
#: spa/plugins/alsa/acp/alsa-mixer.c:2808
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
msgid "Headphones"
msgstr "Sluchátka"
#: spa/plugins/alsa/acp/alsa-mixer.c:2797
#: spa/plugins/alsa/acp/alsa-mixer.c:2740
msgid "Analog Input"
msgstr "Analogový vstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2801
#: spa/plugins/alsa/acp/alsa-mixer.c:2744
msgid "Dock Microphone"
msgstr "Dokovací mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2803
#: spa/plugins/alsa/acp/alsa-mixer.c:2746
msgid "Headset Microphone"
msgstr "Mikrofon náhlavní soupravy"
#: spa/plugins/alsa/acp/alsa-mixer.c:2807
#: spa/plugins/alsa/acp/alsa-mixer.c:2750
msgid "Analog Output"
msgstr "Analogový výstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2809
#: spa/plugins/alsa/acp/alsa-mixer.c:2752
msgid "Headphones 2"
msgstr "Sluchátka 2"
#: spa/plugins/alsa/acp/alsa-mixer.c:2810
#: spa/plugins/alsa/acp/alsa-mixer.c:2753
msgid "Headphones Mono Output"
msgstr "Sluchátkový výstup mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:2811
#: spa/plugins/alsa/acp/alsa-mixer.c:2754
msgid "Line Out"
msgstr "Linkový výstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2812
#: spa/plugins/alsa/acp/alsa-mixer.c:2755
msgid "Analog Mono Output"
msgstr "Analogový výstup mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:2813
#: spa/plugins/alsa/acp/alsa-mixer.c:2756
msgid "Speakers"
msgstr "Reproduktory"
#: spa/plugins/alsa/acp/alsa-mixer.c:2814
#: spa/plugins/alsa/acp/alsa-mixer.c:2757
msgid "HDMI / DisplayPort"
msgstr "HDMI/DisplayPort"
#: spa/plugins/alsa/acp/alsa-mixer.c:2815
#: spa/plugins/alsa/acp/alsa-mixer.c:2758
msgid "Digital Output (S/PDIF)"
msgstr "Digitální výstup (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2816
#: spa/plugins/alsa/acp/alsa-mixer.c:2759
msgid "Digital Input (S/PDIF)"
msgstr "Digitální vstup (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2817
#: spa/plugins/alsa/acp/alsa-mixer.c:2760
msgid "Multichannel Input"
msgstr "Vícekanálový vstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2818
#: spa/plugins/alsa/acp/alsa-mixer.c:2761
msgid "Multichannel Output"
msgstr "Vícekanálový výstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2819
#: spa/plugins/alsa/acp/alsa-mixer.c:2762
msgid "Game Output"
msgstr "Herní výstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2820
#: spa/plugins/alsa/acp/alsa-mixer.c:2821
#: spa/plugins/alsa/acp/alsa-mixer.c:2763
#: spa/plugins/alsa/acp/alsa-mixer.c:2764
msgid "Chat Output"
msgstr "Komunikační výstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2822
#: spa/plugins/alsa/acp/alsa-mixer.c:2765
msgid "Chat Input"
msgstr "Komunikační vstup"
#: spa/plugins/alsa/acp/alsa-mixer.c:2823
#: spa/plugins/alsa/acp/alsa-mixer.c:2766
msgid "Virtual Surround 7.1"
msgstr "Virtuální surround 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4527
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
msgid "Analog Mono"
msgstr "Analogové mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:4528
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
msgid "Analog Mono (Left)"
msgstr "Analogové mono (levé)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4529
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
msgid "Analog Mono (Right)"
msgstr "Analogové mono (pravé)"
@ -372,147 +386,147 @@ msgstr "Analogové mono (pravé)"
#. * 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:4530
#: spa/plugins/alsa/acp/alsa-mixer.c:4538
#: spa/plugins/alsa/acp/alsa-mixer.c:4539
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
msgid "Analog Stereo"
msgstr "Analogové stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4531
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
msgid "Mono"
msgstr "Mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:4532
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
msgid "Stereo"
msgstr "Stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4540
#: spa/plugins/alsa/acp/alsa-mixer.c:4698
#: spa/plugins/bluez5/bluez5-device.c:1135
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Náhlavní souprava"
#: spa/plugins/alsa/acp/alsa-mixer.c:4541
#: spa/plugins/alsa/acp/alsa-mixer.c:4699
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
#: spa/plugins/alsa/acp/alsa-mixer.c:4643
msgid "Speakerphone"
msgstr "Hlasitý odposlech"
#: spa/plugins/alsa/acp/alsa-mixer.c:4542
#: spa/plugins/alsa/acp/alsa-mixer.c:4543
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
msgid "Multichannel"
msgstr "Více kanálů"
#: spa/plugins/alsa/acp/alsa-mixer.c:4544
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
msgid "Analog Surround 2.1"
msgstr "Analogový Surround 2.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4545
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
msgid "Analog Surround 3.0"
msgstr "Analogový Surround 3.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4546
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
msgid "Analog Surround 3.1"
msgstr "Analogový Surround 3.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4547
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
msgid "Analog Surround 4.0"
msgstr "Analogový Surround 4.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4548
#: spa/plugins/alsa/acp/alsa-mixer.c:4492
msgid "Analog Surround 4.1"
msgstr "Analogový Surround 4.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4549
#: spa/plugins/alsa/acp/alsa-mixer.c:4493
msgid "Analog Surround 5.0"
msgstr "Analogový Surround 5.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4550
#: spa/plugins/alsa/acp/alsa-mixer.c:4494
msgid "Analog Surround 5.1"
msgstr "Analogový Surround 5.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4551
#: spa/plugins/alsa/acp/alsa-mixer.c:4495
msgid "Analog Surround 6.0"
msgstr "Analogový Surround 6.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4552
#: spa/plugins/alsa/acp/alsa-mixer.c:4496
msgid "Analog Surround 6.1"
msgstr "Analogový Surround 6.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4553
#: spa/plugins/alsa/acp/alsa-mixer.c:4497
msgid "Analog Surround 7.0"
msgstr "Analogový Surround 7.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4554
#: spa/plugins/alsa/acp/alsa-mixer.c:4498
msgid "Analog Surround 7.1"
msgstr "Analogový Surround 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4555
#: spa/plugins/alsa/acp/alsa-mixer.c:4499
msgid "Digital Stereo (IEC958)"
msgstr "Digitální stereo (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4556
#: spa/plugins/alsa/acp/alsa-mixer.c:4500
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "Digitální Surround 4.0 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4557
#: spa/plugins/alsa/acp/alsa-mixer.c:4501
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Digitální Surround 5.1 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4558
#: spa/plugins/alsa/acp/alsa-mixer.c:4502
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "Digitální Surround 5.1 (IEC958/DTS)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4559
#: spa/plugins/alsa/acp/alsa-mixer.c:4503
msgid "Digital Stereo (HDMI)"
msgstr "Digitální stereo (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4560
#: spa/plugins/alsa/acp/alsa-mixer.c:4504
msgid "Digital Surround 5.1 (HDMI)"
msgstr "Digitální Surround 5.1 (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4561
#: spa/plugins/alsa/acp/alsa-mixer.c:4505
msgid "Chat"
msgstr "Chat"
#: spa/plugins/alsa/acp/alsa-mixer.c:4562
#: spa/plugins/alsa/acp/alsa-mixer.c:4506
msgid "Game"
msgstr "Hra"
#: spa/plugins/alsa/acp/alsa-mixer.c:4696
#: spa/plugins/alsa/acp/alsa-mixer.c:4640
msgid "Analog Mono Duplex"
msgstr "Analogové duplexní mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:4697
#: spa/plugins/alsa/acp/alsa-mixer.c:4641
msgid "Analog Stereo Duplex"
msgstr "Analogové duplexní stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4700
#: spa/plugins/alsa/acp/alsa-mixer.c:4644
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Digitální duplexní stereo (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4701
#: spa/plugins/alsa/acp/alsa-mixer.c:4645
msgid "Multichannel Duplex"
msgstr "Vícekanálový duplex"
#: spa/plugins/alsa/acp/alsa-mixer.c:4702
#: spa/plugins/alsa/acp/alsa-mixer.c:4646
msgid "Stereo Duplex"
msgstr "Duplexní stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4703
#: spa/plugins/alsa/acp/alsa-mixer.c:4647
msgid "Mono Chat + 7.1 Surround"
msgstr "Mono Chat + 7.1 Surround"
#: spa/plugins/alsa/acp/alsa-mixer.c:4806
#: spa/plugins/alsa/acp/alsa-mixer.c:4754
#, c-format
msgid "%s Output"
msgstr "Výstup %s"
#: spa/plugins/alsa/acp/alsa-mixer.c:4813
#: spa/plugins/alsa/acp/alsa-mixer.c:4761
#, c-format
msgid "%s Input"
msgstr "Vstup %s"
#: spa/plugins/alsa/acp/alsa-util.c:1175 spa/plugins/alsa/acp/alsa-util.c:1269
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -540,16 +554,16 @@ msgstr[2] ""
"S největší pravděpodobností se jedná o chybu v ovladači ALSA „%s“. Nahlaste "
"prosím tento problém vývojářům ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1241
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
"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"
"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] ""
@ -568,7 +582,7 @@ msgstr[2] ""
"S největší pravděpodobností se jedná o chybu v ovladači ALSA „%s“. Nahlaste "
"prosím tento problém vývojářům ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1288
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -581,7 +595,7 @@ msgstr ""
"S největší pravděpodobností se jedná o chybu v ovladači ALSA „%s“. Nahlaste "
"prosím tento problém vývojářům ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1331
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -609,61 +623,109 @@ msgstr[2] ""
"S největší pravděpodobností se jedná o chybu v ovladači ALSA „%s“. Nahlaste "
"prosím tento problém vývojářům ALSA."
#: spa/plugins/bluez5/bluez5-device.c:1010
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(neplatné)"
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "Vnitřní zvukový systém"
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Zvuková brána (A2DP Source & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1033
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "High Fidelity Playback (A2DP Sink, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1035
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "High Fidelity Duplex (A2DP Source/Sink, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1041
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "High Fidelity Playback (A2DP Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1043
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "High Fidelity Duplex (A2DP Source/Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1070
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
#| msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "High Fidelity Playback (BAP Sink, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
#| msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "High Fidelity Input (BAP Source, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
#| msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "High Fidelity Duplex (BAP Source/Sink, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Jednotka náhlavní soupravy (HSP/HFP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1074
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Jednotka náhlavní soupravy (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1140
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Handsfree"
#: spa/plugins/bluez5/bluez5-device.c:1155
#: spa/plugins/bluez5/bluez5-device.c:1449
#| msgid "Handsfree"
msgid "Handsfree (HFP)"
msgstr "Handsfree (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Sluchátko"
#: spa/plugins/bluez5/bluez5-device.c:1160
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Přenosné zařízení"
#: spa/plugins/bluez5/bluez5-device.c:1165
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Auto"
#: spa/plugins/bluez5/bluez5-device.c:1170
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1175
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1181
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
#| msgid "Bluetooth"
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

445
po/gl.po
View File

@ -4,25 +4,31 @@
# Translators:
# bassball93 <bassball93@gmail.com>, 2011.
# mbouzada <mbouzada@gmail.com>, 2011.
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2019.
# Marcos Lans <marcoslansgarza@gmail.com>, 2018.
# Fran Dieguez <frandieguez@gnome.org>, 2012-2022.
#
msgid ""
msgstr ""
"Project-Id-Version: PipeWire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"POT-Creation-Date: 2021-04-18 16:54+0800\n"
"PO-Revision-Date: 2019-02-20 01:36+0200\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2022-07-10 03:27+0000\n"
"PO-Revision-Date: 2022-08-23 09:47+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician\n"
"Language-Team: Galician <Proxecto Trasno <proxecto@trasno.gal>>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.7.1\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Gtranslator 40.0\n"
"X-DL-Team: gl\n"
"X-DL-Module: PipeWire\n"
"X-DL-Branch: master\n"
"X-DL-Domain: po\n"
"X-DL-State: Translating\n"
#: src/daemon/pipewire.c:43
#: src/daemon/pipewire.c:46
#, c-format
msgid ""
"%s [options]\n"
@ -30,6 +36,11 @@ msgid ""
" --version Show version\n"
" -c, --config Load config (Default %s)\n"
msgstr ""
"%s [opcións]\n"
" -h, --help Mostra esta axuda\n"
" --version Mostrar versión\n"
" -c, --config Cargar configuración (Predeterminado "
"%s)\n"
#: src/daemon/pipewire.desktop.in:4
msgid "PipeWire Media System"
@ -39,31 +50,52 @@ msgstr "Sistema multimedia PipeWire"
msgid "Start the PipeWire Media System"
msgstr "Iniciar o Sistema multimedia PipeWire"
#: src/examples/media-session/alsa-monitor.c:526
#: spa/plugins/alsa/acp/compat.c:187
msgid "Built-in Audio"
msgstr "Audio interno"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Túnel a %s/%s"
#: src/examples/media-session/alsa-monitor.c:530
#: spa/plugins/alsa/acp/compat.c:192
msgid "Modem"
msgstr "Módem"
#: src/modules/module-fallback-sink.c:51
#| msgid "Game Output"
msgid "Dummy Output"
msgstr "Saída de proba"
#: src/examples/media-session/alsa-monitor.c:539
#: src/modules/module-pulse-tunnel.c:648
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Túnel para %s@%s"
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr ""
msgstr "Dispositivo descoñecido"
#: src/tools/pw-cat.c:991
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s en %s@%s"
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s en %s"
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] <file>\n"
"%s [options] [<file>|-]\n"
" -h, --help Show this help\n"
" --version Show version\n"
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [opcións] [<ficheiro>|-]\n"
" -h, --help Mostrar esta axuda\n"
" --version Mostrar versión\n"
" -v, --verbose Activar operacións verbosas\n"
"\n"
#: src/tools/pw-cat.c:998
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -77,11 +109,29 @@ msgid ""
" or direct samples (256)\n"
" the rate is the one of the source "
"file\n"
" --list-targets List available targets for --target\n"
" -P --properties Set node properties\n"
"\n"
msgstr ""
" -R, --remote Nome do daemon remoto\n"
" --media-type Estabelecer o tipo de medio (por "
"omisión %s)\n"
" --media-category Estabelecer a categoría multimedia "
"(por omisión %s)\n"
" --media-role Estabelecer o rol multimedia (por "
"omisión %s)\n"
" --target Estabelecer o nodo obxectivo (por "
"omisión %s)\n"
" 0 significa non ligar\n"
" --latency Estabelecer a latencia do nodo (por "
"omisión %s)\n"
" Xunit (unidade = s, ms, us, ns)\n"
" ou mostras directas samples (256)\n"
" a taxa é un dos ficheiros de "
"orixe\n"
" -P --properties Estabelecer as propiedades do nodo\n"
"\n"
#: src/tools/pw-cat.c:1016
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -100,16 +150,38 @@ msgid ""
"%d)\n"
"\n"
msgstr ""
" --rate Taxa de mostreo (solicitudes por "
"segundo) (por omisión %u)\n"
" --channels Número de canles (solicitudes por "
"segundo) (por omisión %u)\n"
" --channel-map Mapa de canles\n"
" un de: \"stereo\", "
"\"surround-51\",... or\n"
" lista separada por comas dos "
"nomes das canles: p.ex. \"FL,FR\"\n"
" --format Formato de mostras %s (solicitudes "
"por segundo) (por omisión %s)\n"
" --volume Volume do fluxo 0-1.0 (por omisión "
"%.3f)\n"
" -q --quality Calidade do remostreador (0 - 15) "
"(por omisión %d)\n"
"\n"
#: src/tools/pw-cat.c:1033
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
" -d, --dsd DSD mode\n"
"\n"
msgstr ""
" -p, --playback Modo de reprodución\n"
" -r, --record Modo de grabación\n"
" -m, --midi Modo MIDI\n"
" -d, --dsd Modo DSD\n"
"\n"
#: src/tools/pw-cli.c:2932
#: src/tools/pw-cli.c:3165
#, c-format
msgid ""
"%s [options] [command]\n"
@ -119,355 +191,352 @@ msgid ""
" -r, --remote Remote daemon name\n"
"\n"
msgstr ""
"%s [opcións] [orde]\n"
" -h, --help Mostrar esta axuda\n"
" --version Mostrar versión\n"
" -d, --daemon Iniciar como demonio (Por omisión "
"falso)\n"
" -r, --remote Modo de demonio remoto\n"
"\n"
#: spa/plugins/alsa/acp/acp.c:290
#: spa/plugins/alsa/acp/acp.c:321
msgid "Pro Audio"
msgstr ""
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:411 spa/plugins/alsa/acp/alsa-mixer.c:4704
#: spa/plugins/bluez5/bluez5-device.c:1000
#: spa/plugins/alsa/acp/acp.c:446 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1185
msgid "Off"
msgstr "Apagado"
#: spa/plugins/alsa/acp/channelmap.h:466
msgid "(invalid)"
msgstr "(incorrecto)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2709
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
msgid "Input"
msgstr "Entrada"
#: spa/plugins/alsa/acp/alsa-mixer.c:2710
#: spa/plugins/alsa/acp/alsa-mixer.c:2653
msgid "Docking Station Input"
msgstr "Entrada de estación acoplada (Docking Station)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2711
#: spa/plugins/alsa/acp/alsa-mixer.c:2654
msgid "Docking Station Microphone"
msgstr "Micrófono da estación acoplada (Docking Station)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2712
#: spa/plugins/alsa/acp/alsa-mixer.c:2655
msgid "Docking Station Line In"
msgstr "Entrada de estación acoplada (Docking Station)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2713
#: spa/plugins/alsa/acp/alsa-mixer.c:2804
#: spa/plugins/alsa/acp/alsa-mixer.c:2656
#: spa/plugins/alsa/acp/alsa-mixer.c:2747
msgid "Line In"
msgstr "Liña de entrada"
#: spa/plugins/alsa/acp/alsa-mixer.c:2714
#: spa/plugins/alsa/acp/alsa-mixer.c:2798
#: spa/plugins/bluez5/bluez5-device.c:1145
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1357
msgid "Microphone"
msgstr "Micrófono"
#: spa/plugins/alsa/acp/alsa-mixer.c:2715
#: spa/plugins/alsa/acp/alsa-mixer.c:2799
#: spa/plugins/alsa/acp/alsa-mixer.c:2658
#: spa/plugins/alsa/acp/alsa-mixer.c:2742
msgid "Front Microphone"
msgstr "Micrófono frontal"
#: spa/plugins/alsa/acp/alsa-mixer.c:2716
#: spa/plugins/alsa/acp/alsa-mixer.c:2800
#: spa/plugins/alsa/acp/alsa-mixer.c:2659
#: spa/plugins/alsa/acp/alsa-mixer.c:2743
msgid "Rear Microphone"
msgstr "Micrófono traseiro"
#: spa/plugins/alsa/acp/alsa-mixer.c:2717
#: spa/plugins/alsa/acp/alsa-mixer.c:2660
msgid "External Microphone"
msgstr "Micrófono externo"
#: spa/plugins/alsa/acp/alsa-mixer.c:2718
#: spa/plugins/alsa/acp/alsa-mixer.c:2802
#: spa/plugins/alsa/acp/alsa-mixer.c:2661
#: spa/plugins/alsa/acp/alsa-mixer.c:2745
msgid "Internal Microphone"
msgstr "Micrófono interno"
#: spa/plugins/alsa/acp/alsa-mixer.c:2719
#: spa/plugins/alsa/acp/alsa-mixer.c:2805
#: spa/plugins/alsa/acp/alsa-mixer.c:2662
#: spa/plugins/alsa/acp/alsa-mixer.c:2748
msgid "Radio"
msgstr "Radio"
#: spa/plugins/alsa/acp/alsa-mixer.c:2720
#: spa/plugins/alsa/acp/alsa-mixer.c:2806
#: spa/plugins/alsa/acp/alsa-mixer.c:2663
#: spa/plugins/alsa/acp/alsa-mixer.c:2749
msgid "Video"
msgstr "Vídeo"
#: spa/plugins/alsa/acp/alsa-mixer.c:2721
#: spa/plugins/alsa/acp/alsa-mixer.c:2664
msgid "Automatic Gain Control"
msgstr "Control automático de ganancia"
#: spa/plugins/alsa/acp/alsa-mixer.c:2722
#: spa/plugins/alsa/acp/alsa-mixer.c:2665
msgid "No Automatic Gain Control"
msgstr "Sen control automático de ganancia"
#: spa/plugins/alsa/acp/alsa-mixer.c:2723
#: spa/plugins/alsa/acp/alsa-mixer.c:2666
msgid "Boost"
msgstr "Enfatizador"
#: spa/plugins/alsa/acp/alsa-mixer.c:2724
#: spa/plugins/alsa/acp/alsa-mixer.c:2667
msgid "No Boost"
msgstr "Sen enfatizador"
#: spa/plugins/alsa/acp/alsa-mixer.c:2725
#: spa/plugins/alsa/acp/alsa-mixer.c:2668
msgid "Amplifier"
msgstr "Amplificador"
#: spa/plugins/alsa/acp/alsa-mixer.c:2726
#: spa/plugins/alsa/acp/alsa-mixer.c:2669
msgid "No Amplifier"
msgstr "Sen amplificador"
#: spa/plugins/alsa/acp/alsa-mixer.c:2727
#: spa/plugins/alsa/acp/alsa-mixer.c:2670
msgid "Bass Boost"
msgstr "Enfatizador baixo"
#: spa/plugins/alsa/acp/alsa-mixer.c:2728
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
msgid "No Bass Boost"
msgstr "Sen enfatizador baixo"
#: spa/plugins/alsa/acp/alsa-mixer.c:2729
#: spa/plugins/bluez5/bluez5-device.c:1150
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1363
msgid "Speaker"
msgstr "Altofalante"
#: spa/plugins/alsa/acp/alsa-mixer.c:2730
#: spa/plugins/alsa/acp/alsa-mixer.c:2808
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
msgid "Headphones"
msgstr "Auriculares"
#: spa/plugins/alsa/acp/alsa-mixer.c:2797
#: spa/plugins/alsa/acp/alsa-mixer.c:2740
msgid "Analog Input"
msgstr "Entrada analóxica"
#: spa/plugins/alsa/acp/alsa-mixer.c:2801
#: spa/plugins/alsa/acp/alsa-mixer.c:2744
msgid "Dock Microphone"
msgstr "Micrófono do acople"
#: spa/plugins/alsa/acp/alsa-mixer.c:2803
#: spa/plugins/alsa/acp/alsa-mixer.c:2746
msgid "Headset Microphone"
msgstr "Micrófono con auricular"
#: spa/plugins/alsa/acp/alsa-mixer.c:2807
#: spa/plugins/alsa/acp/alsa-mixer.c:2750
msgid "Analog Output"
msgstr "Saída analóxica"
#: spa/plugins/alsa/acp/alsa-mixer.c:2809
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2752
msgid "Headphones 2"
msgstr "Auriculares"
msgstr "Auriculares 2"
#: spa/plugins/alsa/acp/alsa-mixer.c:2810
#: spa/plugins/alsa/acp/alsa-mixer.c:2753
msgid "Headphones Mono Output"
msgstr "Saída monoaural para auriculares"
#: spa/plugins/alsa/acp/alsa-mixer.c:2811
#: spa/plugins/alsa/acp/alsa-mixer.c:2754
msgid "Line Out"
msgstr "Liña de saída"
#: spa/plugins/alsa/acp/alsa-mixer.c:2812
#: spa/plugins/alsa/acp/alsa-mixer.c:2755
msgid "Analog Mono Output"
msgstr "Saída monoaural analóxica"
#: spa/plugins/alsa/acp/alsa-mixer.c:2813
#: spa/plugins/alsa/acp/alsa-mixer.c:2756
msgid "Speakers"
msgstr "Altofalantes"
#: spa/plugins/alsa/acp/alsa-mixer.c:2814
#: spa/plugins/alsa/acp/alsa-mixer.c:2757
msgid "HDMI / DisplayPort"
msgstr "HDMI / DisplayPort"
#: spa/plugins/alsa/acp/alsa-mixer.c:2815
#: spa/plugins/alsa/acp/alsa-mixer.c:2758
msgid "Digital Output (S/PDIF)"
msgstr "Saída dixital (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2816
#: spa/plugins/alsa/acp/alsa-mixer.c:2759
msgid "Digital Input (S/PDIF)"
msgstr "Entrada dixital (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2817
#: spa/plugins/alsa/acp/alsa-mixer.c:2760
msgid "Multichannel Input"
msgstr "Entrada multicanle"
#: spa/plugins/alsa/acp/alsa-mixer.c:2818
#: spa/plugins/alsa/acp/alsa-mixer.c:2761
msgid "Multichannel Output"
msgstr "Saída multicanle"
#: spa/plugins/alsa/acp/alsa-mixer.c:2819
#: spa/plugins/alsa/acp/alsa-mixer.c:2762
msgid "Game Output"
msgstr "Saída do xogo"
#: spa/plugins/alsa/acp/alsa-mixer.c:2820
#: spa/plugins/alsa/acp/alsa-mixer.c:2821
#: spa/plugins/alsa/acp/alsa-mixer.c:2763
#: spa/plugins/alsa/acp/alsa-mixer.c:2764
msgid "Chat Output"
msgstr "Saída do chat"
#: spa/plugins/alsa/acp/alsa-mixer.c:2822
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2765
msgid "Chat Input"
msgstr "Saída do chat"
msgstr "Entrada de chat"
#: spa/plugins/alsa/acp/alsa-mixer.c:2823
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2766
msgid "Virtual Surround 7.1"
msgstr "Sumideiro envolvente virtual"
msgstr "Envolvente virtual 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4527
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
msgid "Analog Mono"
msgstr "Monoaural analóxico"
#: spa/plugins/alsa/acp/alsa-mixer.c:4528
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
msgid "Analog Mono (Left)"
msgstr "Monoaural analóxico"
msgstr "Monoaural analóxico (Esquerda)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4529
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
msgid "Analog Mono (Right)"
msgstr "Monoaural analóxico"
msgstr "Monoaural analóxico (Dereita)"
#. 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:4530
#: spa/plugins/alsa/acp/alsa-mixer.c:4538
#: spa/plugins/alsa/acp/alsa-mixer.c:4539
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
msgid "Analog Stereo"
msgstr "Estéreo analóxico"
#: spa/plugins/alsa/acp/alsa-mixer.c:4531
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
msgid "Mono"
msgstr "Mono"
#: spa/plugins/alsa/acp/alsa-mixer.c:4532
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
msgid "Stereo"
msgstr "Estéreo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4540
#: spa/plugins/alsa/acp/alsa-mixer.c:4698
#: spa/plugins/bluez5/bluez5-device.c:1135
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1345
msgid "Headset"
msgstr "Auriculares con micro"
#: spa/plugins/alsa/acp/alsa-mixer.c:4541
#: spa/plugins/alsa/acp/alsa-mixer.c:4699
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
#: spa/plugins/alsa/acp/alsa-mixer.c:4643
msgid "Speakerphone"
msgstr "Altofalante"
#: spa/plugins/alsa/acp/alsa-mixer.c:4542
#: spa/plugins/alsa/acp/alsa-mixer.c:4543
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
msgid "Multichannel"
msgstr "Multicanle"
#: spa/plugins/alsa/acp/alsa-mixer.c:4544
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
msgid "Analog Surround 2.1"
msgstr "Envolvente analóxico 2.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4545
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
msgid "Analog Surround 3.0"
msgstr "Envolvente analóxico 3.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4546
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
msgid "Analog Surround 3.1"
msgstr "Envolvente analóxico 3.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4547
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
msgid "Analog Surround 4.0"
msgstr "Envolvente analóxico 4.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4548
#: spa/plugins/alsa/acp/alsa-mixer.c:4492
msgid "Analog Surround 4.1"
msgstr "Envolvente analóxico 4.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4549
#: spa/plugins/alsa/acp/alsa-mixer.c:4493
msgid "Analog Surround 5.0"
msgstr "Envolvente analóxico 5.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4550
#: spa/plugins/alsa/acp/alsa-mixer.c:4494
msgid "Analog Surround 5.1"
msgstr "Envolvente analóxico 5.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4551
#: spa/plugins/alsa/acp/alsa-mixer.c:4495
msgid "Analog Surround 6.0"
msgstr "Envolvente analóxico 6.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4552
#: spa/plugins/alsa/acp/alsa-mixer.c:4496
msgid "Analog Surround 6.1"
msgstr "Envolvente analóxico 6.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4553
#: spa/plugins/alsa/acp/alsa-mixer.c:4497
msgid "Analog Surround 7.0"
msgstr "Envolvente analóxico 7.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4554
#: spa/plugins/alsa/acp/alsa-mixer.c:4498
msgid "Analog Surround 7.1"
msgstr "Envolvente analóxico 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4555
#: spa/plugins/alsa/acp/alsa-mixer.c:4499
msgid "Digital Stereo (IEC958)"
msgstr "Estéreo dixital (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4556
#: spa/plugins/alsa/acp/alsa-mixer.c:4500
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "Envolvente dixital 4.0 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4557
#: spa/plugins/alsa/acp/alsa-mixer.c:4501
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Envolvente dixital 5.1 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4558
#: spa/plugins/alsa/acp/alsa-mixer.c:4502
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "Envolvente dixital 5.1 (IEC958/ACDTS)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4559
#: spa/plugins/alsa/acp/alsa-mixer.c:4503
msgid "Digital Stereo (HDMI)"
msgstr "Estéreo dixital (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4560
#: spa/plugins/alsa/acp/alsa-mixer.c:4504
msgid "Digital Surround 5.1 (HDMI)"
msgstr "Envolvente dixital 5.1 (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4561
#: spa/plugins/alsa/acp/alsa-mixer.c:4505
msgid "Chat"
msgstr ""
msgstr "Chat"
#: spa/plugins/alsa/acp/alsa-mixer.c:4562
#: spa/plugins/alsa/acp/alsa-mixer.c:4506
msgid "Game"
msgstr ""
msgstr "Xogo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4696
#: spa/plugins/alsa/acp/alsa-mixer.c:4640
msgid "Analog Mono Duplex"
msgstr "Monoaural analóxico dúplex"
#: spa/plugins/alsa/acp/alsa-mixer.c:4697
#: spa/plugins/alsa/acp/alsa-mixer.c:4641
msgid "Analog Stereo Duplex"
msgstr "Estéreo analóxico dúplex"
#: spa/plugins/alsa/acp/alsa-mixer.c:4700
#: spa/plugins/alsa/acp/alsa-mixer.c:4644
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Estéreo dixital dúplex (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4701
#: spa/plugins/alsa/acp/alsa-mixer.c:4645
msgid "Multichannel Duplex"
msgstr "Dúplex multicanle"
#: spa/plugins/alsa/acp/alsa-mixer.c:4702
#: spa/plugins/alsa/acp/alsa-mixer.c:4646
msgid "Stereo Duplex"
msgstr "Dúplex estéreo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4703
#: spa/plugins/alsa/acp/alsa-mixer.c:4647
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Chat mono + envolvente 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4806
#: spa/plugins/alsa/acp/alsa-mixer.c:4754
#, c-format
msgid "%s Output"
msgstr "Saída %s"
#: spa/plugins/alsa/acp/alsa-mixer.c:4813
#: spa/plugins/alsa/acp/alsa-mixer.c:4761
#, c-format
msgid "%s Input"
msgstr "Entrada %s"
#: spa/plugins/alsa/acp/alsa-util.c:1175 spa/plugins/alsa/acp/alsa-util.c:1269
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -490,16 +559,16 @@ msgstr[1] ""
"O máis probábel é que sexa un erro do controlador ALSA «%s». Informe disto "
"aos desenvolvedores de ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1241
#: spa/plugins/alsa/acp/alsa-util.c:1239
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
"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"
"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] ""
@ -513,7 +582,7 @@ msgstr[1] ""
"O máis probábel é que sexa un erro do controlador ALSA «%s». Informe disto "
"aos desenvolvedores de ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1288
#: spa/plugins/alsa/acp/alsa-util.c:1286
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -526,7 +595,7 @@ msgstr ""
"O máis probábel é que sexa un erro do controlador ALSA «%s». Informe disto "
"aos desenvolvedores de ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1331
#: spa/plugins/alsa/acp/alsa-util.c:1329
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -549,62 +618,90 @@ msgstr[1] ""
"O máis probábel é que sexa un erro do controlador ALSA «%s». Informe disto "
"aos desenvolvedores de ALSA."
#: spa/plugins/bluez5/bluez5-device.c:1010
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr ""
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(incorrecto)"
#: spa/plugins/bluez5/bluez5-device.c:1033
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "Audio interno"
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "Módem"
#: spa/plugins/bluez5/bluez5-device.c:1196
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Porta de enlace de son (Orixe A2DP e HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1221
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr ""
msgstr "Reprodución de alta fidelidade (Sumideiro A2DP, códec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1035
#: spa/plugins/bluez5/bluez5-device.c:1224
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr ""
msgstr "Dúplex de alta fidelidade (Orixe/sumideiro A2DP, códec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1041
#: spa/plugins/bluez5/bluez5-device.c:1232
msgid "High Fidelity Playback (A2DP Sink)"
msgstr ""
msgstr "Reprodución de alta fidelidade (Sumideiro A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1043
#: spa/plugins/bluez5/bluez5-device.c:1234
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr ""
msgstr "Dúplex de alta fidelidade (Orixe/sumideiro A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1070
#: spa/plugins/bluez5/bluez5-device.c:1262
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr ""
msgstr "Unidade de auriculares de cabeza (HSP/HFP, códec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1074
#: spa/plugins/bluez5/bluez5-device.c:1267
msgid "Headset Head Unit (HSP/HFP)"
msgstr ""
msgstr "Unidade de auriculares de cabeza (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1140
#: spa/plugins/bluez5/bluez5-device.c:1346
#: spa/plugins/bluez5/bluez5-device.c:1351
#: spa/plugins/bluez5/bluez5-device.c:1358
#: spa/plugins/bluez5/bluez5-device.c:1364
#: spa/plugins/bluez5/bluez5-device.c:1370
#: spa/plugins/bluez5/bluez5-device.c:1376
#: spa/plugins/bluez5/bluez5-device.c:1382
#: spa/plugins/bluez5/bluez5-device.c:1388
#: spa/plugins/bluez5/bluez5-device.c:1394
msgid "Handsfree"
msgstr "Sen mans"
#: spa/plugins/bluez5/bluez5-device.c:1155
#: spa/plugins/bluez5/bluez5-device.c:1352
#| msgid "Handsfree"
msgid "Handsfree (HFP)"
msgstr "Sen mans (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1369
msgid "Headphone"
msgstr "Auriculares"
#: spa/plugins/bluez5/bluez5-device.c:1160
#: spa/plugins/bluez5/bluez5-device.c:1375
msgid "Portable"
msgstr "Portátil"
#: spa/plugins/bluez5/bluez5-device.c:1165
#: spa/plugins/bluez5/bluez5-device.c:1381
msgid "Car"
msgstr "Automóbil"
#: spa/plugins/bluez5/bluez5-device.c:1170
#: spa/plugins/bluez5/bluez5-device.c:1387
msgid "HiFi"
msgstr "Hifi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1175
#: spa/plugins/bluez5/bluez5-device.c:1393
msgid "Phone"
msgstr "Teléfono"
#: spa/plugins/bluez5/bluez5-device.c:1181
#, fuzzy
#: spa/plugins/bluez5/bluez5-device.c:1400
msgid "Bluetooth"
msgstr "Entrada de Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1401
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

112
po/hr.po
View File

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-30 12:50+0200\n"
"PO-Revision-Date: 2022-06-30 13:14+0200\n"
"POT-Creation-Date: 2022-10-01 14:01+0200\n"
"PO-Revision-Date: 2022-10-01 14:12+0200\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
"Language-Team: Croatian <https://translate.fedoraproject.org/projects/"
"pipewire/pipewire/hr/>\n"
@ -16,9 +16,9 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Poedit 2.3\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Poedit 3.0.1\n"
"X-Launchpad-Export-Date: 2017-04-20 21:04+0000\n"
#: src/daemon/pipewire.c:46
@ -44,7 +44,7 @@ msgstr "Tunel do %s/%s"
msgid "Dummy Output"
msgstr "Lažni izlaz"
#: src/modules/module-pulse-tunnel.c:648
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel za %s@%s"
@ -164,7 +164,7 @@ msgstr ""
" -d, --dsd DSD način\n"
"\n"
#: src/tools/pw-cli.c:3165
#: src/tools/pw-cli.c:2250
#, c-format
msgid ""
"%s [options] [command]\n"
@ -187,8 +187,8 @@ msgstr ""
msgid "Pro Audio"
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:446 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1161
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Isključeno"
@ -215,7 +215,7 @@ msgstr "Ulaz"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1330
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Mikrofon"
@ -281,7 +281,7 @@ msgid "No Bass Boost"
msgstr "Bez pojačanja basa"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1335
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Zvučnik"
@ -396,7 +396,7 @@ msgstr "Stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1320
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Slušalice s mikrofonom"
@ -520,7 +520,8 @@ msgstr "%s izlaz"
msgid "%s Input"
msgstr "%s ulaz"
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187
#: spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -548,16 +549,16 @@ msgstr[2] ""
"Najvjerojatnije je ovo greška ALSA upravljačkog programa '%s'. Prijavite "
"problem ALSA razvijateljima."
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
"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"
"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] ""
@ -566,17 +567,17 @@ msgstr[0] ""
"Najvjerojatnije je ovo greška ALSA upravljačkog programa '%s'. Prijavite "
"problem ALSA razvijateljima."
msgstr[1] ""
"snd_pcm_delay() je vratio vrijednost koja je iznimno velika: %li bajta (%s"
"%lu ms).\n"
"snd_pcm_delay() je vratio vrijednost koja je iznimno velika: %li bajta "
"(%s%lu ms).\n"
"Najvjerojatnije je ovo greška ALSA upravljačkog programa '%s'. Prijavite "
"problem ALSA razvijateljima."
msgstr[2] ""
"snd_pcm_delay() je vratio vrijednost koja je iznimno velika: %li bajta (%s"
"%lu ms).\n"
"snd_pcm_delay() je vratio vrijednost koja je iznimno velika: %li bajta "
"(%s%lu ms).\n"
"Najvjerojatnije je ovo greška ALSA upravljačkog programa '%s'. Prijavite "
"problem ALSA razvijateljima."
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -589,7 +590,7 @@ msgstr ""
"Najvjerojatnije je ovo greška ALSA upravljačkog programa '%s'. Prijavite "
"problem ALSA razvijateljima."
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -629,65 +630,96 @@ msgstr "Ugrađeni zvuk"
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1172
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Zvučni pristupnik (A2DP izvor i HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1197
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "Reprodukcija visoke autentičnosti (A2DP slivnik, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1200
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "Telefonija visoke autentičnosti (A2DP slivnik, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1208
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Reprodukcija visoke autentičnosti (A2DP slivnik)"
#: spa/plugins/bluez5/bluez5-device.c:1210
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "Telefonija visoke autentičnosti (A2DP izvor/slivnik)"
#: spa/plugins/bluez5/bluez5-device.c:1238
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "Reprodukcija visoke autentičnosti (BAP slivnik, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "Ulaz visoke autentičnosti (BAP izvor, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "Telefonija visoke autentičnosti (BAP izvor/slivnik, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Jedinica slušalice s mikrofonom (HSP/HFP, kôdek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1243
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Jedinica slušalice s mikrofonom (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1325
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Bez-ruku"
#: spa/plugins/bluez5/bluez5-device.c:1340
msgid "Headphone"
msgstr "Slušalice"
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "Bez-ruku (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1345
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Slušalica"
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Prijenosnik"
#: spa/plugins/bluez5/bluez5-device.c:1350
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Automobil"
#: spa/plugins/bluez5/bluez5-device.c:1355
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1360
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1366
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"
#~ msgid "PipeWire Media System"
#~ msgstr "PipeWire medijski sustav"

519
po/hu.po
View File

@ -1,18 +1,18 @@
# Hungarian translation of PipeWire
# Copyright (C) 2012, 2016. Free Software Foundation, Inc.
# Hungarian translation for PipeWire.
# Copyright (C) 2012, 2016, 2022. Free Software Foundation, Inc.
# This file is distributed under the same license as the PipeWire package.
#
# KAMI <kami911@gmail.com>, 2012.
# KAMI <kami911 at gmail dot com>, 2012.
# Gabor Kelemen <kelemeng at ubuntu dot com>, 2016.
# Balázs Úr <urbalazs at gmail dot com>, 2016.
# Balázs Úr <ur.balazs at fsf dot hu>, 2016, 2022.
msgid ""
msgstr ""
"Project-Id-Version: PipeWire master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"POT-Creation-Date: 2021-04-18 16:54+0800\n"
"PO-Revision-Date: 2020-07-21 15:29+0000\n"
"Last-Translator: Balázs Meskó <meskobalazs@mailbox.org>\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2022-09-15 15:26+0000\n"
"PO-Revision-Date: 2022-09-21 22:35+0200\n"
"Last-Translator: Balázs Úr <ur.balazs at fsf dot hu>\n"
"Language-Team: Hungarian <https://translate.fedoraproject.org/projects/"
"pipewire/pipewire/hu/>\n"
"Language: hu\n"
@ -20,12 +20,9 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.1.1\n"
"X-Poedit-Language: Hungarian\n"
"X-Poedit-Country: HUNGARY\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Generator: Lokalize 19.12.3\n"
#: src/daemon/pipewire.c:43
#: src/daemon/pipewire.c:46
#, c-format
msgid ""
"%s [options]\n"
@ -33,40 +30,64 @@ msgid ""
" --version Show version\n"
" -c, --config Load config (Default %s)\n"
msgstr ""
"%s [kapcsolók]\n"
" -h, --help Ezen súgó megjelenítése\n"
" --version Verzió megjelenítése\n"
" -c, --config Beállítás betöltése (alapérték: %s)\n"
#: src/daemon/pipewire.desktop.in:4
msgid "PipeWire Media System"
msgstr ""
msgstr "PipeWire médiarendszer"
#: src/daemon/pipewire.desktop.in:5
msgid "Start the PipeWire Media System"
msgstr ""
msgstr "A PipeWire médiarendszer indítása"
#: src/examples/media-session/alsa-monitor.c:526
#: spa/plugins/alsa/acp/compat.c:187
msgid "Built-in Audio"
msgstr "Belső hangforrás"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Alagút ide: %s/%s"
#: src/examples/media-session/alsa-monitor.c:530
#: spa/plugins/alsa/acp/compat.c:192
msgid "Modem"
msgstr "Modem"
#: src/modules/module-fallback-sink.c:51
msgid "Dummy Output"
msgstr "Üres kimenet"
#: src/examples/media-session/alsa-monitor.c:539
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Alagút ehhez: %s@%s"
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr ""
msgstr "Ismeretlen eszköz"
#: src/tools/pw-cat.c:991
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s ezen: %s@%s"
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s ezen: %s"
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] <file>\n"
"%s [options] [<file>|-]\n"
" -h, --help Show this help\n"
" --version Show version\n"
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [kapcsolók] [<fájl>|-]\n"
" -h, --help Ezen súgó megjelenítése\n"
" --version Verzió megjelenítése\n"
" -v, --verbose Részletes műveletek engedélyezése\n"
"\n"
#: src/tools/pw-cat.c:998
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -80,11 +101,30 @@ msgid ""
" or direct samples (256)\n"
" the rate is the one of the source "
"file\n"
" --list-targets List available targets for --target\n"
" -P --properties Set node properties\n"
"\n"
msgstr ""
" -R, --remote Távoli démon neve\n"
" --media-type Médiatípus beállítása (alapérték: "
"%s)\n"
" --media-category Médiakategória beállítása\n"
" (alapérték: %s)\n"
" --media-role Médiaszerep beállítása (alapérték: "
"%s)\n"
" --target Csomópont céljának beállítása\n"
" (alapérték: %s), a 0 azt jelenti,\n"
" hogy ne linkeljen\n"
" --latency Csomópont késleltetésének "
"beállítása\n"
" (alapérték: %s)\n"
" Xegység (egység = s, ms, us, ns)\n"
" vagy közvetlen minták (256)\n"
" a gyakoriság a forrásfájl egyike\n"
" -P --properties Csomópont tulajdonságainak "
"beállítása\n"
"\n"
#: src/tools/pw-cat.c:1016
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -103,16 +143,39 @@ msgid ""
"%d)\n"
"\n"
msgstr ""
" --rate Mintavételi gyakoriság (kötelező a\n"
" rögzítéshez) (alapérték: %u)\n"
" --channels Csatornák száma (kötelező a\n"
" rögzítéshez) (alapérték: %u)\n"
" --channel-map Csatornaleképezés\n"
" ezek egyike: „stereo”, "
"„surround-51”\n"
" stb. vagy csatornanevek vesszővel\n"
" tagolt listája, például: „FL,FR”\n"
" --format Mintavételi formátum: %s (kötelező "
"a\n"
" rögzítéshez) (alapérték: %s)\n"
" --volume Adatfolyam hangereje 0-1.0\n"
" (alapérték: %.3f)\n"
" -q --quality Újramintavételezési minőség (0-15)\n"
" (alapérték: %d)\n"
"\n"
#: src/tools/pw-cat.c:1033
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
" -d, --dsd DSD mode\n"
"\n"
msgstr ""
" -p, --playback Lejátszási mód\n"
" -r, --record Rögzítési mód\n"
" -m, --midi Midi mód\n"
" -d, --dsd DSD mód\n"
"\n"
#: src/tools/pw-cli.c:2932
#: src/tools/pw-cli.c:2255
#, c-format
msgid ""
"%s [options] [command]\n"
@ -122,360 +185,353 @@ msgid ""
" -r, --remote Remote daemon name\n"
"\n"
msgstr ""
"%s [kapcsolók] [parancs]\n"
" -h, --help Ezen súgó megjelenítése\n"
" --version Verzió megjelenítése\n"
" -d, --daemon Indítás démonként (alapérték: "
"hamis)\n"
" -r, --remote Távoli démon neve\n"
"\n"
#: spa/plugins/alsa/acp/acp.c:290
#: spa/plugins/alsa/acp/acp.c:321
msgid "Pro Audio"
msgstr ""
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:411 spa/plugins/alsa/acp/alsa-mixer.c:4704
#: spa/plugins/bluez5/bluez5-device.c:1000
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Kikapcsolva"
msgstr "Ki"
#: spa/plugins/alsa/acp/channelmap.h:466
msgid "(invalid)"
msgstr "(Érvénytelen)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2709
#: spa/plugins/alsa/acp/alsa-mixer.c:2652
msgid "Input"
msgstr "Bemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2710
#: spa/plugins/alsa/acp/alsa-mixer.c:2653
msgid "Docking Station Input"
msgstr "Dokkolóállomás bemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2711
#: spa/plugins/alsa/acp/alsa-mixer.c:2654
msgid "Docking Station Microphone"
msgstr "Dokkolóállomás mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2712
#: spa/plugins/alsa/acp/alsa-mixer.c:2655
msgid "Docking Station Line In"
msgstr "Dokkolóállomás vonalbemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2713
#: spa/plugins/alsa/acp/alsa-mixer.c:2804
#: spa/plugins/alsa/acp/alsa-mixer.c:2656
#: spa/plugins/alsa/acp/alsa-mixer.c:2747
msgid "Line In"
msgstr "Vonalbemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2714
#: spa/plugins/alsa/acp/alsa-mixer.c:2798
#: spa/plugins/bluez5/bluez5-device.c:1145
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2715
#: spa/plugins/alsa/acp/alsa-mixer.c:2799
#: spa/plugins/alsa/acp/alsa-mixer.c:2658
#: spa/plugins/alsa/acp/alsa-mixer.c:2742
msgid "Front Microphone"
msgstr "Első mikrofon"
msgstr "Elülső mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2716
#: spa/plugins/alsa/acp/alsa-mixer.c:2800
#: spa/plugins/alsa/acp/alsa-mixer.c:2659
#: spa/plugins/alsa/acp/alsa-mixer.c:2743
msgid "Rear Microphone"
msgstr "Hátsó mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2717
#: spa/plugins/alsa/acp/alsa-mixer.c:2660
msgid "External Microphone"
msgstr "Külső mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2718
#: spa/plugins/alsa/acp/alsa-mixer.c:2802
#: spa/plugins/alsa/acp/alsa-mixer.c:2661
#: spa/plugins/alsa/acp/alsa-mixer.c:2745
msgid "Internal Microphone"
msgstr "Belső mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2719
#: spa/plugins/alsa/acp/alsa-mixer.c:2805
#: spa/plugins/alsa/acp/alsa-mixer.c:2662
#: spa/plugins/alsa/acp/alsa-mixer.c:2748
msgid "Radio"
msgstr "Rádió"
#: spa/plugins/alsa/acp/alsa-mixer.c:2720
#: spa/plugins/alsa/acp/alsa-mixer.c:2806
#: spa/plugins/alsa/acp/alsa-mixer.c:2663
#: spa/plugins/alsa/acp/alsa-mixer.c:2749
msgid "Video"
msgstr "Videó"
#: spa/plugins/alsa/acp/alsa-mixer.c:2721
#: spa/plugins/alsa/acp/alsa-mixer.c:2664
msgid "Automatic Gain Control"
msgstr "Automatikus erősítésszabályzás"
#: spa/plugins/alsa/acp/alsa-mixer.c:2722
#: spa/plugins/alsa/acp/alsa-mixer.c:2665
msgid "No Automatic Gain Control"
msgstr "Nincs automatikus erősítésszabályzás"
#: spa/plugins/alsa/acp/alsa-mixer.c:2723
#: spa/plugins/alsa/acp/alsa-mixer.c:2666
msgid "Boost"
msgstr "Erősítés"
#: spa/plugins/alsa/acp/alsa-mixer.c:2724
#: spa/plugins/alsa/acp/alsa-mixer.c:2667
msgid "No Boost"
msgstr "Nincs erősítés"
#: spa/plugins/alsa/acp/alsa-mixer.c:2725
#: spa/plugins/alsa/acp/alsa-mixer.c:2668
msgid "Amplifier"
msgstr "Erősítő"
#: spa/plugins/alsa/acp/alsa-mixer.c:2726
#: spa/plugins/alsa/acp/alsa-mixer.c:2669
msgid "No Amplifier"
msgstr "Nincs erősítő"
#: spa/plugins/alsa/acp/alsa-mixer.c:2727
#: spa/plugins/alsa/acp/alsa-mixer.c:2670
msgid "Bass Boost"
msgstr "Basszuskiemelés"
#: spa/plugins/alsa/acp/alsa-mixer.c:2728
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
msgid "No Bass Boost"
msgstr "Nincs basszuskiemelés"
#: spa/plugins/alsa/acp/alsa-mixer.c:2729
#: spa/plugins/bluez5/bluez5-device.c:1150
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Hangszóró"
#: spa/plugins/alsa/acp/alsa-mixer.c:2730
#: spa/plugins/alsa/acp/alsa-mixer.c:2808
#: spa/plugins/alsa/acp/alsa-mixer.c:2673
#: spa/plugins/alsa/acp/alsa-mixer.c:2751
msgid "Headphones"
msgstr "Analóg fejhallgató"
msgstr "Fejhallgató"
#: spa/plugins/alsa/acp/alsa-mixer.c:2797
#: spa/plugins/alsa/acp/alsa-mixer.c:2740
msgid "Analog Input"
msgstr "Analóg bemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2801
#: spa/plugins/alsa/acp/alsa-mixer.c:2744
msgid "Dock Microphone"
msgstr "Dokkolóállomás mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2803
#: spa/plugins/alsa/acp/alsa-mixer.c:2746
msgid "Headset Microphone"
msgstr "Fejhallgató mikrofon"
#: spa/plugins/alsa/acp/alsa-mixer.c:2807
#: spa/plugins/alsa/acp/alsa-mixer.c:2750
msgid "Analog Output"
msgstr "Analóg kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2809
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2752
msgid "Headphones 2"
msgstr "Analóg fejhallgató"
msgstr "2. fejhallgató"
#: spa/plugins/alsa/acp/alsa-mixer.c:2810
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2753
msgid "Headphones Mono Output"
msgstr "Analóg mono kimenet"
msgstr "Fejhallató monó kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2811
#: spa/plugins/alsa/acp/alsa-mixer.c:2754
msgid "Line Out"
msgstr "Vonalkimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2812
#: spa/plugins/alsa/acp/alsa-mixer.c:2755
msgid "Analog Mono Output"
msgstr "Analóg mono kimenet"
msgstr "Analóg monó kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2813
#: spa/plugins/alsa/acp/alsa-mixer.c:2756
msgid "Speakers"
msgstr "Hangszórók"
#: spa/plugins/alsa/acp/alsa-mixer.c:2814
#: spa/plugins/alsa/acp/alsa-mixer.c:2757
msgid "HDMI / DisplayPort"
msgstr "HDMI / DisplayPort"
#: spa/plugins/alsa/acp/alsa-mixer.c:2815
#: spa/plugins/alsa/acp/alsa-mixer.c:2758
msgid "Digital Output (S/PDIF)"
msgstr "Digitális kimenet (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2816
#: spa/plugins/alsa/acp/alsa-mixer.c:2759
msgid "Digital Input (S/PDIF)"
msgstr "Digitális bemenet (S/PDIF)"
#: spa/plugins/alsa/acp/alsa-mixer.c:2817
#: spa/plugins/alsa/acp/alsa-mixer.c:2760
msgid "Multichannel Input"
msgstr "Többcsatornás bemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2818
#: spa/plugins/alsa/acp/alsa-mixer.c:2761
msgid "Multichannel Output"
msgstr "Többcsatornás kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2819
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2762
msgid "Game Output"
msgstr "%s kimenet"
msgstr "Játék kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2820
#: spa/plugins/alsa/acp/alsa-mixer.c:2821
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2763
#: spa/plugins/alsa/acp/alsa-mixer.c:2764
msgid "Chat Output"
msgstr "%s kimenet"
msgstr "Csevegés kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2822
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2765
msgid "Chat Input"
msgstr "%s bemenet"
msgstr "Csevegés bemenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:2823
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:2766
msgid "Virtual Surround 7.1"
msgstr "Virtuális térhatású nyelő"
msgstr "Virtuális térhatás 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4527
#: spa/plugins/alsa/acp/alsa-mixer.c:4471
msgid "Analog Mono"
msgstr "Analóg mono"
msgstr "Analóg monó"
#: spa/plugins/alsa/acp/alsa-mixer.c:4528
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
msgid "Analog Mono (Left)"
msgstr "Analóg mono"
msgstr "Analóg monó (bal)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4529
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
msgid "Analog Mono (Right)"
msgstr "Analóg mono"
msgstr "Analóg monó (jobb)"
#. 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:4530
#: spa/plugins/alsa/acp/alsa-mixer.c:4538
#: spa/plugins/alsa/acp/alsa-mixer.c:4539
#: spa/plugins/alsa/acp/alsa-mixer.c:4474
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
msgid "Analog Stereo"
msgstr "Analóg sztereó"
#: spa/plugins/alsa/acp/alsa-mixer.c:4531
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
msgid "Mono"
msgstr "Mono"
msgstr "Monó"
#: spa/plugins/alsa/acp/alsa-mixer.c:4532
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
msgid "Stereo"
msgstr "Sztereó"
#: spa/plugins/alsa/acp/alsa-mixer.c:4540
#: spa/plugins/alsa/acp/alsa-mixer.c:4698
#: spa/plugins/bluez5/bluez5-device.c:1135
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Fejhallgató"
#: spa/plugins/alsa/acp/alsa-mixer.c:4541
#: spa/plugins/alsa/acp/alsa-mixer.c:4699
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
#: spa/plugins/alsa/acp/alsa-mixer.c:4643
msgid "Speakerphone"
msgstr "Hangszóró"
msgstr "Mikrofonos fejhallgató"
#: spa/plugins/alsa/acp/alsa-mixer.c:4542
#: spa/plugins/alsa/acp/alsa-mixer.c:4543
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
msgid "Multichannel"
msgstr "Többcsatornás"
#: spa/plugins/alsa/acp/alsa-mixer.c:4544
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
msgid "Analog Surround 2.1"
msgstr "Analóg térhatású 2.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4545
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
msgid "Analog Surround 3.0"
msgstr "Analóg térhatású 3.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4546
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
msgid "Analog Surround 3.1"
msgstr "Analóg térhatású 3.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4547
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
msgid "Analog Surround 4.0"
msgstr "Analóg térhatású 4.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4548
#: spa/plugins/alsa/acp/alsa-mixer.c:4492
msgid "Analog Surround 4.1"
msgstr "Analóg térhatású 4.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4549
#: spa/plugins/alsa/acp/alsa-mixer.c:4493
msgid "Analog Surround 5.0"
msgstr "Analóg térhatású 5.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4550
#: spa/plugins/alsa/acp/alsa-mixer.c:4494
msgid "Analog Surround 5.1"
msgstr "Analóg térhatású 5.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4551
#: spa/plugins/alsa/acp/alsa-mixer.c:4495
msgid "Analog Surround 6.0"
msgstr "Analóg térhatású 6.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4552
#: spa/plugins/alsa/acp/alsa-mixer.c:4496
msgid "Analog Surround 6.1"
msgstr "Analóg térhatású 6.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4553
#: spa/plugins/alsa/acp/alsa-mixer.c:4497
msgid "Analog Surround 7.0"
msgstr "Analóg térhatású 7.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4554
#: spa/plugins/alsa/acp/alsa-mixer.c:4498
msgid "Analog Surround 7.1"
msgstr "Analóg térhatású 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4555
#: spa/plugins/alsa/acp/alsa-mixer.c:4499
msgid "Digital Stereo (IEC958)"
msgstr "Digitális sztereó (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4556
#: spa/plugins/alsa/acp/alsa-mixer.c:4500
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "Digitális térhatású 4.0 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4557
#: spa/plugins/alsa/acp/alsa-mixer.c:4501
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4558
#: spa/plugins/alsa/acp/alsa-mixer.c:4502
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "Digitális térhatású 5.1 (IEC958/DTS)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4559
#: spa/plugins/alsa/acp/alsa-mixer.c:4503
msgid "Digital Stereo (HDMI)"
msgstr "Digitális térhatású (HDMI)"
msgstr "Digitális sztereó (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4560
#: spa/plugins/alsa/acp/alsa-mixer.c:4504
msgid "Digital Surround 5.1 (HDMI)"
msgstr "Digitális térhatású 5.1 (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4561
#: spa/plugins/alsa/acp/alsa-mixer.c:4505
msgid "Chat"
msgstr ""
msgstr "Csevegés"
#: spa/plugins/alsa/acp/alsa-mixer.c:4562
#: spa/plugins/alsa/acp/alsa-mixer.c:4506
msgid "Game"
msgstr ""
msgstr "Játék"
#: spa/plugins/alsa/acp/alsa-mixer.c:4696
#: spa/plugins/alsa/acp/alsa-mixer.c:4640
msgid "Analog Mono Duplex"
msgstr "Analóg mono duplex"
msgstr "Analóg monó kétirányú"
#: spa/plugins/alsa/acp/alsa-mixer.c:4697
#: spa/plugins/alsa/acp/alsa-mixer.c:4641
msgid "Analog Stereo Duplex"
msgstr "Analóg sztereó duplex"
msgstr "Analóg sztereó kétirányú"
#: spa/plugins/alsa/acp/alsa-mixer.c:4700
#: spa/plugins/alsa/acp/alsa-mixer.c:4644
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Analóg sztereó duplex (IEC958)"
msgstr "Digitális sztereó kétirányú (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4701
#: spa/plugins/alsa/acp/alsa-mixer.c:4645
msgid "Multichannel Duplex"
msgstr "Többcsatornás duplex"
msgstr "Többcsatornás kétirányú"
#: spa/plugins/alsa/acp/alsa-mixer.c:4702
#, fuzzy
#: spa/plugins/alsa/acp/alsa-mixer.c:4646
msgid "Stereo Duplex"
msgstr "Analóg sztereó duplex"
msgstr "Sztereó kétirányú"
#: spa/plugins/alsa/acp/alsa-mixer.c:4703
#: spa/plugins/alsa/acp/alsa-mixer.c:4647
msgid "Mono Chat + 7.1 Surround"
msgstr ""
msgstr "Monó csevegés + 7.1 térhatású"
#: spa/plugins/alsa/acp/alsa-mixer.c:4806
#: spa/plugins/alsa/acp/alsa-mixer.c:4754
#, c-format
msgid "%s Output"
msgstr "%s kimenet"
#: spa/plugins/alsa/acp/alsa-mixer.c:4813
#: spa/plugins/alsa/acp/alsa-mixer.c:4761
#, c-format
msgid "%s Input"
msgstr "%s bemenet"
#: spa/plugins/alsa/acp/alsa-util.c:1175 spa/plugins/alsa/acp/alsa-util.c:1269
#, fuzzy, c-format
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
"ms).\n"
@ -487,18 +543,18 @@ msgid_plural ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr[0] ""
"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
"Az „snd_pcm_avail()” függvény különlegesen nagy értéket adott vissza: %lu "
"bájt (%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
msgstr[1] ""
"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
"Az „snd_pcm_avail()” függvény különlegesen nagy értéket adott vissza: %lu "
"bájt (%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
#: spa/plugins/alsa/acp/alsa-util.c:1241
#, fuzzy, c-format
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
@ -510,17 +566,17 @@ msgid_plural ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr[0] ""
"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li "
"Az „snd_pcm_delay()” függvény különlegesen nagy értéket adott vissza: %li "
"bájt (%s%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
msgstr[1] ""
"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li "
"Az „snd_pcm_delay()” függvény különlegesen nagy értéket adott vissza: %li "
"bájt (%s%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
#: spa/plugins/alsa/acp/alsa-util.c:1288
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -528,13 +584,13 @@ msgid ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr ""
"A „snd_pcm_avail_delay()” függvény furcsa értékeket adott vissza: a "
"Az „snd_pcm_avail_delay()” függvény furcsa értékeket adott vissza: a "
"késleltetés (%lu) kisebb, mint az elérhető %lu.\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
#: spa/plugins/alsa/acp/alsa-util.c:1331
#, fuzzy, c-format
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
"(%lu ms).\n"
@ -546,73 +602,114 @@ msgid_plural ""
"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
"to the ALSA developers."
msgstr[0] ""
"A „snd_pcm_mmap_begin()” függvény visszatérési értéke kivételesen nagy: %lu "
"bájt (%lu ms).\n"
"Az „snd_pcm_mmap_begin()” függvény különlegesen nagy értéket adott vissza: "
"%lu bájt (%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
msgstr[1] ""
"A „snd_pcm_mmap_begin()” függvény visszatérési értéke kivételesen nagy: %lu "
"bájt (%lu ms).\n"
"Az „snd_pcm_mmap_begin()” függvény különlegesen nagy értéket adott vissza: "
"%lu bájt (%lu ms).\n"
"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
"ezt a problémát az ALSA fejlesztői felé."
#: spa/plugins/bluez5/bluez5-device.c:1010
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr ""
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(érvénytelen)"
#: spa/plugins/bluez5/bluez5-device.c:1033
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "Beépített hangforrás"
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Hang átjáró (A2DP forrás és HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr ""
msgstr "Magas hűségű lejátszás (A2DP fogadó, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1035
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr ""
msgstr "Magas hűségű kétirányú (A2DP forrás/fogadó, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1041
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr ""
msgstr "Magas hűségű lejátszás (A2DP fogadó)"
#: spa/plugins/bluez5/bluez5-device.c:1043
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr ""
msgstr "Magas hűségű kétirányú (A2DP forrás/fogadó)"
#: spa/plugins/bluez5/bluez5-device.c:1070
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "Magas hűségű lejátszás (BAP fogadó, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "Magas hűségű bemenet (BAP forrás, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "Magas hűségű kétirányú (BAP forrás/fogadó, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr ""
msgstr "Fejhallgató fejegység (HSP/HFP, %s kodek)"
#: spa/plugins/bluez5/bluez5-device.c:1074
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr ""
msgstr "Fejhallgató fejegység (HSP/HFP)"
# FIXME: utánanézni
#: spa/plugins/bluez5/bluez5-device.c:1140
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Kihangosító"
#: spa/plugins/bluez5/bluez5-device.c:1155
msgid "Headphone"
msgstr "Fülhallgató"
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "Kihangosító (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1160
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Fejhallgató"
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Hordozható"
#: spa/plugins/bluez5/bluez5-device.c:1165
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Autó"
#: spa/plugins/bluez5/bluez5-device.c:1170
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "Hi-Fi"
#: spa/plugins/bluez5/bluez5-device.c:1175
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1181
#, fuzzy
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth bemenet"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

View File

@ -34,11 +34,11 @@ msgstr ""
#: src/daemon/pipewire.desktop.in:4
msgid "PipeWire Media System"
msgstr "Sistema Multimediale PipeWire"
msgstr "Sistema multimediale PipeWire"
#: src/daemon/pipewire.desktop.in:5
msgid "Start the PipeWire Media System"
msgstr "Avvia il Sistema Multimediale PipeWire"
msgstr "Avvia il sistema multimediale PipeWire"
#: src/examples/media-session/alsa-monitor.c:526
#: spa/plugins/alsa/acp/compat.c:187
@ -144,16 +144,16 @@ msgstr "Ingresso docking station"
#: spa/plugins/alsa/acp/alsa-mixer.c:2711
msgid "Docking Station Microphone"
msgstr "Microfono docking station"
msgstr "Microfono della docking station"
#: spa/plugins/alsa/acp/alsa-mixer.c:2712
msgid "Docking Station Line In"
msgstr "Linea in docking station"
msgstr "Linea di ingresso nella docking station"
#: spa/plugins/alsa/acp/alsa-mixer.c:2713
#: spa/plugins/alsa/acp/alsa-mixer.c:2804
msgid "Line In"
msgstr "Line-In"
msgstr "Linea di ingresso"
#: spa/plugins/alsa/acp/alsa-mixer.c:2714
#: spa/plugins/alsa/acp/alsa-mixer.c:2798
@ -258,7 +258,7 @@ msgstr "Uscita mono cuffie"
#: spa/plugins/alsa/acp/alsa-mixer.c:2811
msgid "Line Out"
msgstr "Line-Out"
msgstr "Linea di uscita"
#: spa/plugins/alsa/acp/alsa-mixer.c:2812
msgid "Analog Mono Output"
@ -350,7 +350,7 @@ msgstr "Vivavoce"
#: spa/plugins/alsa/acp/alsa-mixer.c:4542
#: spa/plugins/alsa/acp/alsa-mixer.c:4543
msgid "Multichannel"
msgstr "Multi canale"
msgstr "Multicanale"
#: spa/plugins/alsa/acp/alsa-mixer.c:4544
msgid "Analog Surround 2.1"
@ -442,7 +442,7 @@ msgstr "Duplex stereo digitale (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4701
msgid "Multichannel Duplex"
msgstr "Duplex multi canale"
msgstr "Duplex multicanale"
#: spa/plugins/alsa/acp/alsa-mixer.c:4702
msgid "Stereo Duplex"
@ -477,11 +477,11 @@ msgid_plural ""
msgstr[0] ""
"snd_pcm_avail() ha restituito un valore molto grande: %lu byte (%lu ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
msgstr[1] ""
"snd_pcm_avail() ha restituito un valore molto grande: %lu byte (%lu ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
#: spa/plugins/alsa/acp/alsa-util.c:1241
#, c-format
@ -498,11 +498,11 @@ msgid_plural ""
msgstr[0] ""
"snd_pcm_delay() ha restituito un valore molto grande: %li byte (%s%lu ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
msgstr[1] ""
"snd_pcm_delay() ha restituito un valore molto grande: %li byte (%s%lu ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
#: spa/plugins/alsa/acp/alsa-util.c:1288
#, c-format
@ -515,7 +515,7 @@ msgstr ""
"snd_pcm_avail() ha restituito dei valori strani: delay %lu è minore di avail "
"%lu.\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
#: spa/plugins/alsa/acp/alsa-util.c:1331
#, c-format
@ -533,12 +533,12 @@ msgstr[0] ""
"snd_pcm_mmap_begin() ha restituito un valore molto grande: %lu byte (%lu "
"ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
msgstr[1] ""
"snd_pcm_mmap_begin() ha restituito un valore molto grande: %lu byte (%lu "
"ms).\n"
"Molto probabilmente si tratta di un bug nel driver ALSA «%s». Segnalare "
"questo problema agli sviluppatori ALSA."
"questo problema ai suoi sviluppatori."
#: spa/plugins/bluez5/bluez5-device.c:1010
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
@ -547,20 +547,20 @@ msgstr "Gateway Audio (Sorgente A2DP & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1033
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "Riproduzione ad Alta Fedeltà (A2DP Sink, codec %s)"
msgstr "Riproduzione ad alta fedeltà (A2DP Sink, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1035
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "Duplex ad Alta Fedeltà (Sorgente/Sink, A2DP codec %s)"
msgstr "Duplex ad alta fedeltà (Sorgente/Sink, A2DP codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1041
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Riproduzione ad Alta Fedeltà (A2DP Sink)"
msgstr "Riproduzione ad alta fedeltà (A2DP Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1043
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "Duplex ad Alta Fedeltà (A2DP Source/Sink)"
msgstr "Duplex ad alta fedeltà (A2DP Source/Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1070
#, c-format
@ -573,7 +573,7 @@ msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1140
msgid "Handsfree"
msgstr "Sistema mani-libere"
msgstr "Vivavoce"
#: spa/plugins/bluez5/bluez5-device.c:1155
msgid "Headphone"

692
po/ka.po Normal file
View File

@ -0,0 +1,692 @@
# Georgian translation for pipewire.
# Copyright (C) 2022 pipewire'S authors
# This file is distributed under the same license as the pipewire package.
# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"POT-Creation-Date: 2022-06-30 12:50+0200\n"
"PO-Revision-Date: 2022-11-20 11:50+0100\n"
"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
"Language-Team: \n"
"Language: ka\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.2\n"
#: src/daemon/pipewire.c:46
#, 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/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "გვირაბი %s/%s -მდე"
#: src/modules/module-fallback-sink.c:51
msgid "Dummy Output"
msgstr "ნულოვანი გამოყვანა"
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "გვირაბი %s@%s-სთვის"
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr "უცნობი მოწყობილობა"
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s %s@%s -ზე"
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s %s-ზე"
#: src/tools/pw-cat.c:784
#, 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 [პარამეტრები] [<ფაილი>|-]\n"
" -h, --help ამ დახმარების ჩვენება\n"
" --version ვერსიის ჩვენება\n"
" -v, --verbose დამატებითი შეტყობინებების გამოტანა\n"
"\n"
#: src/tools/pw-cat.c:791
#, 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 (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 კვანძის სამიზნის დაყენება (ნაგულისხმები %s)\n"
" 0 ნიშნავს არ მიბმა\n"
" --latency კვანძის შეყოვნების დაყენება (ნაგულისხმები %s)\n"
" Xunit (ერთეული = s, ms, us, ns)\n"
" ან პირდაპირი ნიმუშები (256)\n"
" მაჩვენებელი არის ერთ-ერთი წყაროს "
"ფაილი\n"
" -P --properties კვანძის თვისებების დაყენება\n"
#: src/tools/pw-cat.c:809
#, 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 სემპლის_სიჩქარე (მოთხოვნილება rec.) (ნაგულისხმები %u)\n"
" --channels არხების რაოდენობა (მოთხოვნილი ჩანაწერისთვის) (ნაგულისხმები "
"%u)\n"
" --channel-map არხის რუკა\n"
" ერთ-ერთი: \"stereo\", "
"\"surround-51\",... ან\n"
" მძიმით გამოყოფილი არხის "
"სახელების სია: მაგ. \"FL, FR\"\n"
" --format ნიმუშის ფორმატი %s (მოთხოვნილება rec.) "
"(ნაგულისხმები %s)\n"
" --volume ნაკადის მოცულობა 0-1.0 (ნაგულისხმები %.3f)\n"
" -q --quality Resampler ხარისხი (0 - 15) "
"(ნაგულისხმები %d)\n"
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
" -d, --dsd DSD mode\n"
"\n"
msgstr ""
" -p, --playback დაკვრის რეჟიმი\n"
" -r, -- record ჩაწერის რეჟიმი\n"
" -m, --midi Midi რეჟიმი\n"
" -d, --dsd DSD რეჟიმი\n"
"\n"
#: src/tools/pw-cli.c:2250
#, 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"
"\n"
msgstr ""
"%s [პარამეტრები] [ბრძანება]\n"
" -h, --help ამ დახმარების ჩვენება\n"
" --version ვერსიის ჩვენება\n"
" -d, --daemon დაწყება როგორც დემონი (ნაგულისხმები "
"false)\n"
" -r, --remote დაშორებული დემონის სახელი\n"
#: spa/plugins/alsa/acp/acp.c:321
msgid "Pro Audio"
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
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 "Docking Station-ის შეყვანა"
#: spa/plugins/alsa/acp/alsa-mixer.c:2654
msgid "Docking Station Microphone"
msgstr "Docking Station-ის მიკროფონი"
#: spa/plugins/alsa/acp/alsa-mixer.c:2655
msgid "Docking Station Line In"
msgstr "Docking Station Line In"
#: spa/plugins/alsa/acp/alsa-mixer.c:2656
#: spa/plugins/alsa/acp/alsa-mixer.c:2747
msgid "Line In"
msgstr "Line In"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1454
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 "Bass-ის გაძლიერება"
#: spa/plugins/alsa/acp/alsa-mixer.c:2671
msgid "No Bass Boost"
msgstr "Bass-ის გაძლიერების გარეშე"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1460
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 / DisplayPort"
#: 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:4471
msgid "Analog Mono"
msgstr "ანალოგური მონო"
#: spa/plugins/alsa/acp/alsa-mixer.c:4472
msgid "Analog Mono (Left)"
msgstr "ანალოგური მონო (მარცხენა)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4473
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:4474
#: spa/plugins/alsa/acp/alsa-mixer.c:4482
#: spa/plugins/alsa/acp/alsa-mixer.c:4483
msgid "Analog Stereo"
msgstr "ანალოგური სტერეო"
#: spa/plugins/alsa/acp/alsa-mixer.c:4475
msgid "Mono"
msgstr "მონო"
#: spa/plugins/alsa/acp/alsa-mixer.c:4476
msgid "Stereo"
msgstr "სტერეო"
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "ყურსაცვამები & მიკროფონი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4485
#: spa/plugins/alsa/acp/alsa-mixer.c:4643
msgid "Speakerphone"
msgstr "სამაგიდო დინამიკი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4486
#: spa/plugins/alsa/acp/alsa-mixer.c:4487
msgid "Multichannel"
msgstr "მრავალარხიანი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4488
msgid "Analog Surround 2.1"
msgstr "ანალოგური სივრცითი 2.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4489
msgid "Analog Surround 3.0"
msgstr "ანალოგური სივრცითი 3.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4490
msgid "Analog Surround 3.1"
msgstr "ანალოგური სივრცითი 3.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4491
msgid "Analog Surround 4.0"
msgstr "ანალოგური სივრცითი 4.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4492
msgid "Analog Surround 4.1"
msgstr "ანალოგური სივრცითი 4.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4493
msgid "Analog Surround 5.0"
msgstr "ანალოგური სივრცითი 5.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4494
msgid "Analog Surround 5.1"
msgstr "ანალოგური სივრცითი 5.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4495
msgid "Analog Surround 6.0"
msgstr "ანალოგური სივრცითი 6.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4496
msgid "Analog Surround 6.1"
msgstr "ანალოგური სივრცითი 6.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4497
msgid "Analog Surround 7.0"
msgstr "ანალოგური სივრცითი 7.0"
#: spa/plugins/alsa/acp/alsa-mixer.c:4498
msgid "Analog Surround 7.1"
msgstr "ანალოგური სივრცითი 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4499
msgid "Digital Stereo (IEC958)"
msgstr "ციფრული სტერეო (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4500
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "ციფრული სივრცითი 4.0 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4501
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "ციფრული სივრცითი 5.1 (IEC958/AC3)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4502
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "ციფრული სივრცითი 5.1 (IEC958/DTS)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4503
msgid "Digital Stereo (HDMI)"
msgstr "ციფრული სტერეო (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4504
msgid "Digital Surround 5.1 (HDMI)"
msgstr "ციფრული სივრცითი 5.1 (HDMI)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4505
msgid "Chat"
msgstr "ჩატი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4506
msgid "Game"
msgstr "თამაში"
#: spa/plugins/alsa/acp/alsa-mixer.c:4640
msgid "Analog Mono Duplex"
msgstr "ანალოგური მონო დუპლექსი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4641
msgid "Analog Stereo Duplex"
msgstr "ანალოგური სტერეო დუპლექსი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4644
msgid "Digital Stereo Duplex (IEC958)"
msgstr "ციფრული სტერეო დუპლექსი (IEC958)"
#: spa/plugins/alsa/acp/alsa-mixer.c:4645
msgid "Multichannel Duplex"
msgstr "მრავალარხიანი დუპლექსი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4646
msgid "Stereo Duplex"
msgstr "სტერეო დუპლექსი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4647
msgid "Mono Chat + 7.1 Surround"
msgstr "მონო ჩატი + 7.1 სივრცითი"
#: spa/plugins/alsa/acp/alsa-mixer.c:4754
#, c-format
msgid "%s Output"
msgstr "%s გამოყვანა"
#: spa/plugins/alsa/acp/alsa-mixer.c:4761
#, c-format
msgid "%s Input"
msgstr "%s შეყვანა"
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, 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-ის პროგრამისტებს."
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, 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-ის პროგრამისტებს."
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, 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 უფრო მცირეა, ვიდრე ხელმისაწვდომი დრო %lu.\n"
"ყველაზე ხშირად ეს ALSA-ს დრაივერის (%s) შეცდომის გამო ხდება. დაუკავშირდით "
"ALSA-ის პროგრამისტებს."
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, 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-ის პროგრამისტებს."
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(არასწორი)"
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "ჩაშენებული აუდიო"
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "მოდემი"
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Audio Gateway (A2DP წყარო & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "მაღალი ხარისხის ხმა (A2DP Sink, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "მაღალი ხარისხის დუპლექსი (A2DP წყარო/Sink, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "მაღალი ხარისხის ხმა (A2DP Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "მაღალი ხარისხის დუპლექსი(A2DP წყარო/Sink)"
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "მაღალი ხარისხის დაკვრა (BAP Sink, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "მაღალი ხარისხის შეყვანა (BAP წყარო, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "მაღალი ხარისხის დუპლექსი (BAP წყარო/Sink, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Headset Head Unit (HSP/HFP, კოდეკი %s)"
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Headset Head Unit (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "ხელის გარეშე სამართავი"
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "ხელის გარეშე სამართავი (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "ყურსაცვამი"
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "გადატანადი"
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "მანქანა"
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "ტელეფონი"
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

View File

@ -37,7 +37,7 @@ msgstr ""
msgid "Dummy Output"
msgstr ""
#: src/modules/module-pulse-tunnel.c:648
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr ""
@ -113,7 +113,7 @@ msgid ""
"\n"
msgstr ""
#: src/tools/pw-cli.c:3165
#: src/tools/pw-cli.c:2250
#, c-format
msgid ""
"%s [options] [command]\n"
@ -128,8 +128,8 @@ msgstr ""
msgid "Pro Audio"
msgstr ""
#: spa/plugins/alsa/acp/acp.c:446 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1161
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr ""
@ -156,7 +156,7 @@ msgstr ""
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1330
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr ""
@ -222,7 +222,7 @@ msgid "No Bass Boost"
msgstr ""
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1335
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr ""
@ -337,7 +337,7 @@ msgstr ""
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1320
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr ""
@ -461,8 +461,8 @@ msgstr ""
msgid "%s Input"
msgstr ""
#: spa/plugins/alsa/acp/alsa-util.c:1173
#: spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187
#: spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -477,22 +477,22 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
"%lu ms).\n"
"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"
"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] ""
msgstr[1] ""
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -501,7 +501,7 @@ msgid ""
"to the ALSA developers."
msgstr ""
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -528,61 +528,92 @@ msgstr ""
msgid "Modem"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1172
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1197
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1200
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1208
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1210
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1238
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1243
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1325
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1340
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1345
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1350
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1355
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1360
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1366
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr ""
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr ""

View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2022-05-20 15:26+0000\n"
"PO-Revision-Date: 2022-05-21 12:49+0200\n"
"POT-Creation-Date: 2022-09-15 15:26+0000\n"
"PO-Revision-Date: 2022-09-25 15:20+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <community-poland@mozilla.org>\n"
"Language: pl\n"
@ -41,8 +41,8 @@ msgstr "System multimediów PipeWire"
msgid "Start the PipeWire Media System"
msgstr "Uruchomienie systemu multimediów PipeWire"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:183
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:183
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunel do %s/%s"
@ -51,7 +51,7 @@ msgstr "Tunel do %s/%s"
msgid "Dummy Output"
msgstr "Głuche wyjście"
#: src/modules/module-pulse-tunnel.c:639
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunel dla %s@%s"
@ -70,7 +70,7 @@ msgstr "%s na %s@%s"
msgid "%s on %s"
msgstr "%s na %s"
#: src/tools/pw-cat.c:872
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] [<file>|-]\n"
@ -85,7 +85,7 @@ msgstr ""
" -v, --verbose Wyświetla więcej komunikatów\n"
"\n"
#: src/tools/pw-cat.c:879
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -122,7 +122,7 @@ msgstr ""
" -P --properties Ustawia właściwości węzła\n"
"\n"
#: src/tools/pw-cat.c:897
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -158,7 +158,7 @@ msgstr ""
"(domyślnie %d)\n"
"\n"
#: src/tools/pw-cat.c:914
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
@ -172,7 +172,7 @@ msgstr ""
" -d, --dsd Tryb DSD\n"
"\n"
#: src/tools/pw-cli.c:3139
#: src/tools/pw-cli.c:2255
#, c-format
msgid ""
"%s [options] [command]\n"
@ -195,7 +195,7 @@ msgid "Pro Audio"
msgstr "Dźwięk w zastosowaniach profesjonalnych"
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1161
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Wyłączone"
@ -222,7 +222,7 @@ msgstr "Wejście liniowe"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1330
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Mikrofon"
@ -288,7 +288,7 @@ msgid "No Bass Boost"
msgstr "Brak podbicia basów"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1335
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Głośnik"
@ -403,7 +403,7 @@ msgstr "Stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1320
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Słuchawki z mikrofonem"
@ -527,7 +527,7 @@ msgstr "Wyjście %s"
msgid "%s Input"
msgstr "Wejście %s"
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -552,7 +552,7 @@ msgstr[2] ""
"Prawdopodobnie jest to błąd sterownika ALSA „%s”. Proszę zgłosić ten problem "
"programistom usługi ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
@ -577,7 +577,7 @@ msgstr[2] ""
"Prawdopodobnie jest to błąd sterownika ALSA „%s”. Proszę zgłosić ten problem "
"programistom usługi ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -590,7 +590,7 @@ msgstr ""
"Prawdopodobnie jest to błąd sterownika ALSA „%s”. Proszę zgłosić ten problem "
"programistom usługi ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -615,7 +615,7 @@ msgstr[2] ""
"Prawdopodobnie jest to błąd sterownika ALSA „%s”. Proszę zgłosić ten problem "
"programistom usługi ALSA."
#: spa/plugins/alsa/acp/channelmap.h:464
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(nieprawidłowe)"
@ -627,61 +627,92 @@ msgstr "Wbudowany dźwięk"
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1172
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Bramka dźwięku (źródło A2DP i AG HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1197
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1200
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1208
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Odtwarzanie o wysokiej dokładności (odpływ A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1210
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1238
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "Odtwarzanie o wysokiej dokładności (odpływ BAP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "Wejście o wysokiej dokładności (źródło BAP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "Dupleks o wysokiej dokładności (źródło/odpływ BAP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Jednostka główna słuchawek z mikrofonem (HSP/HFP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1243
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Jednostka główna słuchawek z mikrofonem (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1325
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Zestaw głośnomówiący"
#: spa/plugins/bluez5/bluez5-device.c:1340
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "Zestaw głośnomówiący (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Słuchawki"
#: spa/plugins/bluez5/bluez5-device.c:1345
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Przenośne"
#: spa/plugins/bluez5/bluez5-device.c:1350
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Samochód"
#: spa/plugins/bluez5/bluez5-device.c:1355
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1360
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1366
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

View File

@ -1,18 +1,19 @@
# Brazilian Portuguese translation for pipewire
# Copyright (C) 2021 Rafael Fontenelle <rafaelff@gnome.org>
# Copyright (C) 2022 Rafael Fontenelle <rafaelff@gnome.org>
# This file is distributed under the same license as the pipewire package.
# Fabian Affolter <fab@fedoraproject.org>, 2008.
# Igor Pires Soares <igor@projetofedora.org>, 2009, 2012.
# Rafael Fontenelle <rafaelff@gnome.org>, 2013-2021.
# Matheus Barbosa <mdpb.matheus@gmail.com>, 2022.
#
msgid ""
msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2021-08-01 15:31+0000\n"
"PO-Revision-Date: 2021-08-01 17:02-0300\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
"POT-Creation-Date: 2022-09-30 03:27+0000\n"
"PO-Revision-Date: 2022-01-25 19:49-0300\n"
"Last-Translator: Matheus Barbosa <mdpb.matheus@gmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
@ -21,7 +22,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Gtranslator 40.0\n"
#: src/daemon/pipewire.c:45
#: src/daemon/pipewire.c:46
#, c-format
msgid ""
"%s [options]\n"
@ -43,58 +44,51 @@ msgstr "Sistema de Mídia PipeWire"
msgid "Start the PipeWire Media System"
msgstr "Inicia o Sistema de Mídia PipeWire"
#: src/examples/media-session/alsa-monitor.c:586
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "Áudio interno"
#: src/examples/media-session/alsa-monitor.c:590
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "Modem"
#: src/examples/media-session/alsa-monitor.c:599
#: src/modules/module-zeroconf-discover.c:296
msgid "Unknown device"
msgstr "Dispositivo desconhecido"
#: 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-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Túnel para %s/%s"
#: src/modules/module-pulse-tunnel.c:534
#: src/modules/module-fallback-sink.c:51
msgid "Dummy Output"
msgstr "Saída de falsa"
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Túnel para %s@%s"
#: src/modules/module-zeroconf-discover.c:308
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr "Dispositivo desconhecido"
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s em %s@%s"
#: src/modules/module-zeroconf-discover.c:312
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s em %s"
#: src/tools/pw-cat.c:1000
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] <file>\n"
"%s [options] [<file>|-]\n"
" -h, --help Show this help\n"
" --version Show version\n"
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [opções] <arquivo>\n"
"%s [opções] [<arquivo>|-]\n"
" -h, --help Mostra esta ajuda\n"
" --version Mostra a versão\n"
" -v, --verbose Habilita operações verbosas\n"
"\n"
#: src/tools/pw-cat.c:1007
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -108,7 +102,7 @@ msgid ""
" or direct samples (256)\n"
" the rate is the one of the source "
"file\n"
" --list-targets List available targets for --target\n"
" -P --properties Set node properties\n"
"\n"
msgstr ""
" -R, --remote Nome do daemon remoto\n"
@ -124,11 +118,10 @@ msgstr ""
" Xunit (unidade = s, ms, us, ns)\n"
" ou amostras diretas (256)\n"
" a taxa é um dos arquivos fontes\n"
" --list-targets Lista alvos disponíveis para --"
"target\n"
" --properties Define as propriedades do nó\n"
"\n"
#: src/tools/pw-cat.c:1025
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -165,19 +158,21 @@ msgstr ""
"(padrão: %d)\n"
"\n"
#: src/tools/pw-cat.c:1042
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
" -m, --midi Midi mode\n"
" -d, --dsd DSD mode\n"
"\n"
msgstr ""
" -p, --playback Modo de reprodução\n"
" -r, --record Modo de gravação\n"
" -m, --midi Modo midi\n"
" -m, --midi Modo Midi\n"
" -d, --dsd Modo DSD\n"
"\n"
#: src/tools/pw-cli.c:2954
#: src/tools/pw-cli.c:2255
#, c-format
msgid ""
"%s [options] [command]\n"
@ -194,12 +189,12 @@ msgstr ""
" -r, --remote Nome do daemon remoto\n"
"\n"
#: spa/plugins/alsa/acp/acp.c:306
#: spa/plugins/alsa/acp/acp.c:321
msgid "Pro Audio"
msgstr "Pro Audio"
#: spa/plugins/alsa/acp/acp.c:429 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1043
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Desligado"
@ -226,7 +221,7 @@ msgstr "Entrada de linha"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1198
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Microfone"
@ -298,7 +293,7 @@ msgid "No Bass Boost"
msgstr "Sem reforço de graves"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1203
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Auto-falante"
@ -414,7 +409,7 @@ msgstr "Estéreo"
# Fone de ouvido não se encaixa como tradução aqui, pois há ou pode haver microfone junto.
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1188
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Headset"
@ -528,17 +523,17 @@ msgstr "Duplex estéreo"
msgid "Mono Chat + 7.1 Surround"
msgstr "Bate-papo monofônico + surround 7.1"
#: spa/plugins/alsa/acp/alsa-mixer.c:4750
#: spa/plugins/alsa/acp/alsa-mixer.c:4754
#, c-format
msgid "%s Output"
msgstr "Saída %s"
#: spa/plugins/alsa/acp/alsa-mixer.c:4757
#: spa/plugins/alsa/acp/alsa-mixer.c:4761
#, c-format
msgid "%s Input"
msgstr "Entrada %s"
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -561,7 +556,7 @@ msgstr[1] ""
"É mais provável que isso seja um erro no driver “%s” do ALSA. Por favor, "
"relate esse problema aos desenvolvedores do ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s"
@ -584,7 +579,7 @@ msgstr[1] ""
"É mais provável que isso seja um erro no driver “%s” do ALSA. Por favor, "
"relate esse problema aos desenvolvedores do ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -597,7 +592,7 @@ msgstr ""
"É mais provável que isso seja um erro no driver “%s” do ALSA. Por favor, "
"relate esse problema aos desenvolvedores do ALSA."
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -620,66 +615,106 @@ msgstr[1] ""
"É mais provável que isso seja um erro no driver “%s” do ALSA. Por favor, "
"relate esse problema aos desenvolvedores do ALSA."
#: spa/plugins/alsa/acp/channelmap.h:466
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(inválido)"
#: spa/plugins/bluez5/bluez5-device.c:1053
#: spa/plugins/alsa/acp/compat.c:189
msgid "Built-in Audio"
msgstr "Áudio interno"
#: spa/plugins/alsa/acp/compat.c:194
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Gateway de áudio (fonte A2DP & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1076
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "Reprodução de alta-fidelidade (destino A2DP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1078
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "Duplex de alta-fidelidade (fonte/destino A2DP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1084
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Reprodução de alta-fidelidade (destino A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1086
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "Duplex de alta-fidelidade (fonte/destino A2DP)"
#: spa/plugins/bluez5/bluez5-device.c:1113
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "Reprodução de alta-fidelidade (destino BAP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "Entrada de alta-fidelidade (fonte BAP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "Duplex de alta-fidelidade (fonte/destino BAP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Unidade de headset (HSP/HFP, codec %s)"
#: spa/plugins/bluez5/bluez5-device.c:1117
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Unidade de headset (HSP/HFP)"
# Desconheço tradução comum para esta palavra.
#: spa/plugins/bluez5/bluez5-device.c:1193
# Supostamente relacionado a HFP, hands-free profile, mas não encontrei tradução comum
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Handsfree"
#: spa/plugins/bluez5/bluez5-device.c:1208
# Supostamente relacionado a HFP, hands-free profile, mas não encontrei tradução comum
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "Handsfree (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Fones de ouvido"
#: spa/plugins/bluez5/bluez5-device.c:1213
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Portátil"
#: spa/plugins/bluez5/bluez5-device.c:1218
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Carro"
#: spa/plugins/bluez5/bluez5-device.c:1223
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1228
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefone"
#: spa/plugins/bluez5/bluez5-device.c:1234
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

113
po/sv.po
View File

@ -19,8 +19,8 @@ msgstr ""
"Project-Id-Version: pipewire\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/-/"
"issues\n"
"POT-Creation-Date: 2022-05-20 15:26+0000\n"
"PO-Revision-Date: 2022-05-23 11:01+0200\n"
"POT-Creation-Date: 2022-10-20 15:27+0000\n"
"PO-Revision-Date: 2022-09-16 12:58+0200\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@ -28,7 +28,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 3.0.1\n"
"X-Generator: Poedit 3.1.1\n"
#: src/daemon/pipewire.c:46
#, c-format
@ -51,8 +51,8 @@ msgstr "PipeWire mediasystem"
msgid "Start the PipeWire Media System"
msgstr "Starta mediasystemet PipeWire"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:183
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:183
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "Tunnel till %s/%s"
@ -61,26 +61,26 @@ msgstr "Tunnel till %s/%s"
msgid "Dummy Output"
msgstr "Attrapputgång"
#: src/modules/module-pulse-tunnel.c:639
#: src/modules/module-pulse-tunnel.c:681
#, c-format
msgid "Tunnel for %s@%s"
msgstr "Tunnel för %s@%s"
#: src/modules/module-zeroconf-discover.c:332
#: src/modules/module-zeroconf-discover.c:335
msgid "Unknown device"
msgstr "Okänd enhet"
#: src/modules/module-zeroconf-discover.c:344
#: src/modules/module-zeroconf-discover.c:347
#, c-format
msgid "%s on %s@%s"
msgstr "%s på %s@%s"
#: src/modules/module-zeroconf-discover.c:348
#: src/modules/module-zeroconf-discover.c:351
#, c-format
msgid "%s on %s"
msgstr "%s på %s"
#: src/tools/pw-cat.c:872
#: src/tools/pw-cat.c:782
#, c-format
msgid ""
"%s [options] [<file>|-]\n"
@ -95,7 +95,7 @@ msgstr ""
" -v, --verbose Aktivera utförliga operationer\n"
"\n"
#: src/tools/pw-cat.c:879
#: src/tools/pw-cat.c:789
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -125,7 +125,7 @@ msgstr ""
" -P --properties Sätt nodegenskaper\n"
"\n"
#: src/tools/pw-cat.c:897
#: src/tools/pw-cat.c:807
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -160,7 +160,7 @@ msgstr ""
"%d)\n"
"\n"
#: src/tools/pw-cat.c:914
#: src/tools/pw-cat.c:824
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
@ -174,7 +174,7 @@ msgstr ""
" -d, --dsd DSD-läge\n"
"\n"
#: src/tools/pw-cli.c:3139
#: src/tools/pw-cli.c:2250
#, c-format
msgid ""
"%s [options] [command]\n"
@ -196,7 +196,7 @@ msgid "Pro Audio"
msgstr "Professionellt ljud"
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1161
#: spa/plugins/bluez5/bluez5-device.c:1237
msgid "Off"
msgstr "Av"
@ -223,7 +223,7 @@ msgstr "Linje in"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1330
#: spa/plugins/bluez5/bluez5-device.c:1455
msgid "Microphone"
msgstr "Mikrofon"
@ -289,7 +289,7 @@ msgid "No Bass Boost"
msgstr "Ingen basökning"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1335
#: spa/plugins/bluez5/bluez5-device.c:1461
msgid "Speaker"
msgstr "Högtalare"
@ -404,7 +404,7 @@ msgstr "Stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1320
#: spa/plugins/bluez5/bluez5-device.c:1443
msgid "Headset"
msgstr "Headset"
@ -528,7 +528,7 @@ msgstr "%s-utgång"
msgid "%s Input"
msgstr "%s-ingång"
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -551,16 +551,16 @@ msgstr[1] ""
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
"problemet till ALSA-utvecklarna."
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
"(%s%lu ms).\n"
"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"
"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] ""
@ -574,7 +574,7 @@ msgstr[1] ""
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
"problemet till ALSA-utvecklarna."
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -587,7 +587,7 @@ msgstr ""
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
"problemet till ALSA-utvecklarna."
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -610,7 +610,7 @@ msgstr[1] ""
"Förmodligen är detta ett fel i ALSA-drivrutinen ”%s”. Vänligen rapportera "
"problemet till ALSA-utvecklarna."
#: spa/plugins/alsa/acp/channelmap.h:464
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(ogiltig)"
@ -622,61 +622,92 @@ msgstr "Inbyggt ljud"
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1172
#: spa/plugins/bluez5/bluez5-device.c:1248
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Audio gateway (A2DP-källa & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1197
#: spa/plugins/bluez5/bluez5-device.c:1273
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "High fidelity-uppspelning (A2DP-utgång, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1200
#: spa/plugins/bluez5/bluez5-device.c:1276
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "High fidelity duplex (A2DP-källa/utgång, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1208
#: spa/plugins/bluez5/bluez5-device.c:1284
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "High fidelity-uppspelning (A2DP-utgång)"
#: spa/plugins/bluez5/bluez5-device.c:1210
#: spa/plugins/bluez5/bluez5-device.c:1286
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "High fidelity duplex (A2DP-källa/utgång)"
#: spa/plugins/bluez5/bluez5-device.c:1238
#: spa/plugins/bluez5/bluez5-device.c:1323
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "High fidelity-uppspelning (BAP-utgång, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1327
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "High fidelity-ingång (BAP-källa, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1331
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "High fidelity duplex (BAP-källa/utgång, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1360
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Headset-huvudenhet (HSP/HFP, kodek %s)"
#: spa/plugins/bluez5/bluez5-device.c:1243
#: spa/plugins/bluez5/bluez5-device.c:1365
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Headset-huvudenhet (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1325
#: spa/plugins/bluez5/bluez5-device.c:1444
#: spa/plugins/bluez5/bluez5-device.c:1449
#: spa/plugins/bluez5/bluez5-device.c:1456
#: spa/plugins/bluez5/bluez5-device.c:1462
#: spa/plugins/bluez5/bluez5-device.c:1468
#: spa/plugins/bluez5/bluez5-device.c:1474
#: spa/plugins/bluez5/bluez5-device.c:1480
#: spa/plugins/bluez5/bluez5-device.c:1486
#: spa/plugins/bluez5/bluez5-device.c:1492
msgid "Handsfree"
msgstr "Handsfree"
#: spa/plugins/bluez5/bluez5-device.c:1340
#: spa/plugins/bluez5/bluez5-device.c:1450
msgid "Handsfree (HFP)"
msgstr "Handsfree (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1467
msgid "Headphone"
msgstr "Hörlurar"
#: spa/plugins/bluez5/bluez5-device.c:1345
#: spa/plugins/bluez5/bluez5-device.c:1473
msgid "Portable"
msgstr "Bärbar"
#: spa/plugins/bluez5/bluez5-device.c:1350
#: spa/plugins/bluez5/bluez5-device.c:1479
msgid "Car"
msgstr "Bil"
#: spa/plugins/bluez5/bluez5-device.c:1355
#: spa/plugins/bluez5/bluez5-device.c:1485
msgid "HiFi"
msgstr "HiFi"
#: spa/plugins/bluez5/bluez5-device.c:1360
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1366
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1499
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"

112
po/tr.po
View File

@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: PipeWire master\n"
"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/pipewire/pipewire/"
"issues/new\n"
"POT-Creation-Date: 2022-04-03 12:56+0200\n"
"PO-Revision-Date: 2022-05-14 18:35+0300\n"
"POT-Creation-Date: 2022-06-30 12:50+0200\n"
"PO-Revision-Date: 2022-10-23 10:40+0300\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"Language-Team: Turkish <tr>\n"
"Language: tr\n"
@ -35,8 +35,8 @@ msgstr ""
" --version Sürümü göster\n"
" -c, --config Yapılandırmayı yükle (Öntanımlı %s)\n"
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:190
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:190
#: src/modules/module-protocol-pulse/modules/module-tunnel-sink.c:180
#: src/modules/module-protocol-pulse/modules/module-tunnel-source.c:180
#, c-format
msgid "Tunnel to %s/%s"
msgstr "%s/%s tüneli"
@ -45,41 +45,41 @@ msgstr "%s/%s tüneli"
msgid "Dummy Output"
msgstr "Temsili Çıkış"
#: src/modules/module-pulse-tunnel.c:545
#: src/modules/module-pulse-tunnel.c:662
#, c-format
msgid "Tunnel for %s@%s"
msgstr "%s@%s için tünel"
#: src/modules/module-zeroconf-discover.c:313
#: src/modules/module-zeroconf-discover.c:332
msgid "Unknown device"
msgstr "Bilinmeyen aygıt"
#: src/modules/module-zeroconf-discover.c:325
#: src/modules/module-zeroconf-discover.c:344
#, c-format
msgid "%s on %s@%s"
msgstr "%s, %s@%s"
#: src/modules/module-zeroconf-discover.c:329
#: src/modules/module-zeroconf-discover.c:348
#, c-format
msgid "%s on %s"
msgstr "%s, %s"
#: src/tools/pw-cat.c:1087
#: src/tools/pw-cat.c:784
#, c-format
msgid ""
"%s [options] <file>\n"
"%s [options] [<file>|-]\n"
" -h, --help Show this help\n"
" --version Show version\n"
" -v, --verbose Enable verbose operations\n"
"\n"
msgstr ""
"%s [seçenekler] <dosya>\n"
"%s [seçenekler] [<dosya>|-]\n"
" -h, --help Bu yardımı göster\n"
" --version Sürümü göster\n"
" -v, --verbose Ayrıntılı işlemleri etkinleştir\n"
"\n"
#: src/tools/pw-cat.c:1094
#: src/tools/pw-cat.c:791
#, c-format
msgid ""
" -R, --remote Remote daemon name\n"
@ -93,7 +93,7 @@ msgid ""
" or direct samples (256)\n"
" the rate is the one of the source "
"file\n"
" --list-targets List available targets for --target\n"
" -P --properties Set node properties\n"
"\n"
msgstr ""
" -R, --remote Uzak arka plan programı adı\n"
@ -109,11 +109,10 @@ msgstr ""
" Xbirim (birim = s, ms, us, ns)\n"
" veya doğrudan örneklemeler (256)\n"
" oran kaynak dosyadan biridir\n"
" --list-targets --target için kullanılabilir "
"hedefleri listele\n"
" -P --properties Düğüm özelliklerini ayarla\n"
"\n"
#: src/tools/pw-cat.c:1112
#: src/tools/pw-cat.c:809
#, c-format
msgid ""
" --rate Sample rate (req. for rec) (default "
@ -149,7 +148,7 @@ msgstr ""
"15) (öntanımlı %d)\n"
"\n"
#: src/tools/pw-cat.c:1129
#: src/tools/pw-cat.c:826
msgid ""
" -p, --playback Playback mode\n"
" -r, --record Recording mode\n"
@ -163,7 +162,7 @@ msgstr ""
" -d, --dsd DSD modu\n"
"\n"
#: src/tools/pw-cli.c:3051
#: src/tools/pw-cli.c:2250
#, c-format
msgid ""
"%s [options] [command]\n"
@ -186,7 +185,7 @@ msgid "Pro Audio"
msgstr "Profesyonel Ses"
#: spa/plugins/alsa/acp/acp.c:444 spa/plugins/alsa/acp/alsa-mixer.c:4648
#: spa/plugins/bluez5/bluez5-device.c:1159
#: spa/plugins/bluez5/bluez5-device.c:1236
msgid "Off"
msgstr "Kapalı"
@ -213,7 +212,7 @@ msgstr "Hat Girişi"
#: spa/plugins/alsa/acp/alsa-mixer.c:2657
#: spa/plugins/alsa/acp/alsa-mixer.c:2741
#: spa/plugins/bluez5/bluez5-device.c:1328
#: spa/plugins/bluez5/bluez5-device.c:1454
msgid "Microphone"
msgstr "Mikrofon"
@ -279,7 +278,7 @@ msgid "No Bass Boost"
msgstr "Bas Artırma Yok"
#: spa/plugins/alsa/acp/alsa-mixer.c:2672
#: spa/plugins/bluez5/bluez5-device.c:1333
#: spa/plugins/bluez5/bluez5-device.c:1460
msgid "Speaker"
msgstr "Hoparlör"
@ -394,7 +393,7 @@ msgstr "Stereo"
#: spa/plugins/alsa/acp/alsa-mixer.c:4484
#: spa/plugins/alsa/acp/alsa-mixer.c:4642
#: spa/plugins/bluez5/bluez5-device.c:1318
#: spa/plugins/bluez5/bluez5-device.c:1442
msgid "Headset"
msgstr "Kulaklık"
@ -518,7 +517,7 @@ msgstr "%s Çıkışı"
msgid "%s Input"
msgstr "%s Girişi"
#: spa/plugins/alsa/acp/alsa-util.c:1173 spa/plugins/alsa/acp/alsa-util.c:1267
#: spa/plugins/alsa/acp/alsa-util.c:1187 spa/plugins/alsa/acp/alsa-util.c:1281
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu "
@ -535,7 +534,7 @@ msgstr[0] ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
#: spa/plugins/alsa/acp/alsa-util.c:1239
#: spa/plugins/alsa/acp/alsa-util.c:1253
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li byte "
@ -552,7 +551,7 @@ msgstr[0] ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
#: spa/plugins/alsa/acp/alsa-util.c:1286
#: spa/plugins/alsa/acp/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@ -565,7 +564,7 @@ msgstr ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
#: spa/plugins/alsa/acp/alsa-util.c:1329
#: spa/plugins/alsa/acp/alsa-util.c:1343
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte "
@ -583,7 +582,7 @@ msgstr[0] ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
#: spa/plugins/alsa/acp/channelmap.h:464
#: spa/plugins/alsa/acp/channelmap.h:457
msgid "(invalid)"
msgstr "(geçersiz)"
@ -595,65 +594,96 @@ msgstr "Dahili Ses"
msgid "Modem"
msgstr "Modem"
#: spa/plugins/bluez5/bluez5-device.c:1170
#: spa/plugins/bluez5/bluez5-device.c:1247
msgid "Audio Gateway (A2DP Source & HSP/HFP AG)"
msgstr "Ses Geçidi (A2DP Kaynak & HSP/HFP AG)"
#: spa/plugins/bluez5/bluez5-device.c:1195
#: spa/plugins/bluez5/bluez5-device.c:1272
#, c-format
msgid "High Fidelity Playback (A2DP Sink, codec %s)"
msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1198
#: spa/plugins/bluez5/bluez5-device.c:1275
#, c-format
msgid "High Fidelity Duplex (A2DP Source/Sink, codec %s)"
msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1206
#: spa/plugins/bluez5/bluez5-device.c:1283
msgid "High Fidelity Playback (A2DP Sink)"
msgstr "Yüksek Kaliteli Çalma (A2DP Alıcı)"
#: spa/plugins/bluez5/bluez5-device.c:1208
#: spa/plugins/bluez5/bluez5-device.c:1285
msgid "High Fidelity Duplex (A2DP Source/Sink)"
msgstr "Yüksek Kaliteli İkili (A2DP Kaynak/Alıcı)"
#: spa/plugins/bluez5/bluez5-device.c:1236
#: spa/plugins/bluez5/bluez5-device.c:1322
#, c-format
msgid "High Fidelity Playback (BAP Sink, codec %s)"
msgstr "Yüksek Kaliteli Çalma (BAP Alıcı, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1326
#, c-format
msgid "High Fidelity Input (BAP Source, codec %s)"
msgstr "Yüksek Kaliteli Giriş (BAP Kaynak, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1330
#, c-format
msgid "High Fidelity Duplex (BAP Source/Sink, codec %s)"
msgstr "Yüksek Kaliteli İkili (BAP Kaynak/Alıcı, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1359
#, c-format
msgid "Headset Head Unit (HSP/HFP, codec %s)"
msgstr "Kulaklık Ana Birimi (HSP/HFP, çözücü %s)"
#: spa/plugins/bluez5/bluez5-device.c:1241
#: spa/plugins/bluez5/bluez5-device.c:1364
msgid "Headset Head Unit (HSP/HFP)"
msgstr "Kulaklık Ana Birimi (HSP/HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1323
#: spa/plugins/bluez5/bluez5-device.c:1443
#: spa/plugins/bluez5/bluez5-device.c:1448
#: spa/plugins/bluez5/bluez5-device.c:1455
#: spa/plugins/bluez5/bluez5-device.c:1461
#: spa/plugins/bluez5/bluez5-device.c:1467
#: spa/plugins/bluez5/bluez5-device.c:1473
#: spa/plugins/bluez5/bluez5-device.c:1479
#: spa/plugins/bluez5/bluez5-device.c:1485
#: spa/plugins/bluez5/bluez5-device.c:1491
msgid "Handsfree"
msgstr "Ahizesiz"
#: spa/plugins/bluez5/bluez5-device.c:1338
#: spa/plugins/bluez5/bluez5-device.c:1449
msgid "Handsfree (HFP)"
msgstr "Ahizesiz (HFP)"
#: spa/plugins/bluez5/bluez5-device.c:1466
msgid "Headphone"
msgstr "Kulaklık"
#: spa/plugins/bluez5/bluez5-device.c:1343
#: spa/plugins/bluez5/bluez5-device.c:1472
msgid "Portable"
msgstr "Taşınabilir"
#: spa/plugins/bluez5/bluez5-device.c:1348
#: spa/plugins/bluez5/bluez5-device.c:1478
msgid "Car"
msgstr "Araba"
#: spa/plugins/bluez5/bluez5-device.c:1353
#: spa/plugins/bluez5/bluez5-device.c:1484
msgid "HiFi"
msgstr "Yüksek Kalite"
#: spa/plugins/bluez5/bluez5-device.c:1358
#: spa/plugins/bluez5/bluez5-device.c:1490
msgid "Phone"
msgstr "Telefon"
#: spa/plugins/bluez5/bluez5-device.c:1364
#: spa/plugins/bluez5/bluez5-device.c:1497
msgid "Bluetooth"
msgstr "Bluetooth"
#: spa/plugins/bluez5/bluez5-device.c:1498
msgid "Bluetooth (HFP)"
msgstr "Bluetooth (HFP)"
#~ msgid "PipeWire Media System"
#~ msgstr "PipeWire Ortam Sistemi"

View File

@ -41,7 +41,7 @@ export SPA_PLUGIN_DIR="${BUILDDIR}/spa/plugins"
export SPA_DATA_DIR="${SCRIPT_DIR}/spa/plugins"
# the directory with pipewire modules
export PIPEWIRE_MODULE_DIR="${BUILDDIR}/src/modules"
export PATH="${BUILDDIR}/src/daemon:${BUILDDIR}/src/tools:${BUILDDIR}/src/media-session:${BUILDDIR}/src/examples:${PATH}"
export PATH="${BUILDDIR}/src/daemon:${BUILDDIR}/src/tools:${BUILDDIR}/src/media-session:${BUILDDIR}/src/examples:${BUILDDIR}/pipewire-v4l2/src:${PATH}"
export LD_LIBRARY_PATH="${BUILDDIR}/src/pipewire/:${BUILDDIR}/pipewire-jack/src/${LD_LIBRARY_PATH+":$LD_LIBRARY_PATH"}"
export GST_PLUGIN_PATH="${BUILDDIR}/src/gst/${GST_PLUGIN_PATH+":${GST_PLUGIN_PATH}"}"
# the directory with card profiles and paths
@ -50,6 +50,7 @@ export ACP_PROFILES_DIR="${SCRIPT_DIR}/spa/plugins/alsa/mixer/profile-sets"
# ALSA plugin directory
export ALSA_PLUGIN_DIR="${BUILDDIR}/pipewire-alsa/alsa-plugins"
export PW_BUILDDIR=$BUILDDIR
export PW_UNINSTALLED=1
export PKG_CONFIG_PATH="${BUILDDIR}/meson-uninstalled/:${PKG_CONFIG_PATH}"

View File

@ -161,8 +161,9 @@ static inline int spa_buffer_alloc_fill_info(struct spa_buffer_alloc_info *info,
*target += info->chunk_size;
for (i = 0, size = 0; i < n_datas; i++) {
int64_t align = data_aligns[i];
info->max_align = SPA_MAX(info->max_align, data_aligns[i]);
size = SPA_ROUND_UP_N(size, data_aligns[i]);
size = SPA_ROUND_UP_N(size, align);
size += datas[i].maxsize;
}
info->data_size = size;

View File

@ -39,16 +39,17 @@ extern "C" {
enum spa_meta_type {
SPA_META_Invalid,
SPA_META_Header, /**< struct spa_meta_header */
SPA_META_VideoCrop, /**< struct spa_meta_region with cropping data */
SPA_META_VideoDamage, /**< array of struct spa_meta_region with damage, where an invalid entry or end-of-array marks the end. */
SPA_META_Bitmap, /**< struct spa_meta_bitmap */
SPA_META_Cursor, /**< struct spa_meta_cursor */
SPA_META_Control, /**< metadata contains a spa_meta_control
* associated with the data */
SPA_META_Busy, /**< don't write to buffer when count > 0 */
SPA_META_Header, /**< struct spa_meta_header */
SPA_META_VideoCrop, /**< struct spa_meta_region with cropping data */
SPA_META_VideoDamage, /**< array of struct spa_meta_region with damage, where an invalid entry or end-of-array marks the end. */
SPA_META_Bitmap, /**< struct spa_meta_bitmap */
SPA_META_Cursor, /**< struct spa_meta_cursor */
SPA_META_Control, /**< metadata contains a spa_meta_control
* associated with the data */
SPA_META_Busy, /**< don't write to buffer when count > 0 */
SPA_META_VideoTransform, /**< struct spa_meta_transform */
_SPA_META_LAST, /**< not part of ABI/API */
_SPA_META_LAST, /**< not part of ABI/API */
};
/**
@ -64,9 +65,15 @@ struct spa_meta {
void *data; /**< pointer to metadata */
};
#define spa_meta_first(m) ((m)->data)
#define spa_meta_end(m) SPA_PTROFF((m)->data,(m)->size,void)
#define spa_meta_check(p,m) (SPA_PTROFF(p,sizeof(*p),void) <= spa_meta_end(m))
static inline void *spa_meta_first(const struct spa_meta *m) {
return m->data;
}
#define spa_meta_first spa_meta_first
static inline void *spa_meta_end(const struct spa_meta *m) {
return SPA_PTROFF(m->data,m->size,void);
}
#define spa_meta_end spa_meta_end
#define spa_meta_check(p,m) (SPA_PTROFF(p,sizeof(*(p)),void) <= spa_meta_end(m))
/**
* Describes essential buffer header metadata such as flags and
@ -92,11 +99,14 @@ struct spa_meta_region {
struct spa_region region;
};
#define spa_meta_region_is_valid(m) ((m)->region.size.width != 0 && (m)->region.size.height != 0)
static inline bool spa_meta_region_is_valid(const struct spa_meta_region *m) {
return m->region.size.width != 0 && m->region.size.height != 0;
}
#define spa_meta_region_is_valid spa_meta_region_is_valid
/** iterate all the items in a metadata */
#define spa_meta_for_each(pos,meta) \
for (pos = (__typeof(pos))spa_meta_first(meta); \
for ((pos) = (__typeof(pos))spa_meta_first(meta); \
spa_meta_check(pos, meta); \
(pos)++)
@ -152,6 +162,25 @@ struct spa_meta_busy {
uint32_t count; /**< number of users busy with the buffer */
};
enum spa_meta_videotransform_value {
SPA_META_TRANSFORMATION_None = 0, /**< no transform */
SPA_META_TRANSFORMATION_90, /**< 90 degree counter-clockwise */
SPA_META_TRANSFORMATION_180, /**< 180 degree counter-clockwise */
SPA_META_TRANSFORMATION_270, /**< 270 degree counter-clockwise */
SPA_META_TRANSFORMATION_Flipped, /**< 180 degree flipped around the vertical axis. Equivalent
* to a reflexion through the vertical line splitting the
* bufffer in two equal sized parts */
SPA_META_TRANSFORMATION_Flipped90, /**< flip then rotate around 90 degree counter-clockwise */
SPA_META_TRANSFORMATION_Flipped180, /**< flip then rotate around 180 degree counter-clockwise */
SPA_META_TRANSFORMATION_Flipped270, /**< flip then rotate around 270 degree counter-clockwise */
};
/** a transformation of the buffer */
struct spa_meta_videotransform {
uint32_t transform; /**< orientation transformation that was applied to the buffer,
* one of enum spa_meta_videotransform_value */
};
/**
* \}
*/

View File

@ -79,6 +79,7 @@ static const struct spa_type_info spa_type_meta_type[] = {
{ SPA_META_Cursor, SPA_TYPE_Pointer, SPA_TYPE_INFO_META_BASE "Cursor", NULL },
{ SPA_META_Control, SPA_TYPE_Pointer, SPA_TYPE_INFO_META_BASE "Control", NULL },
{ SPA_META_Busy, SPA_TYPE_Pointer, SPA_TYPE_INFO_META_BASE "Busy", NULL },
{ SPA_META_VideoTransform, SPA_TYPE_Pointer, SPA_TYPE_INFO_META_BASE "VideoTransform", NULL },
{ 0, 0, NULL, NULL },
};

View File

@ -38,56 +38,56 @@ extern "C" {
* \{
*/
#include <spa/debug/log.h>
#include <spa/debug/context.h>
#include <spa/debug/mem.h>
#include <spa/debug/types.h>
#include <spa/buffer/type-info.h>
static inline int spa_debug_buffer(int indent, const struct spa_buffer *buffer)
static inline int spa_debugc_buffer(struct spa_debug_context *ctx, int indent, const struct spa_buffer *buffer)
{
uint32_t i;
spa_debug("%*s" "struct spa_buffer %p:", indent, "", buffer);
spa_debug("%*s" " n_metas: %u (at %p)", indent, "", buffer->n_metas, buffer->metas);
spa_debugc(ctx, "%*s" "struct spa_buffer %p:", indent, "", buffer);
spa_debugc(ctx, "%*s" " n_metas: %u (at %p)", indent, "", buffer->n_metas, buffer->metas);
for (i = 0; i < buffer->n_metas; i++) {
struct spa_meta *m = &buffer->metas[i];
const char *type_name;
type_name = spa_debug_type_find_name(spa_type_meta_type, m->type);
spa_debug("%*s" " meta %d: type %d (%s), data %p, size %d:", indent, "", i, m->type,
spa_debugc(ctx, "%*s" " meta %d: type %d (%s), data %p, size %d:", indent, "", i, m->type,
type_name, m->data, m->size);
switch (m->type) {
case SPA_META_Header:
{
struct spa_meta_header *h = (struct spa_meta_header*)m->data;
spa_debug("%*s" " struct spa_meta_header:", indent, "");
spa_debug("%*s" " flags: %08x", indent, "", h->flags);
spa_debug("%*s" " offset: %u", indent, "", h->offset);
spa_debug("%*s" " seq: %" PRIu64, indent, "", h->seq);
spa_debug("%*s" " pts: %" PRIi64, indent, "", h->pts);
spa_debug("%*s" " dts_offset: %" PRIi64, indent, "", h->dts_offset);
spa_debugc(ctx, "%*s" " struct spa_meta_header:", indent, "");
spa_debugc(ctx, "%*s" " flags: %08x", indent, "", h->flags);
spa_debugc(ctx, "%*s" " offset: %u", indent, "", h->offset);
spa_debugc(ctx, "%*s" " seq: %" PRIu64, indent, "", h->seq);
spa_debugc(ctx, "%*s" " pts: %" PRIi64, indent, "", h->pts);
spa_debugc(ctx, "%*s" " dts_offset: %" PRIi64, indent, "", h->dts_offset);
break;
}
case SPA_META_VideoCrop:
{
struct spa_meta_region *h = (struct spa_meta_region*)m->data;
spa_debug("%*s" " struct spa_meta_region:", indent, "");
spa_debug("%*s" " x: %d", indent, "", h->region.position.x);
spa_debug("%*s" " y: %d", indent, "", h->region.position.y);
spa_debug("%*s" " width: %d", indent, "", h->region.size.width);
spa_debug("%*s" " height: %d", indent, "", h->region.size.height);
spa_debugc(ctx, "%*s" " struct spa_meta_region:", indent, "");
spa_debugc(ctx, "%*s" " x: %d", indent, "", h->region.position.x);
spa_debugc(ctx, "%*s" " y: %d", indent, "", h->region.position.y);
spa_debugc(ctx, "%*s" " width: %d", indent, "", h->region.size.width);
spa_debugc(ctx, "%*s" " height: %d", indent, "", h->region.size.height);
break;
}
case SPA_META_VideoDamage:
{
struct spa_meta_region *h;
spa_meta_for_each(h, m) {
spa_debug("%*s" " struct spa_meta_region:", indent, "");
spa_debug("%*s" " x: %d", indent, "", h->region.position.x);
spa_debug("%*s" " y: %d", indent, "", h->region.position.y);
spa_debug("%*s" " width: %d", indent, "", h->region.size.width);
spa_debug("%*s" " height: %d", indent, "", h->region.size.height);
spa_debugc(ctx, "%*s" " struct spa_meta_region:", indent, "");
spa_debugc(ctx, "%*s" " x: %d", indent, "", h->region.position.x);
spa_debugc(ctx, "%*s" " y: %d", indent, "", h->region.position.y);
spa_debugc(ctx, "%*s" " width: %d", indent, "", h->region.size.width);
spa_debugc(ctx, "%*s" " height: %d", indent, "", h->region.size.height);
}
break;
}
@ -96,28 +96,32 @@ static inline int spa_debug_buffer(int indent, const struct spa_buffer *buffer)
case SPA_META_Cursor:
break;
default:
spa_debug("%*s" " Unknown:", indent, "");
spa_debug_mem(5, m->data, m->size);
spa_debugc(ctx, "%*s" " Unknown:", indent, "");
spa_debugc_mem(ctx, 5, m->data, m->size);
}
}
spa_debug("%*s" " n_datas: \t%u (at %p)", indent, "", buffer->n_datas, buffer->datas);
spa_debugc(ctx, "%*s" " n_datas: \t%u (at %p)", indent, "", buffer->n_datas, buffer->datas);
for (i = 0; i < buffer->n_datas; i++) {
struct spa_data *d = &buffer->datas[i];
spa_debug("%*s" " type: %d (%s)", indent, "", d->type,
spa_debugc(ctx, "%*s" " type: %d (%s)", indent, "", d->type,
spa_debug_type_find_name(spa_type_data_type, d->type));
spa_debug("%*s" " flags: %d", indent, "", d->flags);
spa_debug("%*s" " data: %p", indent, "", d->data);
spa_debug("%*s" " fd: %" PRIi64, indent, "", d->fd);
spa_debug("%*s" " offset: %d", indent, "", d->mapoffset);
spa_debug("%*s" " maxsize: %u", indent, "", d->maxsize);
spa_debug("%*s" " chunk: %p", indent, "", d->chunk);
spa_debug("%*s" " offset: %d", indent, "", d->chunk->offset);
spa_debug("%*s" " size: %u", indent, "", d->chunk->size);
spa_debug("%*s" " stride: %d", indent, "", d->chunk->stride);
spa_debugc(ctx, "%*s" " flags: %d", indent, "", d->flags);
spa_debugc(ctx, "%*s" " data: %p", indent, "", d->data);
spa_debugc(ctx, "%*s" " fd: %" PRIi64, indent, "", d->fd);
spa_debugc(ctx, "%*s" " offset: %d", indent, "", d->mapoffset);
spa_debugc(ctx, "%*s" " maxsize: %u", indent, "", d->maxsize);
spa_debugc(ctx, "%*s" " chunk: %p", indent, "", d->chunk);
spa_debugc(ctx, "%*s" " offset: %d", indent, "", d->chunk->offset);
spa_debugc(ctx, "%*s" " size: %u", indent, "", d->chunk->size);
spa_debugc(ctx, "%*s" " stride: %d", indent, "", d->chunk->stride);
}
return 0;
}
static inline int spa_debug_buffer(int indent, const struct spa_buffer *buffer)
{
return spa_debugc_buffer(NULL, indent, buffer);
}
/**
* \}
*/

View File

@ -0,0 +1,62 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_DEBUG_CONTEXT_H
#define SPA_DEBUG_CONTEXT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdarg.h>
#include <spa/utils/defs.h>
/**
* \addtogroup spa_debug
* \{
*/
#ifndef spa_debugn
#define spa_debugn(_fmt,...) printf((_fmt), ## __VA_ARGS__)
#endif
#ifndef spa_debug
#define spa_debug(_fmt,...) spa_debugn(_fmt"\n", ## __VA_ARGS__)
#endif
struct spa_debug_context {
void (*log) (struct spa_debug_context *ctx, const char *fmt, ...) SPA_PRINTF_FUNC(2, 3);
};
#define spa_debugc(_c,_fmt,...) (_c)?((_c)->log((_c),_fmt, ## __VA_ARGS__)):(void)spa_debug(_fmt, ## __VA_ARGS__)
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_DEBUG_CONTEXT_H */

View File

@ -34,19 +34,23 @@ extern "C" {
* \{
*/
#include <spa/debug/log.h>
#include <spa/debug/context.h>
#include <spa/utils/dict.h>
static inline int spa_debug_dict(int indent, const struct spa_dict *dict)
static inline int spa_debugc_dict(struct spa_debug_context *ctx, int indent, const struct spa_dict *dict)
{
const struct spa_dict_item *item;
spa_debug("%*sflags:%08x n_items:%d", indent, "", dict->flags, dict->n_items);
spa_debugc(ctx, "%*sflags:%08x n_items:%d", indent, "", dict->flags, dict->n_items);
spa_dict_for_each(item, dict) {
spa_debug("%*s %s = \"%s\"", indent, "", item->key, item->value);
spa_debugc(ctx, "%*s %s = \"%s\"", indent, "", item->key, item->value);
}
return 0;
}
static inline int spa_debug_dict(int indent, const struct spa_dict *dict)
{
return spa_debugc_dict(NULL, indent, dict);
}
/**
* \}
*/

View File

@ -35,18 +35,20 @@ extern "C" {
*/
#include <spa/pod/parser.h>
#include <spa/debug/log.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>
static inline int
spa_debug_format_value(const struct spa_type_info *info,
spa_debug_strbuf_format_value(struct spa_strbuf *buffer, const struct spa_type_info *info,
uint32_t type, void *body, uint32_t size)
{
switch (type) {
case SPA_TYPE_Bool:
spa_debugn("%s", *(int32_t *) body ? "true" : "false");
spa_strbuf_append(buffer, "%s", *(int32_t *) body ? "true" : "false");
break;
case SPA_TYPE_Id:
{
@ -56,41 +58,41 @@ spa_debug_format_value(const struct spa_type_info *info,
snprintf(tmp, sizeof(tmp), "%d", *(int32_t*)body);
str = tmp;
}
spa_debugn("%s", str);
spa_strbuf_append(buffer, "%s", str);
break;
}
case SPA_TYPE_Int:
spa_debugn("%d", *(int32_t *) body);
spa_strbuf_append(buffer, "%d", *(int32_t *) body);
break;
case SPA_TYPE_Long:
spa_debugn("%" PRIi64, *(int64_t *) body);
spa_strbuf_append(buffer, "%" PRIi64, *(int64_t *) body);
break;
case SPA_TYPE_Float:
spa_debugn("%f", *(float *) body);
spa_strbuf_append(buffer, "%f", *(float *) body);
break;
case SPA_TYPE_Double:
spa_debugn("%f", *(double *) body);
spa_strbuf_append(buffer, "%f", *(double *) body);
break;
case SPA_TYPE_String:
spa_debugn("%s", (char *) body);
spa_strbuf_append(buffer, "%s", (char *) body);
break;
case SPA_TYPE_Rectangle:
{
struct spa_rectangle *r = (struct spa_rectangle *)body;
spa_debugn("%" PRIu32 "x%" PRIu32, r->width, r->height);
spa_strbuf_append(buffer, "%" PRIu32 "x%" PRIu32, r->width, r->height);
break;
}
case SPA_TYPE_Fraction:
{
struct spa_fraction *f = (struct spa_fraction *)body;
spa_debugn("%" PRIu32 "/%" PRIu32, f->num, f->denom);
spa_strbuf_append(buffer, "%" PRIu32 "/%" PRIu32, f->num, f->denom);
break;
}
case SPA_TYPE_Bitmap:
spa_debugn("Bitmap");
spa_strbuf_append(buffer, "Bitmap");
break;
case SPA_TYPE_Bytes:
spa_debugn("Bytes");
spa_strbuf_append(buffer, "Bytes");
break;
case SPA_TYPE_Array:
{
@ -98,23 +100,35 @@ spa_debug_format_value(const struct spa_type_info *info,
struct spa_pod_array_body *b = (struct spa_pod_array_body *)body;
int i = 0;
info = info && info->values ? info->values : info;
spa_debugn("< ");
spa_strbuf_append(buffer, "< ");
SPA_POD_ARRAY_BODY_FOREACH(b, size, p) {
if (i++ > 0)
spa_debugn(", ");
spa_debug_format_value(info, b->child.type, p, b->child.size);
spa_strbuf_append(buffer, ", ");
spa_debug_strbuf_format_value(buffer, info, b->child.type, p, b->child.size);
}
spa_debugn(" >");
spa_strbuf_append(buffer, " >");
break;
}
default:
spa_debugn("INVALID type %d", type);
spa_strbuf_append(buffer, "INVALID type %d", type);
break;
}
return 0;
}
static inline int spa_debug_format(int indent,
static inline int
spa_debug_format_value(const struct spa_type_info *info,
uint32_t type, void *body, uint32_t size)
{
char buffer[1024];
struct spa_strbuf buf;
spa_strbuf_init(&buf, buffer, sizeof(buffer));
spa_debug_strbuf_format_value(&buf, info, type, body, size);
spa_debugn("%s", buffer);
return 0;
}
static inline int spa_debugc_format(struct spa_debug_context *ctx, int indent,
const struct spa_type_info *info, const struct spa_pod *format)
{
const char *media_type;
@ -134,7 +148,7 @@ static inline int spa_debug_format(int indent,
media_type = spa_debug_type_find_name(spa_type_media_type, mtype);
media_subtype = spa_debug_type_find_name(spa_type_media_subtype, mstype);
spa_debug("%*s %s/%s", indent, "",
spa_debugc(ctx, "%*s %s/%s", indent, "",
media_type ? spa_debug_type_short_name(media_type) : "unknown",
media_subtype ? spa_debug_type_short_name(media_subtype) : "unknown");
@ -144,6 +158,8 @@ static inline int spa_debug_format(int indent,
uint32_t i, type, size, n_vals, choice;
const struct spa_pod *val;
void *vals;
char buffer[1024];
struct spa_strbuf buf;
if (prop->key == SPA_FORMAT_mediaType ||
prop->key == SPA_FORMAT_mediaSubtype)
@ -161,12 +177,13 @@ static inline int spa_debug_format(int indent,
ti = spa_debug_type_find(info, prop->key);
key = ti ? ti->name : NULL;
spa_debugn("%*s %16s : (%s) ", indent, "",
spa_strbuf_init(&buf, buffer, sizeof(buffer));
spa_strbuf_append(&buf, "%*s %16s : (%s) ", indent, "",
key ? spa_debug_type_short_name(key) : "unknown",
spa_debug_type_short_name(spa_types[type].name));
if (choice == SPA_CHOICE_None) {
spa_debug_format_value(ti ? ti->values : NULL, type, vals, size);
spa_debug_strbuf_format_value(&buf, ti ? ti->values : NULL, type, vals, size);
} else {
const char *ssep, *esep, *sep;
@ -186,21 +203,26 @@ static inline int spa_debug_format(int indent,
break;
}
spa_debugn("%s", ssep);
spa_strbuf_append(&buf, "%s", ssep);
for (i = 1; i < n_vals; i++) {
vals = SPA_PTROFF(vals, size, void);
if (i > 1)
spa_debugn("%s", sep);
spa_debug_format_value(ti ? ti->values : NULL, type, vals, size);
spa_strbuf_append(&buf, "%s", sep);
spa_debug_strbuf_format_value(&buf, ti ? ti->values : NULL, type, vals, size);
}
spa_debugn("%s", esep);
spa_strbuf_append(&buf, "%s", esep);
}
spa_debugn("\n");
spa_debugc(ctx, "%s", buffer);
}
return 0;
}
static inline int spa_debug_format(int indent,
const struct spa_type_info *info, const struct spa_pod *format)
{
return spa_debugc_format(NULL, indent, info, format);
}
/**
* \}
*/

View File

@ -30,17 +30,67 @@ extern "C" {
#endif
#include <stdio.h>
#include <stdarg.h>
#include <spa/utils/defs.h>
#include <spa/support/log.h>
#include <spa/debug/context.h>
/**
* \addtogroup spa_debug
* \{
*/
#ifndef spa_debug
#define spa_debug(fmt,...) ({ printf(fmt"\n", ## __VA_ARGS__); })
#endif
#ifndef spa_debugn
#define spa_debugn(fmt,...) ({ printf(fmt, ## __VA_ARGS__); })
#endif
struct spa_debug_log_ctx {
struct spa_debug_context ctx;
struct spa_log *log;
enum spa_log_level level;
const struct spa_log_topic *topic;
const char *file;
int line;
const char *func;
};
SPA_PRINTF_FUNC(2,3)
static inline void spa_debug_log_log(struct spa_debug_context *ctx, const char *fmt, ...)
{
struct spa_debug_log_ctx *c = (struct spa_debug_log_ctx*)ctx;
va_list args;
va_start(args, fmt);
spa_log_logtv(c->log, c->level, c->topic, c->file, c->line, c->func, fmt, args);
va_end(args);
}
#define SPA_LOGF_DEBUG_INIT(_l,_lev,_t,_file,_line,_func) \
(struct spa_debug_log_ctx){ { spa_debug_log_log }, _l, _lev, _t, \
_file, _line, _func }
#define SPA_LOGT_DEBUG_INIT(_l,_lev,_t) \
SPA_LOGF_DEBUG_INIT(_l,_lev,_t,__FILE__,__LINE__,__func__)
#define SPA_LOG_DEBUG_INIT(l,lev) \
SPA_LOGT_DEBUG_INIT(l,lev,SPA_LOG_TOPIC_DEFAULT)
#define spa_debug_log_pod(l,lev,indent,info,pod) \
({ \
struct spa_debug_log_ctx c = SPA_LOG_DEBUG_INIT(l,lev); \
if (SPA_UNLIKELY(spa_log_level_topic_enabled(c.log, c.topic, c.level))) \
spa_debugc_pod(&c.ctx, indent, info, pod); \
})
#define spa_debug_log_format(l,lev,indent,info,format) \
({ \
struct spa_debug_log_ctx c = SPA_LOG_DEBUG_INIT(l,lev); \
if (SPA_UNLIKELY(spa_log_level_topic_enabled(c.log, c.topic, c.level))) \
spa_debugc_format(&c.ctx, indent, info, format); \
})
#define spa_debug_log_mem(l,lev,indent,data,len) \
({ \
struct spa_debug_log_ctx c = SPA_LOG_DEBUG_INIT(l,lev); \
if (SPA_UNLIKELY(spa_log_level_topic_enabled(c.log, c.topic, c.level))) \
spa_debugc_mem(&c.ctx, indent, data, len); \
})
/**
* \}
@ -50,4 +100,4 @@ extern "C" {
} /* extern "C" */
#endif
#endif /* SPA_DEBUG_LOGH */
#endif /* SPA_DEBUG_LOG_H */

View File

@ -36,9 +36,9 @@ extern "C" {
* \{
*/
#include <spa/debug/log.h>
#include <spa/debug/context.h>
static inline int spa_debug_mem(int indent, const void *data, size_t size)
static inline int spa_debugc_mem(struct spa_debug_context *ctx, int indent, const void *data, size_t size)
{
const uint8_t *t = (const uint8_t*)data;
char buffer[512];
@ -50,12 +50,16 @@ static inline int spa_debug_mem(int indent, const void *data, size_t size)
pos = sprintf(buffer, "%p: ", &t[i]);
pos += sprintf(buffer + pos, "%02x ", t[i]);
if (i % 16 == 15 || i == size - 1) {
spa_debug("%*s" "%s", indent, "", buffer);
spa_debugc(ctx, "%*s" "%s", indent, "", buffer);
}
}
return 0;
}
static inline int spa_debug_mem(int indent, const void *data, size_t size)
{
return spa_debugc_mem(NULL, indent, data, size);
}
/**
* \}
*/

View File

@ -35,22 +35,26 @@ extern "C" {
*/
#include <spa/node/node.h>
#include <spa/debug/log.h>
#include <spa/debug/context.h>
#include <spa/debug/dict.h>
static inline int spa_debug_port_info(int indent, const struct spa_port_info *info)
static inline int spa_debugc_port_info(struct spa_debug_context *ctx, int indent, const struct spa_port_info *info)
{
spa_debug("%*s" "struct spa_port_info %p:", indent, "", info);
spa_debug("%*s" " flags: \t%08" PRIx64, indent, "", info->flags);
spa_debug("%*s" " rate: \t%d/%d", indent, "", info->rate.num, info->rate.denom);
spa_debug("%*s" " props:", indent, "");
spa_debugc(ctx, "%*s" "struct spa_port_info %p:", indent, "", info);
spa_debugc(ctx, "%*s" " flags: \t%08" PRIx64, indent, "", info->flags);
spa_debugc(ctx, "%*s" " rate: \t%d/%d", indent, "", info->rate.num, info->rate.denom);
spa_debugc(ctx, "%*s" " props:", indent, "");
if (info->props)
spa_debug_dict(indent + 2, info->props);
spa_debugc_dict(ctx, indent + 2, info->props);
else
spa_debug("%*s" " none", indent, "");
spa_debugc(ctx, "%*s" " none", indent, "");
return 0;
}
static inline int spa_debug_port_info(int indent, const struct spa_port_info *info)
{
return spa_debugc_port_info(NULL, indent, info);
}
/**
* \}
*/

View File

@ -34,63 +34,63 @@ extern "C" {
* \{
*/
#include <spa/debug/log.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>
static inline int
spa_debug_pod_value(int indent, const struct spa_type_info *info,
spa_debugc_pod_value(struct spa_debug_context *ctx, int indent, const struct spa_type_info *info,
uint32_t type, void *body, uint32_t size)
{
switch (type) {
case SPA_TYPE_Bool:
spa_debug("%*s" "Bool %s", indent, "", (*(int32_t *) body) ? "true" : "false");
spa_debugc(ctx, "%*s" "Bool %s", indent, "", (*(int32_t *) body) ? "true" : "false");
break;
case SPA_TYPE_Id:
spa_debug("%*s" "Id %-8d (%s)", indent, "", *(int32_t *) body,
spa_debugc(ctx, "%*s" "Id %-8d (%s)", indent, "", *(int32_t *) body,
spa_debug_type_find_name(info, *(int32_t *) body));
break;
case SPA_TYPE_Int:
spa_debug("%*s" "Int %d", indent, "", *(int32_t *) body);
spa_debugc(ctx, "%*s" "Int %d", indent, "", *(int32_t *) body);
break;
case SPA_TYPE_Long:
spa_debug("%*s" "Long %" PRIi64 "", indent, "", *(int64_t *) body);
spa_debugc(ctx, "%*s" "Long %" PRIi64 "", indent, "", *(int64_t *) body);
break;
case SPA_TYPE_Float:
spa_debug("%*s" "Float %f", indent, "", *(float *) body);
spa_debugc(ctx, "%*s" "Float %f", indent, "", *(float *) body);
break;
case SPA_TYPE_Double:
spa_debug("%*s" "Double %f", indent, "", *(double *) body);
spa_debugc(ctx, "%*s" "Double %f", indent, "", *(double *) body);
break;
case SPA_TYPE_String:
spa_debug("%*s" "String \"%s\"", indent, "", (char *) body);
spa_debugc(ctx, "%*s" "String \"%s\"", indent, "", (char *) body);
break;
case SPA_TYPE_Fd:
spa_debug("%*s" "Fd %d", indent, "", *(int *) body);
spa_debugc(ctx, "%*s" "Fd %d", indent, "", *(int *) body);
break;
case SPA_TYPE_Pointer:
{
struct spa_pod_pointer_body *b = (struct spa_pod_pointer_body *)body;
spa_debug("%*s" "Pointer %s %p", indent, "",
spa_debugc(ctx, "%*s" "Pointer %s %p", indent, "",
spa_debug_type_find_name(SPA_TYPE_ROOT, b->type), b->value);
break;
}
case SPA_TYPE_Rectangle:
{
struct spa_rectangle *r = (struct spa_rectangle *)body;
spa_debug("%*s" "Rectangle %dx%d", indent, "", r->width, r->height);
spa_debugc(ctx, "%*s" "Rectangle %dx%d", indent, "", r->width, r->height);
break;
}
case SPA_TYPE_Fraction:
{
struct spa_fraction *f = (struct spa_fraction *)body;
spa_debug("%*s" "Fraction %d/%d", indent, "", f->num, f->denom);
spa_debugc(ctx, "%*s" "Fraction %d/%d", indent, "", f->num, f->denom);
break;
}
case SPA_TYPE_Bitmap:
spa_debug("%*s" "Bitmap", indent, "");
spa_debugc(ctx, "%*s" "Bitmap", indent, "");
break;
case SPA_TYPE_Array:
{
@ -98,12 +98,12 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
void *p;
const struct spa_type_info *ti = spa_debug_type_find(SPA_TYPE_ROOT, b->child.type);
spa_debug("%*s" "Array: child.size %d, child.type %s", indent, "",
spa_debugc(ctx, "%*s" "Array: child.size %d, child.type %s", indent, "",
b->child.size, ti ? ti->name : "unknown");
info = info && info->values ? info->values : info;
SPA_POD_ARRAY_BODY_FOREACH(b, size, p)
spa_debug_pod_value(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;
}
case SPA_TYPE_Choice:
@ -112,19 +112,19 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
void *p;
const struct spa_type_info *ti = spa_debug_type_find(spa_type_choice, b->type);
spa_debug("%*s" "Choice: type %s, flags %08x %d %d", indent, "",
spa_debugc(ctx, "%*s" "Choice: type %s, flags %08x %d %d", indent, "",
ti ? ti->name : "unknown", b->flags, size, b->child.size);
SPA_POD_CHOICE_BODY_FOREACH(b, size, p)
spa_debug_pod_value(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;
}
case SPA_TYPE_Struct:
{
struct spa_pod *b = (struct spa_pod *)body, *p;
spa_debug("%*s" "Struct: size %d", indent, "", size);
spa_debugc(ctx, "%*s" "Struct: size %d", indent, "", size);
SPA_POD_FOREACH(b, size, p)
spa_debug_pod_value(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;
}
case SPA_TYPE_Object:
@ -137,7 +137,7 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
ii = ti ? spa_debug_type_find(ti->values, 0) : NULL;
ii = ii ? spa_debug_type_find(ii->values, b->id) : NULL;
spa_debug("%*s" "Object: size %d, type %s (%d), id %s (%d)", indent, "", size,
spa_debugc(ctx, "%*s" "Object: size %d, type %s (%d), id %s (%d)", indent, "", size,
ti ? ti->name : "unknown", b->type, ii ? ii->name : "unknown", b->id);
info = ti ? ti->values : info;
@ -145,10 +145,10 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
SPA_POD_OBJECT_BODY_FOREACH(b, size, p) {
ii = spa_debug_type_find(info, p->key);
spa_debug("%*s" "Prop: key %s (%d), flags %08x", indent+2, "",
spa_debugc(ctx, "%*s" "Prop: key %s (%d), flags %08x", indent+2, "",
ii ? ii->name : "unknown", p->key, p->flags);
spa_debug_pod_value(indent + 4, ii ? ii->values : NULL,
spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
p->value.type,
SPA_POD_CONTENTS(struct spa_pod_prop, p),
p->value.size);
@ -163,16 +163,16 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
ti = spa_debug_type_find(info, b->unit);
spa_debug("%*s" "Sequence: size %d, unit %s", indent, "", size,
spa_debugc(ctx, "%*s" "Sequence: size %d, unit %s", indent, "", size,
ti ? ti->name : "unknown");
SPA_POD_SEQUENCE_BODY_FOREACH(b, size, c) {
ii = spa_debug_type_find(spa_type_control, c->type);
spa_debug("%*s" "Control: offset %d, type %s", indent+2, "",
spa_debugc(ctx, "%*s" "Control: offset %d, type %s", indent+2, "",
c->offset, ii ? ii->name : "unknown");
spa_debug_pod_value(indent + 4, ii ? ii->values : NULL,
spa_debugc_pod_value(ctx, indent + 4, ii ? ii->values : NULL,
c->value.type,
SPA_POD_CONTENTS(struct spa_pod_control, c),
c->value.size);
@ -180,29 +180,41 @@ spa_debug_pod_value(int indent, const struct spa_type_info *info,
break;
}
case SPA_TYPE_Bytes:
spa_debug("%*s" "Bytes", indent, "");
spa_debug_mem(indent + 2, body, size);
spa_debugc(ctx, "%*s" "Bytes", indent, "");
spa_debugc_mem(ctx, indent + 2, body, size);
break;
case SPA_TYPE_None:
spa_debug("%*s" "None", indent, "");
spa_debug_mem(indent + 2, body, size);
spa_debugc(ctx, "%*s" "None", indent, "");
spa_debugc_mem(ctx, indent + 2, body, size);
break;
default:
spa_debug("%*s" "unhandled POD type %d", indent, "", type);
spa_debugc(ctx, "%*s" "unhandled POD type %d", indent, "", type);
break;
}
return 0;
}
static inline int spa_debug_pod(int indent,
static inline int spa_debugc_pod(struct spa_debug_context *ctx, int indent,
const struct spa_type_info *info, const struct spa_pod *pod)
{
return spa_debug_pod_value(indent, info ? info : SPA_TYPE_ROOT,
return spa_debugc_pod_value(ctx, indent, info ? info : SPA_TYPE_ROOT,
SPA_POD_TYPE(pod),
SPA_POD_BODY(pod),
SPA_POD_BODY_SIZE(pod));
}
static inline int
spa_debug_pod_value(int indent, const struct spa_type_info *info,
uint32_t type, void *body, uint32_t size)
{
return spa_debugc_pod_value(NULL, indent, info, type, body, size);
}
static inline int spa_debug_pod(int indent,
const struct spa_type_info *info, const struct spa_pod *pod)
{
return spa_debugc_pod(NULL, indent, info, pod);
}
/**
* \}
*/

View File

@ -121,12 +121,12 @@ struct spa_graph_node {
int __res = 0; \
spa_callbacks_call_res(&(n)->callbacks, \
struct spa_graph_node_callbacks, __res, \
method, version, ##__VA_ARGS__); \
method, (version), ##__VA_ARGS__); \
__res; \
})
#define spa_graph_node_process(n) spa_graph_node_call(n, process, 0, n)
#define spa_graph_node_reuse_buffer(n,p,i) spa_graph_node_call(n, reuse_buffer, 0, n, p, i)
#define spa_graph_node_process(n) spa_graph_node_call((n), process, 0, (n))
#define spa_graph_node_reuse_buffer(n,p,i) spa_graph_node_call((n), reuse_buffer, 0, (n), (p), (i))
struct spa_graph_port {
struct spa_list link; /**< link in node port list */

View File

@ -23,6 +23,7 @@
*/
#include <spa/pod/builder.h>
#include <spa/utils/dict.h>
#include <spa/utils/hook.h>
#include <spa/param/audio/raw.h>
@ -36,7 +37,7 @@ extern "C" {
#define SPA_TYPE_INTERFACE_AUDIO_AEC SPA_TYPE_INFO_INTERFACE_BASE "Audio:AEC"
#define SPA_VERSION_AUDIO_AEC 0
#define SPA_VERSION_AUDIO_AEC 1
struct spa_audio_aec {
struct spa_interface iface;
const char *name;
@ -60,7 +61,7 @@ struct spa_audio_aec_events {
};
struct spa_audio_aec_methods {
#define SPA_VERSION_AUDIO_AEC_METHODS 0
#define SPA_VERSION_AUDIO_AEC_METHODS 2
uint32_t version;
int (*add_listener) (void *object,
@ -68,18 +69,27 @@ struct spa_audio_aec_methods {
const struct spa_audio_aec_events *events,
void *data);
int (*init) (void *data, const struct spa_dict *args, const struct spa_audio_info_raw *info);
int (*run) (void *data, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
int (*set_props) (void *data, const struct spa_dict *args);
int (*init) (void *object, const struct spa_dict *args, const struct spa_audio_info_raw *info);
int (*run) (void *object, const float *rec[], const float *play[], float *out[], uint32_t n_samples);
int (*set_props) (void *object, const struct spa_dict *args);
/* since 0.3.58, version 1:1 */
int (*activate) (void *object);
/* since 0.3.58, version 1:1 */
int (*deactivate) (void *object);
/* version 1:2 */
int (*enum_props) (void* object, int index, struct spa_pod_builder* builder);
int (*get_params) (void* object, struct spa_pod_builder* builder);
int (*set_params) (void *object, const struct spa_pod *args);
};
#define spa_audio_aec_method(o,method,version,...) \
({ \
int _res = -ENOTSUP; \
struct spa_audio_aec *_o = o; \
struct spa_audio_aec *_o = (o); \
spa_interface_call_res(&_o->iface, \
struct spa_audio_aec_methods, _res, \
method, version, ##__VA_ARGS__); \
method, (version), ##__VA_ARGS__); \
_res; \
})
@ -87,6 +97,11 @@ struct spa_audio_aec_methods {
#define spa_audio_aec_init(o,...) spa_audio_aec_method(o, init, 0, __VA_ARGS__)
#define spa_audio_aec_run(o,...) spa_audio_aec_method(o, run, 0, __VA_ARGS__)
#define spa_audio_aec_set_props(o,...) spa_audio_aec_method(o, set_props, 0, __VA_ARGS__)
#define spa_audio_aec_activate(o) spa_audio_aec_method(o, activate, 1)
#define spa_audio_aec_deactivate(o) spa_audio_aec_method(o, deactivate, 1)
#define spa_audio_aec_enum_props(o,...) spa_audio_aec_method(o, enum_props, 2, __VA_ARGS__)
#define spa_audio_aec_get_params(o,...) spa_audio_aec_method(o, get_params, 2, __VA_ARGS__)
#define spa_audio_aec_set_params(o,...) spa_audio_aec_method(o, set_params, 2, __VA_ARGS__)
#ifdef __cplusplus
} /* extern "C" */

View File

@ -71,7 +71,7 @@ struct spa_device_info {
uint32_t n_params; /**< number of elements in params */
};
#define SPA_DEVICE_INFO_INIT() (struct spa_device_info){ SPA_VERSION_DEVICE_INFO, }
#define SPA_DEVICE_INFO_INIT() ((struct spa_device_info){ SPA_VERSION_DEVICE_INFO, })
/**
* Information about a device object
@ -92,7 +92,7 @@ struct spa_device_object_info {
const struct spa_dict *props; /**< extra object properties */
};
#define SPA_DEVICE_OBJECT_INFO_INIT() (struct spa_device_object_info){ SPA_VERSION_DEVICE_OBJECT_INFO, }
#define SPA_DEVICE_OBJECT_INFO_INIT() ((struct spa_device_object_info){ SPA_VERSION_DEVICE_OBJECT_INFO, })
/** the result of spa_device_enum_params() */
#define SPA_RESULT_TYPE_DEVICE_PARAMS 1
@ -243,10 +243,10 @@ struct spa_device_methods {
#define spa_device_method(o,method,version,...) \
({ \
int _res = -ENOTSUP; \
struct spa_device *_o = o; \
struct spa_device *_o = (o); \
spa_interface_call_res(&_o->iface, \
struct spa_device_methods, _res, \
method, version, ##__VA_ARGS__); \
method, (version), ##__VA_ARGS__); \
_res; \
})

View File

@ -100,7 +100,7 @@ struct spa_io_buffers {
uint32_t buffer_id; /**< a buffer id */
};
#define SPA_IO_BUFFERS_INIT (struct spa_io_buffers) { SPA_STATUS_OK, SPA_ID_INVALID, }
#define SPA_IO_BUFFERS_INIT ((struct spa_io_buffers) { SPA_STATUS_OK, SPA_ID_INVALID, })
/**
* IO area to exchange a memory region
@ -110,7 +110,7 @@ struct spa_io_memory {
uint32_t size; /**< the size of \a data */
void *data; /**< a memory pointer */
};
#define SPA_IO_MEMORY_INIT (struct spa_io_memory) { SPA_STATUS_OK, 0, NULL, }
#define SPA_IO_MEMORY_INIT ((struct spa_io_memory) { SPA_STATUS_OK, 0, NULL, })
/** A range, suitable for input ports that can suggest a range to output ports */
struct spa_io_range {

View File

@ -85,7 +85,7 @@ struct spa_node_info {
uint32_t n_params; /**< number of items in \a params */
};
#define SPA_NODE_INFO_INIT() (struct spa_node_info) { 0, }
#define SPA_NODE_INFO_INIT() ((struct spa_node_info) { 0, })
/**
* Port information structure
@ -124,7 +124,7 @@ struct spa_port_info {
uint32_t n_params; /**< number of items in \a params */
};
#define SPA_PORT_INFO_INIT() (struct spa_port_info) { 0, }
#define SPA_PORT_INFO_INIT() ((struct spa_port_info) { 0, })
#define SPA_RESULT_TYPE_NODE_ERROR 1
#define SPA_RESULT_TYPE_NODE_PARAMS 2

View File

@ -34,7 +34,7 @@ extern "C" {
* \{
*/
#include <spa/utils/type-info.h>
#include <spa/utils/type.h>
#include <spa/node/command.h>
#include <spa/node/event.h>

View File

@ -0,0 +1,58 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AAC_TYPES_H
#define SPA_AUDIO_AAC_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/utils/type.h>
#include <spa/param/audio/aac.h>
#define SPA_TYPE_INFO_AudioAACStreamFormat SPA_TYPE_INFO_ENUM_BASE "AudioAACStreamFormat"
#define SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE SPA_TYPE_INFO_AudioAACStreamFormat ":"
static const struct spa_type_info spa_type_audio_aac_stream_format[] = {
{ SPA_AUDIO_AAC_STREAM_FORMAT_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_RAW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "RAW", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_MP2ADTS, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "MP2ADTS", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_MP4ADTS, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "MP4ADTS", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_MP4LOAS, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "MP4LOAS", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_MP4LATM, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "MP4LATM", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_ADIF, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "ADIF", NULL },
{ SPA_AUDIO_AAC_STREAM_FORMAT_MP4FF, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AAC_STREAM_FORMAT_BASE "MP4FF", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AAC_TYPES_H */

View File

@ -0,0 +1,89 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AAC_UTILS_H
#define SPA_AUDIO_AAC_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_aac_parse(const struct spa_pod *format, struct spa_audio_info_aac *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),
SPA_FORMAT_AUDIO_bitrate, SPA_POD_OPT_Int(&info->bitrate),
SPA_FORMAT_AUDIO_AAC_streamFormat, SPA_POD_OPT_Id(&info->stream_format));
return res;
}
static inline struct spa_pod *
spa_format_audio_aac_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_aac *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_aac),
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);
if (info->bitrate != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_bitrate, SPA_POD_Int(info->bitrate), 0);
if (info->stream_format != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_AAC_streamFormat, SPA_POD_Id(info->stream_format), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AAC_UTILS_H */

View File

@ -0,0 +1,71 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AAC_H
#define SPA_AUDIO_AAC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
enum spa_audio_aac_stream_format {
SPA_AUDIO_AAC_STREAM_FORMAT_UNKNOWN,
/* Raw AAC frames */
SPA_AUDIO_AAC_STREAM_FORMAT_RAW,
/* ISO/IEC 13818-7 MPEG-2 Audio Data Transport Stream (ADTS) */
SPA_AUDIO_AAC_STREAM_FORMAT_MP2ADTS,
/* ISO/IEC 14496-3 MPEG-4 Audio Data Transport Stream (ADTS) */
SPA_AUDIO_AAC_STREAM_FORMAT_MP4ADTS,
/* ISO/IEC 14496-3 Low Overhead Audio Stream (LOAS) */
SPA_AUDIO_AAC_STREAM_FORMAT_MP4LOAS,
/* ISO/IEC 14496-3 Low Overhead Audio Transport Multiplex (LATM) */
SPA_AUDIO_AAC_STREAM_FORMAT_MP4LATM,
/* ISO/IEC 14496-3 Audio Data Interchange Format (ADIF) */
SPA_AUDIO_AAC_STREAM_FORMAT_ADIF,
/* ISO/IEC 14496-12 MPEG-4 file format */
SPA_AUDIO_AAC_STREAM_FORMAT_MP4FF,
SPA_AUDIO_AAC_STREAM_FORMAT_CUSTOM = 0x10000,
};
struct spa_audio_info_aac {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
uint32_t bitrate; /*< stream bitrate */
enum spa_audio_aac_stream_format stream_format; /*< AAC audio stream format */
};
#define SPA_AUDIO_INFO_AAC_INIT(...) ((struct spa_audio_info_aac) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AAC_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_ALAC_UTILS_H
#define SPA_AUDIO_ALAC_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_alac_parse(const struct spa_pod *format, struct spa_audio_info_alac *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;
}
static inline struct spa_pod *
spa_format_audio_alac_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_alac *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_alac),
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_ALAC_UTILS_H */

View File

@ -1,6 +1,6 @@
/* Spa
/* Simple Plugin API
*
* Copyright © 2020 Wim Taymans
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@ -22,23 +22,28 @@
* DEALINGS IN THE SOFTWARE.
*/
#include <math.h>
#ifndef SPA_AUDIO_ALAC_H
#define SPA_AUDIO_ALAC_H
#include <spa/utils/defs.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "resample.h"
#include <spa/param/audio/raw.h>
struct peaks_data {
uint32_t o_count;
uint32_t i_count;
float max_f[];
struct spa_audio_info_alac {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
void resample_peaks_process_c(struct resample *r,
const void * SPA_RESTRICT src[], uint32_t *in_len,
void * SPA_RESTRICT dst[], uint32_t *out_len);
#if defined (HAVE_SSE)
void resample_peaks_process_sse(struct resample *r,
const void * SPA_RESTRICT src[], uint32_t *in_len,
void * SPA_RESTRICT dst[], uint32_t *out_len);
#define SPA_AUDIO_INFO_ALAC_INIT(...) ((struct spa_audio_info_alac) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_ALAC_H */

View File

@ -0,0 +1,52 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AMR_TYPES_H
#define SPA_AUDIO_AMR_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/utils/type.h>
#include <spa/param/audio/amr.h>
#define SPA_TYPE_INFO_AudioAMRBandMode SPA_TYPE_INFO_ENUM_BASE "AudioAMRBandMode"
#define SPA_TYPE_INFO_AUDIO_AMR_BAND_MODE_BASE SPA_TYPE_INFO_AudioAMRBandMode ":"
static const struct spa_type_info spa_type_audio_amr_band_mode[] = {
{ SPA_AUDIO_AMR_BAND_MODE_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AMR_BAND_MODE_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_AMR_BAND_MODE_NB, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AMR_BAND_MODE_BASE "NB", NULL },
{ SPA_AUDIO_AMR_BAND_MODE_WB, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_AMR_BAND_MODE_BASE "WB", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AMR_TYPES_H */

View File

@ -0,0 +1,84 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AMR_UTILS_H
#define SPA_AUDIO_AMR_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_amr_parse(const struct spa_pod *format, struct spa_audio_info_amr *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),
SPA_FORMAT_AUDIO_AMR_bandMode, SPA_POD_OPT_Id(&info->band_mode));
return res;
}
static inline struct spa_pod *
spa_format_audio_amr_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_amr *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_amr),
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);
if (info->band_mode != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_AMR_bandMode, SPA_POD_Id(info->band_mode), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AMR_UTILS_H */

View File

@ -0,0 +1,56 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_AMR_H
#define SPA_AUDIO_AMR_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
enum spa_audio_amr_band_mode {
SPA_AUDIO_AMR_BAND_MODE_UNKNOWN,
SPA_AUDIO_AMR_BAND_MODE_NB,
SPA_AUDIO_AMR_BAND_MODE_WB,
};
struct spa_audio_info_amr {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
enum spa_audio_amr_band_mode band_mode;
};
#define SPA_AUDIO_INFO_AMR_INIT(...) ((struct spa_audio_info_amr) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_AMR_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_APE_UTILS_H
#define SPA_AUDIO_APE_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_ape_parse(const struct spa_pod *format, struct spa_audio_info_ape *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;
}
static inline struct spa_pod *
spa_format_audio_ape_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_ape *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_ape),
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_APE_UTILS_H */

View File

@ -0,0 +1,49 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_APE_H
#define SPA_AUDIO_APE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
struct spa_audio_info_ape {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
#define SPA_AUDIO_INFO_APE_INIT(...) ((struct spa_audio_info_ape) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_APE_H */

View File

@ -0,0 +1,39 @@
/* Simple Plugin API
*
* Copyright © 2021 Wim Taymans
* © 2022 Asymptotic Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_COMPRESSED_H
#define SPA_AUDIO_COMPRESSED_H
#include <spa/param/audio/aac.h>
#include <spa/param/audio/alac.h>
#include <spa/param/audio/amr.h>
#include <spa/param/audio/ape.h>
#include <spa/param/audio/flac.h>
#include <spa/param/audio/mp3.h>
#include <spa/param/audio/ra.h>
#include <spa/param/audio/vorbis.h>
#include <spa/param/audio/wma.h>
#endif /* SPA_AUDIO_COMPRESSED_H */

View File

@ -0,0 +1,100 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_DSD_UTILS_H
#define SPA_AUDIO_DSD_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/format-utils.h>
#include <spa/param/audio/format.h>
static inline int
spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_dsd *info)
{
struct spa_pod *position = NULL;
int res;
info->flags = 0;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_bitorder, SPA_POD_OPT_Id(&info->bitorder),
SPA_FORMAT_AUDIO_interleave, SPA_POD_OPT_Int(&info->interleave),
SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate),
SPA_FORMAT_AUDIO_channels, SPA_POD_OPT_Int(&info->channels),
SPA_FORMAT_AUDIO_position, SPA_POD_OPT_Pod(&position));
if (position == NULL ||
!spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_AUDIO_MAX_CHANNELS))
SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
return res;
}
static inline struct spa_pod *
spa_format_audio_dsd_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_dsd *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_dsd),
0);
if (info->bitorder != SPA_PARAM_BITORDER_unknown)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_bitorder, SPA_POD_Id(info->bitorder), 0);
if (info->interleave != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_interleave, SPA_POD_Int(info->interleave), 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);
if (!SPA_FLAG_IS_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED)) {
spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_position,
SPA_POD_Array(sizeof(uint32_t), SPA_TYPE_Id,
info->channels, info->position), 0);
}
}
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_DSD_UTILS_H */

View File

@ -68,7 +68,7 @@ struct spa_audio_info_dsd {
uint32_t position[SPA_AUDIO_MAX_CHANNELS]; /*< channel position from enum spa_audio_channel */
};
#define SPA_AUDIO_INFO_DSD_INIT(...) (struct spa_audio_info_dsd) { __VA_ARGS__ }
#define SPA_AUDIO_INFO_DSD_INIT(...) ((struct spa_audio_info_dsd) { __VA_ARGS__ })
/**
* \}

View File

@ -0,0 +1,75 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_DSP_UTILS_H
#define SPA_AUDIO_DSP_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_dsp_parse(const struct spa_pod *format, struct spa_audio_info_dsp *info)
{
int res;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_format, SPA_POD_OPT_Id(&info->format));
return res;
}
static inline struct spa_pod *
spa_format_audio_dsp_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_dsp *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_dsp),
0);
if (info->format != SPA_AUDIO_FORMAT_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(info->format), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_DSP_UTILS_H */

View File

@ -0,0 +1,48 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_DSP_H
#define SPA_AUDIO_DSP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
struct spa_audio_info_dsp {
enum spa_audio_format format; /*< format, one of the DSP formats in enum spa_audio_format */
};
#define SPA_AUDIO_INFO_DSP_INIT(...) ((struct spa_audio_info_dsp) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_DSP_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_FLAC_UTILS_H
#define SPA_AUDIO_FLAC_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_flac_parse(const struct spa_pod *format, struct spa_audio_info_flac *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;
}
static inline struct spa_pod *
spa_format_audio_flac_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_flac *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_flac),
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_FLAC_UTILS_H */

View File

@ -0,0 +1,49 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_FLAC_H
#define SPA_AUDIO_FLAC_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
struct spa_audio_info_flac {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
#define SPA_AUDIO_INFO_FLAC_INIT(...) ((struct spa_audio_info_flac) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_FLAC_H */

View File

@ -29,167 +29,107 @@
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_raw_parse(const struct spa_pod *format, struct spa_audio_info_raw *info)
{
struct spa_pod *position = NULL;
int res;
info->flags = 0;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(&info->format),
SPA_FORMAT_AUDIO_rate, SPA_POD_Int(&info->rate),
SPA_FORMAT_AUDIO_channels, SPA_POD_Int(&info->channels),
SPA_FORMAT_AUDIO_position, SPA_POD_OPT_Pod(&position));
if (position == NULL ||
!spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_AUDIO_MAX_CHANNELS))
SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
#include <spa/param/audio/raw-utils.h>
#include <spa/param/audio/dsp-utils.h>
#include <spa/param/audio/iec958-utils.h>
#include <spa/param/audio/dsd-utils.h>
#include <spa/param/audio/mp3-utils.h>
#include <spa/param/audio/aac-utils.h>
#include <spa/param/audio/vorbis-utils.h>
#include <spa/param/audio/wma-utils.h>
#include <spa/param/audio/ra-utils.h>
#include <spa/param/audio/amr-utils.h>
#include <spa/param/audio/alac-utils.h>
#include <spa/param/audio/flac-utils.h>
#include <spa/param/audio/ape-utils.h>
return res;
}
/**
* \addtogroup spa_param
* \{
*/
static inline int
spa_format_audio_dsp_parse(const struct spa_pod *format, struct spa_audio_info_dsp *info)
spa_format_audio_parse(const struct spa_pod *format, struct spa_audio_info *info)
{
int res;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(&info->format));
return res;
}
static inline int
spa_format_audio_iec958_parse(const struct spa_pod *format, struct spa_audio_info_iec958 *info)
{
int res;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_Id(&info->codec),
SPA_FORMAT_AUDIO_rate, SPA_POD_Int(&info->rate));
return res;
}
if ((res = spa_format_parse(format, &info->media_type, &info->media_subtype)) < 0)
return res;
static inline int
spa_format_audio_dsd_parse(const struct spa_pod *format, struct spa_audio_info_dsd *info)
{
struct spa_pod *position = NULL;
int res;
info->flags = 0;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_bitorder, SPA_POD_Id(&info->bitorder),
SPA_FORMAT_AUDIO_interleave, SPA_POD_Int(&info->interleave),
SPA_FORMAT_AUDIO_rate, SPA_POD_Int(&info->rate),
SPA_FORMAT_AUDIO_channels, SPA_POD_Int(&info->channels),
SPA_FORMAT_AUDIO_position, SPA_POD_OPT_Pod(&position));
if (position == NULL ||
!spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_AUDIO_MAX_CHANNELS))
SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
if (info->media_type != SPA_MEDIA_TYPE_audio)
return -EINVAL;
return res;
}
static inline struct spa_pod *
spa_format_audio_raw_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_raw *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_raw),
0);
if (info->format != SPA_AUDIO_FORMAT_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(info->format), 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);
if (!SPA_FLAG_IS_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED)) {
spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_position,
SPA_POD_Array(sizeof(uint32_t), SPA_TYPE_Id,
info->channels, info->position), 0);
}
switch (info->media_subtype) {
case SPA_MEDIA_SUBTYPE_raw:
return spa_format_audio_raw_parse(format, &info->info.raw);
case SPA_MEDIA_SUBTYPE_dsp:
return spa_format_audio_dsp_parse(format, &info->info.dsp);
case SPA_MEDIA_SUBTYPE_iec958:
return spa_format_audio_iec958_parse(format, &info->info.iec958);
case SPA_MEDIA_SUBTYPE_dsd:
return spa_format_audio_dsd_parse(format, &info->info.dsd);
case SPA_MEDIA_SUBTYPE_mp3:
return spa_format_audio_mp3_parse(format, &info->info.mp3);
case SPA_MEDIA_SUBTYPE_aac:
return spa_format_audio_aac_parse(format, &info->info.aac);
case SPA_MEDIA_SUBTYPE_vorbis:
return spa_format_audio_vorbis_parse(format, &info->info.vorbis);
case SPA_MEDIA_SUBTYPE_wma:
return spa_format_audio_wma_parse(format, &info->info.wma);
case SPA_MEDIA_SUBTYPE_ra:
return spa_format_audio_ra_parse(format, &info->info.ra);
case SPA_MEDIA_SUBTYPE_amr:
return spa_format_audio_amr_parse(format, &info->info.amr);
case SPA_MEDIA_SUBTYPE_alac:
return spa_format_audio_alac_parse(format, &info->info.alac);
case SPA_MEDIA_SUBTYPE_flac:
return spa_format_audio_flac_parse(format, &info->info.flac);
case SPA_MEDIA_SUBTYPE_ape:
return spa_format_audio_ape_parse(format, &info->info.ape);
}
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
return -ENOTSUP;
}
static inline struct spa_pod *
spa_format_audio_dsp_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_dsp *info)
spa_format_audio_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info *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_dsp),
0);
if (info->format != SPA_AUDIO_FORMAT_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(info->format), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
static inline struct spa_pod *
spa_format_audio_iec958_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_iec958 *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_iec958),
0);
if (info->codec != SPA_AUDIO_IEC958_CODEC_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_Id(info->codec), 0);
if (info->rate != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_rate, SPA_POD_Int(info->rate), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
static inline struct spa_pod *
spa_format_audio_dsd_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_dsd *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_dsd),
0);
if (info->bitorder != SPA_PARAM_BITORDER_unknown)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_bitorder, SPA_POD_Id(info->bitorder), 0);
if (info->interleave != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_interleave, SPA_POD_Int(info->interleave), 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);
if (!SPA_FLAG_IS_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED)) {
spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_position,
SPA_POD_Array(sizeof(uint32_t), SPA_TYPE_Id,
info->channels, info->position), 0);
}
switch (info->media_subtype) {
case SPA_MEDIA_SUBTYPE_raw:
return spa_format_audio_raw_build(builder, id, &info->info.raw);
case SPA_MEDIA_SUBTYPE_dsp:
return spa_format_audio_dsp_build(builder, id, &info->info.dsp);
case SPA_MEDIA_SUBTYPE_iec958:
return spa_format_audio_iec958_build(builder, id, &info->info.iec958);
case SPA_MEDIA_SUBTYPE_dsd:
return spa_format_audio_dsd_build(builder, id, &info->info.dsd);
case SPA_MEDIA_SUBTYPE_mp3:
return spa_format_audio_mp3_build(builder, id, &info->info.mp3);
case SPA_MEDIA_SUBTYPE_aac:
return spa_format_audio_aac_build(builder, id, &info->info.aac);
case SPA_MEDIA_SUBTYPE_vorbis:
return spa_format_audio_vorbis_build(builder, id, &info->info.vorbis);
case SPA_MEDIA_SUBTYPE_wma:
return spa_format_audio_wma_build(builder, id, &info->info.wma);
case SPA_MEDIA_SUBTYPE_ra:
return spa_format_audio_ra_build(builder, id, &info->info.ra);
case SPA_MEDIA_SUBTYPE_amr:
return spa_format_audio_amr_build(builder, id, &info->info.amr);
case SPA_MEDIA_SUBTYPE_alac:
return spa_format_audio_alac_build(builder, id, &info->info.alac);
case SPA_MEDIA_SUBTYPE_flac:
return spa_format_audio_flac_build(builder, id, &info->info.flac);
case SPA_MEDIA_SUBTYPE_ape:
return spa_format_audio_ape_build(builder, id, &info->info.ape);
}
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
errno = ENOTSUP;
return NULL;
}
/**
* \}
*/

View File

@ -36,8 +36,18 @@ extern "C" {
#include <spa/param/format.h>
#include <spa/param/audio/raw.h>
#include <spa/param/audio/dsp.h>
#include <spa/param/audio/iec958.h>
#include <spa/param/audio/dsd.h>
#include <spa/param/audio/mp3.h>
#include <spa/param/audio/aac.h>
#include <spa/param/audio/vorbis.h>
#include <spa/param/audio/wma.h>
#include <spa/param/audio/ra.h>
#include <spa/param/audio/amr.h>
#include <spa/param/audio/alac.h>
#include <spa/param/audio/flac.h>
#include <spa/param/audio/ape.h>
struct spa_audio_info {
uint32_t media_type;
@ -47,6 +57,15 @@ struct spa_audio_info {
struct spa_audio_info_dsp dsp;
struct spa_audio_info_iec958 iec958;
struct spa_audio_info_dsd dsd;
struct spa_audio_info_mp3 mp3;
struct spa_audio_info_aac aac;
struct spa_audio_info_vorbis vorbis;
struct spa_audio_info_wma wma;
struct spa_audio_info_ra ra;
struct spa_audio_info_amr amr;
struct spa_audio_info_alac alac;
struct spa_audio_info_flac flac;
struct spa_audio_info_ape ape;
} info;
};

View File

@ -0,0 +1,59 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_IEC958_TYPES_H
#define SPA_AUDIO_IEC958_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/utils/type.h>
#include <spa/param/audio/iec958.h>
#define SPA_TYPE_INFO_AudioIEC958Codec SPA_TYPE_INFO_ENUM_BASE "AudioIEC958Codec"
#define SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE SPA_TYPE_INFO_AudioIEC958Codec ":"
static const struct spa_type_info spa_type_audio_iec958_codec[] = {
{ SPA_AUDIO_IEC958_CODEC_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_IEC958_CODEC_PCM, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "PCM", NULL },
{ SPA_AUDIO_IEC958_CODEC_DTS, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "DTS", NULL },
{ SPA_AUDIO_IEC958_CODEC_AC3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "AC3", NULL },
{ SPA_AUDIO_IEC958_CODEC_MPEG, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "MPEG", NULL },
{ SPA_AUDIO_IEC958_CODEC_MPEG2_AAC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "MPEG2-AAC", NULL },
{ SPA_AUDIO_IEC958_CODEC_EAC3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "EAC3", NULL },
{ SPA_AUDIO_IEC958_CODEC_TRUEHD, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "TrueHD", NULL },
{ SPA_AUDIO_IEC958_CODEC_DTSHD, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "DTS-HD", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_RAW_IEC958_TYPES_H */

View File

@ -0,0 +1,79 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_IEC958_UTILS_H
#define SPA_AUDIO_IEC958_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_iec958_parse(const struct spa_pod *format, struct spa_audio_info_iec958 *info)
{
int res;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_OPT_Id(&info->codec),
SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate));
return res;
}
static inline struct spa_pod *
spa_format_audio_iec958_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_iec958 *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_iec958),
0);
if (info->codec != SPA_AUDIO_IEC958_CODEC_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_iec958Codec, SPA_POD_Id(info->codec), 0);
if (info->rate != 0)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_rate, SPA_POD_Int(info->rate), 0);
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_IEC958_UTILS_H */

View File

@ -56,7 +56,7 @@ struct spa_audio_info_iec958 {
uint32_t rate; /*< sample rate */
};
#define SPA_AUDIO_INFO_IEC958_INIT(...) (struct spa_audio_info_iec958) { __VA_ARGS__ }
#define SPA_AUDIO_INFO_IEC958_INIT(...) ((struct spa_audio_info_iec958) { __VA_ARGS__ })
/**
* \}

View File

@ -0,0 +1,54 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_MP3_TYPES_H
#define SPA_AUDIO_MP3_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/utils/type.h>
#include <spa/param/audio/mp3.h>
#define SPA_TYPE_INFO_AudioMP3ChannelMode SPA_TYPE_INFO_ENUM_BASE "AudioMP3ChannelMode"
#define SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE SPA_TYPE_INFO_AudioMP3ChannelMode ":"
static const struct spa_type_info spa_type_audio_mp3_channel_mode[] = {
{ SPA_AUDIO_MP3_CHANNEL_MODE_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_MP3_CHANNEL_MODE_MONO, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE "Mono", NULL },
{ SPA_AUDIO_MP3_CHANNEL_MODE_STEREO, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE "Stereo", NULL },
{ SPA_AUDIO_MP3_CHANNEL_MODE_JOINTSTEREO, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE "Joint-stereo", NULL },
{ SPA_AUDIO_MP3_CHANNEL_MODE_DUAL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_MP3_CHANNEL_MODE_BASE "Dual", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_MP3_TYPES_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_MP3_UTILS_H
#define SPA_AUDIO_MP3_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_mp3_parse(const struct spa_pod *format, struct spa_audio_info_mp3 *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;
}
static inline struct spa_pod *
spa_format_audio_mp3_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_mp3 *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_mp3),
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_MP3_UTILS_H */

View File

@ -0,0 +1,57 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_MP3_H
#define SPA_AUDIO_MP3_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
enum spa_audio_mp3_channel_mode {
SPA_AUDIO_MP3_CHANNEL_MODE_UNKNOWN,
SPA_AUDIO_MP3_CHANNEL_MODE_MONO,
SPA_AUDIO_MP3_CHANNEL_MODE_STEREO,
SPA_AUDIO_MP3_CHANNEL_MODE_JOINTSTEREO,
SPA_AUDIO_MP3_CHANNEL_MODE_DUAL,
};
struct spa_audio_info_mp3 {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
#define SPA_AUDIO_INFO_MP3_INIT(...) ((struct spa_audio_info_mp3) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_MP3_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_RA_UTILS_H
#define SPA_AUDIO_RA_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_ra_parse(const struct spa_pod *format, struct spa_audio_info_ra *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;
}
static inline struct spa_pod *
spa_format_audio_ra_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_ra *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_ra),
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_RA_UTILS_H */

View File

@ -0,0 +1,49 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_RA_H
#define SPA_AUDIO_RA_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
struct spa_audio_info_ra {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
#define SPA_AUDIO_INFO_RA_INIT(...) ((struct spa_audio_info_ra) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_RA_H */

View File

@ -0,0 +1,278 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_RAW_TYPES_H
#define SPA_AUDIO_RAW_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/utils/type.h>
#include <spa/param/audio/raw.h>
#define SPA_TYPE_INFO_AudioFormat SPA_TYPE_INFO_ENUM_BASE "AudioFormat"
#define SPA_TYPE_INFO_AUDIO_FORMAT_BASE SPA_TYPE_INFO_AudioFormat ":"
static const struct spa_type_info spa_type_audio_format[] = {
{ SPA_AUDIO_FORMAT_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_FORMAT_ENCODED, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ENCODED", NULL },
{ SPA_AUDIO_FORMAT_S8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S8", NULL },
{ SPA_AUDIO_FORMAT_U8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U8", NULL },
{ SPA_AUDIO_FORMAT_S16_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16LE", NULL },
{ SPA_AUDIO_FORMAT_S16_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16BE", NULL },
{ SPA_AUDIO_FORMAT_U16_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16LE", NULL },
{ SPA_AUDIO_FORMAT_U16_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16BE", NULL },
{ SPA_AUDIO_FORMAT_S24_32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32LE", NULL },
{ SPA_AUDIO_FORMAT_S24_32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32BE", NULL },
{ SPA_AUDIO_FORMAT_U24_32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32LE", NULL },
{ SPA_AUDIO_FORMAT_U24_32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32BE", NULL },
{ SPA_AUDIO_FORMAT_S32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32LE", NULL },
{ SPA_AUDIO_FORMAT_S32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32BE", NULL },
{ SPA_AUDIO_FORMAT_U32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32LE", NULL },
{ SPA_AUDIO_FORMAT_U32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32BE", NULL },
{ SPA_AUDIO_FORMAT_S24_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24LE", NULL },
{ SPA_AUDIO_FORMAT_S24_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24BE", NULL },
{ SPA_AUDIO_FORMAT_U24_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24LE", NULL },
{ SPA_AUDIO_FORMAT_U24_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24BE", NULL },
{ SPA_AUDIO_FORMAT_S20_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20LE", NULL },
{ SPA_AUDIO_FORMAT_S20_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20BE", NULL },
{ SPA_AUDIO_FORMAT_U20_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20LE", NULL },
{ SPA_AUDIO_FORMAT_U20_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20BE", NULL },
{ SPA_AUDIO_FORMAT_S18_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18LE", NULL },
{ SPA_AUDIO_FORMAT_S18_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18BE", NULL },
{ SPA_AUDIO_FORMAT_U18_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18LE", NULL },
{ SPA_AUDIO_FORMAT_U18_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18BE", NULL },
{ SPA_AUDIO_FORMAT_F32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32LE", NULL },
{ SPA_AUDIO_FORMAT_F32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32BE", NULL },
{ SPA_AUDIO_FORMAT_F64_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64LE", NULL },
{ SPA_AUDIO_FORMAT_F64_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64BE", NULL },
{ SPA_AUDIO_FORMAT_ULAW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ULAW", NULL },
{ SPA_AUDIO_FORMAT_ALAW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ALAW", NULL },
{ SPA_AUDIO_FORMAT_U8P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U8P", NULL },
{ SPA_AUDIO_FORMAT_S16P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16P", NULL },
{ SPA_AUDIO_FORMAT_S24_32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32P", NULL },
{ SPA_AUDIO_FORMAT_S32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32P", NULL },
{ SPA_AUDIO_FORMAT_S24P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24P", NULL },
{ SPA_AUDIO_FORMAT_F32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32P", NULL },
{ SPA_AUDIO_FORMAT_F64P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64P", NULL },
{ SPA_AUDIO_FORMAT_S8P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S8P", NULL },
#if __BYTE_ORDER == __BIG_ENDIAN
{ SPA_AUDIO_FORMAT_S16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16OE", NULL },
{ SPA_AUDIO_FORMAT_S16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16", NULL },
{ SPA_AUDIO_FORMAT_U16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16OE", NULL },
{ SPA_AUDIO_FORMAT_U16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16", NULL },
{ SPA_AUDIO_FORMAT_S24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32OE", NULL },
{ SPA_AUDIO_FORMAT_S24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32", NULL },
{ SPA_AUDIO_FORMAT_U24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32OE", NULL },
{ SPA_AUDIO_FORMAT_U24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32", NULL },
{ SPA_AUDIO_FORMAT_S32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32OE", NULL },
{ SPA_AUDIO_FORMAT_S32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32", NULL },
{ SPA_AUDIO_FORMAT_U32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32OE", NULL },
{ SPA_AUDIO_FORMAT_U32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32", NULL },
{ SPA_AUDIO_FORMAT_S24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24OE", NULL },
{ SPA_AUDIO_FORMAT_S24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24", NULL },
{ SPA_AUDIO_FORMAT_U24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24OE", NULL },
{ SPA_AUDIO_FORMAT_U24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24", NULL },
{ SPA_AUDIO_FORMAT_S20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20OE", NULL },
{ SPA_AUDIO_FORMAT_S20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20", NULL },
{ SPA_AUDIO_FORMAT_U20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20OE", NULL },
{ SPA_AUDIO_FORMAT_U20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20", NULL },
{ SPA_AUDIO_FORMAT_S18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18OE", NULL },
{ SPA_AUDIO_FORMAT_S18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18", NULL },
{ SPA_AUDIO_FORMAT_U18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18OE", NULL },
{ SPA_AUDIO_FORMAT_U18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18", NULL },
{ SPA_AUDIO_FORMAT_F32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32OE", NULL },
{ SPA_AUDIO_FORMAT_F32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32", NULL },
{ SPA_AUDIO_FORMAT_F64_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64OE", NULL },
{ SPA_AUDIO_FORMAT_F64, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64", NULL },
#elif __BYTE_ORDER == __LITTLE_ENDIAN
{ SPA_AUDIO_FORMAT_S16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16", NULL },
{ SPA_AUDIO_FORMAT_S16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16OE", NULL },
{ SPA_AUDIO_FORMAT_U16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16", NULL },
{ SPA_AUDIO_FORMAT_U16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16OE", NULL },
{ SPA_AUDIO_FORMAT_S24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32", NULL },
{ SPA_AUDIO_FORMAT_S24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32OE", NULL },
{ SPA_AUDIO_FORMAT_U24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32", NULL },
{ SPA_AUDIO_FORMAT_U24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32OE", NULL },
{ SPA_AUDIO_FORMAT_S32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32", NULL },
{ SPA_AUDIO_FORMAT_S32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32OE", NULL },
{ SPA_AUDIO_FORMAT_U32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32", NULL },
{ SPA_AUDIO_FORMAT_U32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32OE", NULL },
{ SPA_AUDIO_FORMAT_S24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24", NULL },
{ SPA_AUDIO_FORMAT_S24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24OE", NULL },
{ SPA_AUDIO_FORMAT_U24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24", NULL },
{ SPA_AUDIO_FORMAT_U24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24OE", NULL },
{ SPA_AUDIO_FORMAT_S20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20", NULL },
{ SPA_AUDIO_FORMAT_S20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20OE", NULL },
{ SPA_AUDIO_FORMAT_U20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20", NULL },
{ SPA_AUDIO_FORMAT_U20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20OE", NULL },
{ SPA_AUDIO_FORMAT_S18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18", NULL },
{ SPA_AUDIO_FORMAT_S18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18OE", NULL },
{ SPA_AUDIO_FORMAT_U18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18", NULL },
{ SPA_AUDIO_FORMAT_U18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18OE", NULL },
{ SPA_AUDIO_FORMAT_F32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32", NULL },
{ SPA_AUDIO_FORMAT_F32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32OE", NULL },
{ SPA_AUDIO_FORMAT_F64, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64", NULL },
{ SPA_AUDIO_FORMAT_F64_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64OE", NULL },
#endif
{ 0, 0, NULL, NULL },
};
#define SPA_TYPE_INFO_AudioFlags SPA_TYPE_INFO_FLAGS_BASE "AudioFlags"
#define SPA_TYPE_INFO_AUDIO_FLAGS_BASE SPA_TYPE_INFO_AudioFlags ":"
static const struct spa_type_info spa_type_audio_flags[] = {
{ SPA_AUDIO_FLAG_NONE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FLAGS_BASE "none", NULL },
{ SPA_AUDIO_FLAG_UNPOSITIONED, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FLAGS_BASE "unpositioned", NULL },
{ 0, 0, NULL, NULL },
};
#define SPA_TYPE_INFO_AudioChannel SPA_TYPE_INFO_ENUM_BASE "AudioChannel"
#define SPA_TYPE_INFO_AUDIO_CHANNEL_BASE SPA_TYPE_INFO_AudioChannel ":"
static const struct spa_type_info spa_type_audio_channel[] = {
{ SPA_AUDIO_CHANNEL_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "UNK", NULL },
{ SPA_AUDIO_CHANNEL_NA, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "NA", NULL },
{ SPA_AUDIO_CHANNEL_MONO, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "MONO", NULL },
{ SPA_AUDIO_CHANNEL_FL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FL", NULL },
{ SPA_AUDIO_CHANNEL_FR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FR", NULL },
{ SPA_AUDIO_CHANNEL_FC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FC", NULL },
{ SPA_AUDIO_CHANNEL_LFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LFE", NULL },
{ SPA_AUDIO_CHANNEL_SL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "SL", NULL },
{ SPA_AUDIO_CHANNEL_SR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "SR", NULL },
{ SPA_AUDIO_CHANNEL_FLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLC", NULL },
{ SPA_AUDIO_CHANNEL_FRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRC", NULL },
{ SPA_AUDIO_CHANNEL_RC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RC", NULL },
{ SPA_AUDIO_CHANNEL_RL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RL", NULL },
{ SPA_AUDIO_CHANNEL_RR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RR", NULL },
{ SPA_AUDIO_CHANNEL_TC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TC", NULL },
{ SPA_AUDIO_CHANNEL_TFL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFL", NULL },
{ SPA_AUDIO_CHANNEL_TFC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFC", NULL },
{ SPA_AUDIO_CHANNEL_TFR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFR", NULL },
{ SPA_AUDIO_CHANNEL_TRL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRL", NULL },
{ SPA_AUDIO_CHANNEL_TRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRC", NULL },
{ SPA_AUDIO_CHANNEL_TRR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRR", NULL },
{ SPA_AUDIO_CHANNEL_RLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RLC", NULL },
{ SPA_AUDIO_CHANNEL_RRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RRC", NULL },
{ SPA_AUDIO_CHANNEL_FLW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLW", NULL },
{ SPA_AUDIO_CHANNEL_FRW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRW", NULL },
{ SPA_AUDIO_CHANNEL_LFE2, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LFE2", NULL },
{ SPA_AUDIO_CHANNEL_FLH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLH", NULL },
{ SPA_AUDIO_CHANNEL_FCH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FCH", NULL },
{ SPA_AUDIO_CHANNEL_FRH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRH", NULL },
{ SPA_AUDIO_CHANNEL_TFLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFLC", NULL },
{ SPA_AUDIO_CHANNEL_TFRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFRC", NULL },
{ SPA_AUDIO_CHANNEL_TSL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TSL", NULL },
{ SPA_AUDIO_CHANNEL_TSR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TSR", NULL },
{ SPA_AUDIO_CHANNEL_LLFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LLFR", NULL },
{ SPA_AUDIO_CHANNEL_RLFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RLFE", NULL },
{ SPA_AUDIO_CHANNEL_BC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BC", NULL },
{ SPA_AUDIO_CHANNEL_BLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BLC", NULL },
{ SPA_AUDIO_CHANNEL_BRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BRC", NULL },
{ SPA_AUDIO_CHANNEL_AUX0, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX0", NULL },
{ SPA_AUDIO_CHANNEL_AUX1, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX1", NULL },
{ SPA_AUDIO_CHANNEL_AUX2, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX2", NULL },
{ SPA_AUDIO_CHANNEL_AUX3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX3", NULL },
{ SPA_AUDIO_CHANNEL_AUX4, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX4", NULL },
{ SPA_AUDIO_CHANNEL_AUX5, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX5", NULL },
{ SPA_AUDIO_CHANNEL_AUX6, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX6", NULL },
{ SPA_AUDIO_CHANNEL_AUX7, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX7", NULL },
{ SPA_AUDIO_CHANNEL_AUX8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX8", NULL },
{ SPA_AUDIO_CHANNEL_AUX9, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX9", NULL },
{ SPA_AUDIO_CHANNEL_AUX10, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX10", NULL },
{ SPA_AUDIO_CHANNEL_AUX11, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX11", NULL },
{ SPA_AUDIO_CHANNEL_AUX12, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX12", NULL },
{ SPA_AUDIO_CHANNEL_AUX13, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX13", NULL },
{ SPA_AUDIO_CHANNEL_AUX14, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX14", NULL },
{ SPA_AUDIO_CHANNEL_AUX15, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX15", NULL },
{ SPA_AUDIO_CHANNEL_AUX16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX16", NULL },
{ SPA_AUDIO_CHANNEL_AUX17, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX17", NULL },
{ SPA_AUDIO_CHANNEL_AUX18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX18", NULL },
{ SPA_AUDIO_CHANNEL_AUX19, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX19", NULL },
{ SPA_AUDIO_CHANNEL_AUX20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX20", NULL },
{ SPA_AUDIO_CHANNEL_AUX21, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX21", NULL },
{ SPA_AUDIO_CHANNEL_AUX22, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX22", NULL },
{ SPA_AUDIO_CHANNEL_AUX23, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX23", NULL },
{ SPA_AUDIO_CHANNEL_AUX24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX24", NULL },
{ SPA_AUDIO_CHANNEL_AUX25, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX25", NULL },
{ SPA_AUDIO_CHANNEL_AUX26, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX26", NULL },
{ SPA_AUDIO_CHANNEL_AUX27, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX27", NULL },
{ SPA_AUDIO_CHANNEL_AUX28, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX28", NULL },
{ SPA_AUDIO_CHANNEL_AUX29, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX29", NULL },
{ SPA_AUDIO_CHANNEL_AUX30, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX30", NULL },
{ SPA_AUDIO_CHANNEL_AUX31, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX31", NULL },
{ SPA_AUDIO_CHANNEL_AUX32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX32", NULL },
{ SPA_AUDIO_CHANNEL_AUX33, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX33", NULL },
{ SPA_AUDIO_CHANNEL_AUX34, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX34", NULL },
{ SPA_AUDIO_CHANNEL_AUX35, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX35", NULL },
{ SPA_AUDIO_CHANNEL_AUX36, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX36", NULL },
{ SPA_AUDIO_CHANNEL_AUX37, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX37", NULL },
{ SPA_AUDIO_CHANNEL_AUX38, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX38", NULL },
{ SPA_AUDIO_CHANNEL_AUX39, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX39", NULL },
{ SPA_AUDIO_CHANNEL_AUX40, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX40", NULL },
{ SPA_AUDIO_CHANNEL_AUX41, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX41", NULL },
{ SPA_AUDIO_CHANNEL_AUX42, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX42", NULL },
{ SPA_AUDIO_CHANNEL_AUX43, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX43", NULL },
{ SPA_AUDIO_CHANNEL_AUX44, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX44", NULL },
{ SPA_AUDIO_CHANNEL_AUX45, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX45", NULL },
{ SPA_AUDIO_CHANNEL_AUX46, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX46", NULL },
{ SPA_AUDIO_CHANNEL_AUX47, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX47", NULL },
{ SPA_AUDIO_CHANNEL_AUX48, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX48", NULL },
{ SPA_AUDIO_CHANNEL_AUX49, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX49", NULL },
{ SPA_AUDIO_CHANNEL_AUX50, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX50", NULL },
{ SPA_AUDIO_CHANNEL_AUX51, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX51", NULL },
{ SPA_AUDIO_CHANNEL_AUX52, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX52", NULL },
{ SPA_AUDIO_CHANNEL_AUX53, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX53", NULL },
{ SPA_AUDIO_CHANNEL_AUX54, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX54", NULL },
{ SPA_AUDIO_CHANNEL_AUX55, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX55", NULL },
{ SPA_AUDIO_CHANNEL_AUX56, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX56", NULL },
{ SPA_AUDIO_CHANNEL_AUX57, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX57", NULL },
{ SPA_AUDIO_CHANNEL_AUX58, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX58", NULL },
{ SPA_AUDIO_CHANNEL_AUX59, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX59", NULL },
{ SPA_AUDIO_CHANNEL_AUX60, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX60", NULL },
{ SPA_AUDIO_CHANNEL_AUX61, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX61", NULL },
{ SPA_AUDIO_CHANNEL_AUX62, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX62", NULL },
{ SPA_AUDIO_CHANNEL_AUX63, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX63", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_RAW_RAW_TYPES_H */

View File

@ -0,0 +1,96 @@
/* Simple Plugin API
*
* Copyright © 2018 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_RAW_UTILS_H
#define SPA_AUDIO_RAW_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_raw_parse(const struct spa_pod *format, struct spa_audio_info_raw *info)
{
struct spa_pod *position = NULL;
int res;
info->flags = 0;
res = spa_pod_parse_object(format,
SPA_TYPE_OBJECT_Format, NULL,
SPA_FORMAT_AUDIO_format, SPA_POD_OPT_Id(&info->format),
SPA_FORMAT_AUDIO_rate, SPA_POD_OPT_Int(&info->rate),
SPA_FORMAT_AUDIO_channels, SPA_POD_OPT_Int(&info->channels),
SPA_FORMAT_AUDIO_position, SPA_POD_OPT_Pod(&position));
if (position == NULL ||
!spa_pod_copy_array(position, SPA_TYPE_Id, info->position, SPA_AUDIO_MAX_CHANNELS))
SPA_FLAG_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED);
return res;
}
static inline struct spa_pod *
spa_format_audio_raw_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_raw *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_raw),
0);
if (info->format != SPA_AUDIO_FORMAT_UNKNOWN)
spa_pod_builder_add(builder,
SPA_FORMAT_AUDIO_format, SPA_POD_Id(info->format), 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);
if (!SPA_FLAG_IS_SET(info->flags, SPA_AUDIO_FLAG_UNPOSITIONED)) {
spa_pod_builder_add(builder, SPA_FORMAT_AUDIO_position,
SPA_POD_Array(sizeof(uint32_t), SPA_TYPE_Id,
info->channels, info->position), 0);
}
}
return (struct spa_pod*)spa_pod_builder_pop(builder, &f);
}
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_RAW_UTILS_H */

View File

@ -294,7 +294,7 @@ struct spa_audio_info_raw {
uint32_t position[SPA_AUDIO_MAX_CHANNELS]; /*< channel position from enum spa_audio_channel */
};
#define SPA_AUDIO_INFO_RAW_INIT(...) (struct spa_audio_info_raw) { __VA_ARGS__ }
#define SPA_AUDIO_INFO_RAW_INIT(...) ((struct spa_audio_info_raw) { __VA_ARGS__ })
#define SPA_KEY_AUDIO_FORMAT "audio.format" /**< an audio format as string,
* Ex. "S16LE" */
@ -306,13 +306,6 @@ struct spa_audio_info_raw {
* of channels ex. "FL,FR" */
#define SPA_KEY_AUDIO_ALLOWED_RATES "audio.allowed-rates" /**< a list of allowed samplerates
* ex. "[ 44100 48000 ]" */
struct spa_audio_info_dsp {
enum spa_audio_format format; /*< format, one of the DSP formats in enum spa_audio_format_dsp */
};
#define SPA_AUDIO_INFO_DSP_INIT(...) (struct spa_audio_info_dsp) { __VA_ARGS__ }
/**
* \}
*/

View File

@ -25,272 +25,11 @@
#ifndef SPA_AUDIO_TYPES_H
#define SPA_AUDIO_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw-types.h>
#include <spa/param/audio/iec958-types.h>
#include <spa/param/audio/mp3-types.h>
#include <spa/param/audio/aac-types.h>
#include <spa/param/audio/wma-types.h>
#include <spa/param/audio/amr-types.h>
/**
* \addtogroup spa_param
* \{
*/
#include <spa/param/audio/raw.h>
#define SPA_TYPE_INFO_AudioFormat SPA_TYPE_INFO_ENUM_BASE "AudioFormat"
#define SPA_TYPE_INFO_AUDIO_FORMAT_BASE SPA_TYPE_INFO_AudioFormat ":"
static const struct spa_type_info spa_type_audio_format[] = {
{ SPA_AUDIO_FORMAT_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_FORMAT_ENCODED, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ENCODED", NULL },
{ SPA_AUDIO_FORMAT_S8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S8", NULL },
{ SPA_AUDIO_FORMAT_U8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U8", NULL },
{ SPA_AUDIO_FORMAT_S16_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16LE", NULL },
{ SPA_AUDIO_FORMAT_S16_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16BE", NULL },
{ SPA_AUDIO_FORMAT_U16_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16LE", NULL },
{ SPA_AUDIO_FORMAT_U16_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16BE", NULL },
{ SPA_AUDIO_FORMAT_S24_32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32LE", NULL },
{ SPA_AUDIO_FORMAT_S24_32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32BE", NULL },
{ SPA_AUDIO_FORMAT_U24_32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32LE", NULL },
{ SPA_AUDIO_FORMAT_U24_32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32BE", NULL },
{ SPA_AUDIO_FORMAT_S32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32LE", NULL },
{ SPA_AUDIO_FORMAT_S32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32BE", NULL },
{ SPA_AUDIO_FORMAT_U32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32LE", NULL },
{ SPA_AUDIO_FORMAT_U32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32BE", NULL },
{ SPA_AUDIO_FORMAT_S24_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24LE", NULL },
{ SPA_AUDIO_FORMAT_S24_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24BE", NULL },
{ SPA_AUDIO_FORMAT_U24_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24LE", NULL },
{ SPA_AUDIO_FORMAT_U24_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24BE", NULL },
{ SPA_AUDIO_FORMAT_S20_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20LE", NULL },
{ SPA_AUDIO_FORMAT_S20_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20BE", NULL },
{ SPA_AUDIO_FORMAT_U20_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20LE", NULL },
{ SPA_AUDIO_FORMAT_U20_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20BE", NULL },
{ SPA_AUDIO_FORMAT_S18_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18LE", NULL },
{ SPA_AUDIO_FORMAT_S18_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18BE", NULL },
{ SPA_AUDIO_FORMAT_U18_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18LE", NULL },
{ SPA_AUDIO_FORMAT_U18_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18BE", NULL },
{ SPA_AUDIO_FORMAT_F32_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32LE", NULL },
{ SPA_AUDIO_FORMAT_F32_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32BE", NULL },
{ SPA_AUDIO_FORMAT_F64_LE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64LE", NULL },
{ SPA_AUDIO_FORMAT_F64_BE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64BE", NULL },
{ SPA_AUDIO_FORMAT_ULAW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ULAW", NULL },
{ SPA_AUDIO_FORMAT_ALAW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "ALAW", NULL },
{ SPA_AUDIO_FORMAT_U8P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U8P", NULL },
{ SPA_AUDIO_FORMAT_S16P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16P", NULL },
{ SPA_AUDIO_FORMAT_S24_32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32P", NULL },
{ SPA_AUDIO_FORMAT_S32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32P", NULL },
{ SPA_AUDIO_FORMAT_S24P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24P", NULL },
{ SPA_AUDIO_FORMAT_F32P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32P", NULL },
{ SPA_AUDIO_FORMAT_F64P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64P", NULL },
{ SPA_AUDIO_FORMAT_S8P, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S8P", NULL },
#if __BYTE_ORDER == __BIG_ENDIAN
{ SPA_AUDIO_FORMAT_S16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16OE", NULL },
{ SPA_AUDIO_FORMAT_S16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16", NULL },
{ SPA_AUDIO_FORMAT_U16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16OE", NULL },
{ SPA_AUDIO_FORMAT_U16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16", NULL },
{ SPA_AUDIO_FORMAT_S24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32OE", NULL },
{ SPA_AUDIO_FORMAT_S24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32", NULL },
{ SPA_AUDIO_FORMAT_U24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32OE", NULL },
{ SPA_AUDIO_FORMAT_U24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32", NULL },
{ SPA_AUDIO_FORMAT_S32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32OE", NULL },
{ SPA_AUDIO_FORMAT_S32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32", NULL },
{ SPA_AUDIO_FORMAT_U32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32OE", NULL },
{ SPA_AUDIO_FORMAT_U32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32", NULL },
{ SPA_AUDIO_FORMAT_S24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24OE", NULL },
{ SPA_AUDIO_FORMAT_S24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24", NULL },
{ SPA_AUDIO_FORMAT_U24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24OE", NULL },
{ SPA_AUDIO_FORMAT_U24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24", NULL },
{ SPA_AUDIO_FORMAT_S20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20OE", NULL },
{ SPA_AUDIO_FORMAT_S20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20", NULL },
{ SPA_AUDIO_FORMAT_U20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20OE", NULL },
{ SPA_AUDIO_FORMAT_U20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20", NULL },
{ SPA_AUDIO_FORMAT_S18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18OE", NULL },
{ SPA_AUDIO_FORMAT_S18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18", NULL },
{ SPA_AUDIO_FORMAT_U18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18OE", NULL },
{ SPA_AUDIO_FORMAT_U18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18", NULL },
{ SPA_AUDIO_FORMAT_F32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32OE", NULL },
{ SPA_AUDIO_FORMAT_F32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32", NULL },
{ SPA_AUDIO_FORMAT_F64_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64OE", NULL },
{ SPA_AUDIO_FORMAT_F64, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64", NULL },
#elif __BYTE_ORDER == __LITTLE_ENDIAN
{ SPA_AUDIO_FORMAT_S16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16", NULL },
{ SPA_AUDIO_FORMAT_S16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S16OE", NULL },
{ SPA_AUDIO_FORMAT_U16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16", NULL },
{ SPA_AUDIO_FORMAT_U16_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U16OE", NULL },
{ SPA_AUDIO_FORMAT_S24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32", NULL },
{ SPA_AUDIO_FORMAT_S24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24_32OE", NULL },
{ SPA_AUDIO_FORMAT_U24_32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32", NULL },
{ SPA_AUDIO_FORMAT_U24_32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24_32OE", NULL },
{ SPA_AUDIO_FORMAT_S32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32", NULL },
{ SPA_AUDIO_FORMAT_S32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S32OE", NULL },
{ SPA_AUDIO_FORMAT_U32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32", NULL },
{ SPA_AUDIO_FORMAT_U32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U32OE", NULL },
{ SPA_AUDIO_FORMAT_S24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24", NULL },
{ SPA_AUDIO_FORMAT_S24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S24OE", NULL },
{ SPA_AUDIO_FORMAT_U24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24", NULL },
{ SPA_AUDIO_FORMAT_U24_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U24OE", NULL },
{ SPA_AUDIO_FORMAT_S20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20", NULL },
{ SPA_AUDIO_FORMAT_S20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S20OE", NULL },
{ SPA_AUDIO_FORMAT_U20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20", NULL },
{ SPA_AUDIO_FORMAT_U20_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U20OE", NULL },
{ SPA_AUDIO_FORMAT_S18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18", NULL },
{ SPA_AUDIO_FORMAT_S18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "S18OE", NULL },
{ SPA_AUDIO_FORMAT_U18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18", NULL },
{ SPA_AUDIO_FORMAT_U18_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "U18OE", NULL },
{ SPA_AUDIO_FORMAT_F32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32", NULL },
{ SPA_AUDIO_FORMAT_F32_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F32OE", NULL },
{ SPA_AUDIO_FORMAT_F64, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64", NULL },
{ SPA_AUDIO_FORMAT_F64_OE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FORMAT_BASE "F64OE", NULL },
#endif
{ 0, 0, NULL, NULL },
};
#define SPA_TYPE_INFO_AudioFlags SPA_TYPE_INFO_FLAGS_BASE "AudioFlags"
#define SPA_TYPE_INFO_AUDIO_FLAGS_BASE SPA_TYPE_INFO_AudioFlags ":"
static const struct spa_type_info spa_type_audio_flags[] = {
{ SPA_AUDIO_FLAG_NONE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FLAGS_BASE "none", NULL },
{ SPA_AUDIO_FLAG_UNPOSITIONED, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_FLAGS_BASE "unpositioned", NULL },
{ 0, 0, NULL, NULL },
};
#define SPA_TYPE_INFO_AudioChannel SPA_TYPE_INFO_ENUM_BASE "AudioChannel"
#define SPA_TYPE_INFO_AUDIO_CHANNEL_BASE SPA_TYPE_INFO_AudioChannel ":"
static const struct spa_type_info spa_type_audio_channel[] = {
{ SPA_AUDIO_CHANNEL_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "UNK", NULL },
{ SPA_AUDIO_CHANNEL_NA, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "NA", NULL },
{ SPA_AUDIO_CHANNEL_MONO, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "MONO", NULL },
{ SPA_AUDIO_CHANNEL_FL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FL", NULL },
{ SPA_AUDIO_CHANNEL_FR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FR", NULL },
{ SPA_AUDIO_CHANNEL_FC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FC", NULL },
{ SPA_AUDIO_CHANNEL_LFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LFE", NULL },
{ SPA_AUDIO_CHANNEL_SL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "SL", NULL },
{ SPA_AUDIO_CHANNEL_SR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "SR", NULL },
{ SPA_AUDIO_CHANNEL_FLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLC", NULL },
{ SPA_AUDIO_CHANNEL_FRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRC", NULL },
{ SPA_AUDIO_CHANNEL_RC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RC", NULL },
{ SPA_AUDIO_CHANNEL_RL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RL", NULL },
{ SPA_AUDIO_CHANNEL_RR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RR", NULL },
{ SPA_AUDIO_CHANNEL_TC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TC", NULL },
{ SPA_AUDIO_CHANNEL_TFL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFL", NULL },
{ SPA_AUDIO_CHANNEL_TFC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFC", NULL },
{ SPA_AUDIO_CHANNEL_TFR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFR", NULL },
{ SPA_AUDIO_CHANNEL_TRL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRL", NULL },
{ SPA_AUDIO_CHANNEL_TRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRC", NULL },
{ SPA_AUDIO_CHANNEL_TRR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TRR", NULL },
{ SPA_AUDIO_CHANNEL_RLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RLC", NULL },
{ SPA_AUDIO_CHANNEL_RRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RRC", NULL },
{ SPA_AUDIO_CHANNEL_FLW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLW", NULL },
{ SPA_AUDIO_CHANNEL_FRW, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRW", NULL },
{ SPA_AUDIO_CHANNEL_LFE2, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LFE2", NULL },
{ SPA_AUDIO_CHANNEL_FLH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FLH", NULL },
{ SPA_AUDIO_CHANNEL_FCH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FCH", NULL },
{ SPA_AUDIO_CHANNEL_FRH, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "FRH", NULL },
{ SPA_AUDIO_CHANNEL_TFLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFLC", NULL },
{ SPA_AUDIO_CHANNEL_TFRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TFRC", NULL },
{ SPA_AUDIO_CHANNEL_TSL, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TSL", NULL },
{ SPA_AUDIO_CHANNEL_TSR, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "TSR", NULL },
{ SPA_AUDIO_CHANNEL_LLFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "LLFR", NULL },
{ SPA_AUDIO_CHANNEL_RLFE, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "RLFE", NULL },
{ SPA_AUDIO_CHANNEL_BC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BC", NULL },
{ SPA_AUDIO_CHANNEL_BLC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BLC", NULL },
{ SPA_AUDIO_CHANNEL_BRC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "BRC", NULL },
{ SPA_AUDIO_CHANNEL_AUX0, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX0", NULL },
{ SPA_AUDIO_CHANNEL_AUX1, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX1", NULL },
{ SPA_AUDIO_CHANNEL_AUX2, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX2", NULL },
{ SPA_AUDIO_CHANNEL_AUX3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX3", NULL },
{ SPA_AUDIO_CHANNEL_AUX4, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX4", NULL },
{ SPA_AUDIO_CHANNEL_AUX5, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX5", NULL },
{ SPA_AUDIO_CHANNEL_AUX6, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX6", NULL },
{ SPA_AUDIO_CHANNEL_AUX7, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX7", NULL },
{ SPA_AUDIO_CHANNEL_AUX8, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX8", NULL },
{ SPA_AUDIO_CHANNEL_AUX9, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX9", NULL },
{ SPA_AUDIO_CHANNEL_AUX10, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX10", NULL },
{ SPA_AUDIO_CHANNEL_AUX11, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX11", NULL },
{ SPA_AUDIO_CHANNEL_AUX12, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX12", NULL },
{ SPA_AUDIO_CHANNEL_AUX13, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX13", NULL },
{ SPA_AUDIO_CHANNEL_AUX14, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX14", NULL },
{ SPA_AUDIO_CHANNEL_AUX15, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX15", NULL },
{ SPA_AUDIO_CHANNEL_AUX16, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX16", NULL },
{ SPA_AUDIO_CHANNEL_AUX17, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX17", NULL },
{ SPA_AUDIO_CHANNEL_AUX18, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX18", NULL },
{ SPA_AUDIO_CHANNEL_AUX19, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX19", NULL },
{ SPA_AUDIO_CHANNEL_AUX20, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX20", NULL },
{ SPA_AUDIO_CHANNEL_AUX21, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX21", NULL },
{ SPA_AUDIO_CHANNEL_AUX22, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX22", NULL },
{ SPA_AUDIO_CHANNEL_AUX23, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX23", NULL },
{ SPA_AUDIO_CHANNEL_AUX24, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX24", NULL },
{ SPA_AUDIO_CHANNEL_AUX25, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX25", NULL },
{ SPA_AUDIO_CHANNEL_AUX26, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX26", NULL },
{ SPA_AUDIO_CHANNEL_AUX27, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX27", NULL },
{ SPA_AUDIO_CHANNEL_AUX28, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX28", NULL },
{ SPA_AUDIO_CHANNEL_AUX29, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX29", NULL },
{ SPA_AUDIO_CHANNEL_AUX30, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX30", NULL },
{ SPA_AUDIO_CHANNEL_AUX31, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX31", NULL },
{ SPA_AUDIO_CHANNEL_AUX32, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX32", NULL },
{ SPA_AUDIO_CHANNEL_AUX33, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX33", NULL },
{ SPA_AUDIO_CHANNEL_AUX34, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX34", NULL },
{ SPA_AUDIO_CHANNEL_AUX35, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX35", NULL },
{ SPA_AUDIO_CHANNEL_AUX36, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX36", NULL },
{ SPA_AUDIO_CHANNEL_AUX37, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX37", NULL },
{ SPA_AUDIO_CHANNEL_AUX38, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX38", NULL },
{ SPA_AUDIO_CHANNEL_AUX39, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX39", NULL },
{ SPA_AUDIO_CHANNEL_AUX40, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX40", NULL },
{ SPA_AUDIO_CHANNEL_AUX41, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX41", NULL },
{ SPA_AUDIO_CHANNEL_AUX42, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX42", NULL },
{ SPA_AUDIO_CHANNEL_AUX43, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX43", NULL },
{ SPA_AUDIO_CHANNEL_AUX44, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX44", NULL },
{ SPA_AUDIO_CHANNEL_AUX45, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX45", NULL },
{ SPA_AUDIO_CHANNEL_AUX46, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX46", NULL },
{ SPA_AUDIO_CHANNEL_AUX47, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX47", NULL },
{ SPA_AUDIO_CHANNEL_AUX48, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX48", NULL },
{ SPA_AUDIO_CHANNEL_AUX49, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX49", NULL },
{ SPA_AUDIO_CHANNEL_AUX50, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX50", NULL },
{ SPA_AUDIO_CHANNEL_AUX51, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX51", NULL },
{ SPA_AUDIO_CHANNEL_AUX52, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX52", NULL },
{ SPA_AUDIO_CHANNEL_AUX53, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX53", NULL },
{ SPA_AUDIO_CHANNEL_AUX54, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX54", NULL },
{ SPA_AUDIO_CHANNEL_AUX55, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX55", NULL },
{ SPA_AUDIO_CHANNEL_AUX56, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX56", NULL },
{ SPA_AUDIO_CHANNEL_AUX57, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX57", NULL },
{ SPA_AUDIO_CHANNEL_AUX58, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX58", NULL },
{ SPA_AUDIO_CHANNEL_AUX59, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX59", NULL },
{ SPA_AUDIO_CHANNEL_AUX60, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX60", NULL },
{ SPA_AUDIO_CHANNEL_AUX61, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX61", NULL },
{ SPA_AUDIO_CHANNEL_AUX62, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX62", NULL },
{ SPA_AUDIO_CHANNEL_AUX63, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_CHANNEL_BASE "AUX63", NULL },
{ 0, 0, NULL, NULL },
};
#include <spa/param/audio/iec958.h>
#define SPA_TYPE_INFO_AudioIEC958Codec SPA_TYPE_INFO_ENUM_BASE "AudioIEC958Codec"
#define SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE SPA_TYPE_INFO_AudioIEC958Codec ":"
static const struct spa_type_info spa_type_audio_iec958_codec[] = {
{ SPA_AUDIO_IEC958_CODEC_UNKNOWN, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "UNKNOWN", NULL },
{ SPA_AUDIO_IEC958_CODEC_PCM, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "PCM", NULL },
{ SPA_AUDIO_IEC958_CODEC_DTS, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "DTS", NULL },
{ SPA_AUDIO_IEC958_CODEC_AC3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "AC3", NULL },
{ SPA_AUDIO_IEC958_CODEC_MPEG, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "MPEG", NULL },
{ SPA_AUDIO_IEC958_CODEC_MPEG2_AAC, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "MPEG2-AAC", NULL },
{ SPA_AUDIO_IEC958_CODEC_EAC3, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "EAC3", NULL },
{ SPA_AUDIO_IEC958_CODEC_TRUEHD, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "TrueHD", NULL },
{ SPA_AUDIO_IEC958_CODEC_DTSHD, SPA_TYPE_Int, SPA_TYPE_INFO_AUDIO_IEC958_CODEC_BASE "DTS-HD", NULL },
{ 0, 0, NULL, NULL },
};
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_RAW_TYPES_H */
#endif /* SPA_AUDIO_TYPES_H */

View File

@ -0,0 +1,80 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_VORBIS_UTILS_H
#define SPA_AUDIO_VORBIS_UTILS_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* \addtogroup spa_param
* \{
*/
#include <spa/pod/parser.h>
#include <spa/pod/builder.h>
#include <spa/param/audio/format.h>
#include <spa/param/format-utils.h>
static inline int
spa_format_audio_vorbis_parse(const struct spa_pod *format, struct spa_audio_info_vorbis *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;
}
static inline struct spa_pod *
spa_format_audio_vorbis_build(struct spa_pod_builder *builder, uint32_t id, struct spa_audio_info_vorbis *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_vorbis),
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_VORBIS_UTILS_H */

View File

@ -0,0 +1,49 @@
/* Simple Plugin API
*
* Copyright © 2023 Wim Taymans
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef SPA_AUDIO_VORBIS_H
#define SPA_AUDIO_VORBIS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <spa/param/audio/raw.h>
struct spa_audio_info_vorbis {
uint32_t rate; /*< sample rate */
uint32_t channels; /*< number of channels */
};
#define SPA_AUDIO_INFO_VORBIS_INIT(...) ((struct spa_audio_info_vorbis) { __VA_ARGS__ })
/**
* \}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* SPA_AUDIO_VORBIS_H */

Some files were not shown because too many files have changed in this diff Show More