merge upstream 0.3.65
This commit is contained in:
parent
a623485b4b
commit
3339d3b690
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
770
NEWS
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
|
@ -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号: 无
|
||||
|
|
|
@ -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,
|
|
@ -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
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
Don-t-automatically-start-pipewire-for-root-logins.patch
|
||||
0002-fix-echo-cancel-module-reloading-issues.patch
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/)
|
||||
|
||||
*/
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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, ®istry_listener,
|
||||
®istry_events, NULL);
|
||||
pw_registry_add_listener(registry, ®istry_listener,
|
||||
®istry_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] */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)``,
|
||||
|
|
|
@ -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
|
||||
=======
|
||||
|
|
|
@ -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
|
||||
========
|
||||
|
|
|
@ -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*
|
||||
|
|
|
@ -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)``,
|
||||
|
|
|
@ -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)``,
|
||||
|
||||
|
|
38
meson.build
38
meson.build
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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',
|
||||
)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#ifndef PIPEWIRE_JACK_EXTENSIONS_H
|
||||
#define PIPEWIRE_JACK_EXTENSIONS_H
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -21,6 +21,7 @@ hu
|
|||
id
|
||||
it
|
||||
ja
|
||||
ka
|
||||
kk
|
||||
kn
|
||||
ko
|
||||
|
|
257
po/ca.po
257
po/ca.po
|
@ -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
354
po/cs.po
|
@ -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
445
po/gl.po
|
@ -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
112
po/hr.po
|
@ -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
519
po/hu.po
|
@ -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)"
|
||||
|
|
40
po/it.po
40
po/it.po
|
@ -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"
|
||||
|
|
|
@ -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)"
|
|
@ -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 ""
|
||||
|
|
97
po/pl.po
97
po/pl.po
|
@ -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)"
|
||||
|
|
163
po/pt_BR.po
163
po/pt_BR.po
|
@ -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
113
po/sv.po
|
@ -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
112
po/tr.po
|
@ -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"
|
||||
|
||||
|
|
|
@ -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}"
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
};
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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 },
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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 */
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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" */
|
||||
|
|
|
@ -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; \
|
||||
})
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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__ })
|
||||
|
||||
/**
|
||||
* \}
|
||||
|
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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__ })
|
||||
|
||||
/**
|
||||
* \}
|
||||
|
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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__ }
|
||||
|
||||
/**
|
||||
* \}
|
||||
*/
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
|
@ -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
Loading…
Reference in New Issue