1 // Copyright 2017 Lyndon Brown 2 // 3 // This file is part of the PulseAudio Rust language linking library. 4 // 5 // Licensed under the MIT license or the Apache license (version 2.0), at your option. You may not 6 // copy, modify, or distribute this file except in compliance with said license. You can find copies 7 // of these licenses either in the LICENSE-MIT and LICENSE-APACHE files, or alternatively at 8 // <http://opensource.org/licenses/MIT> and <http://www.apache.org/licenses/LICENSE-2.0> 9 // respectively. 10 // 11 // Portions of documentation are copied from the LGPL 2.1+ licensed PulseAudio C headers on a 12 // fair-use basis, as discussed in the overall project readme (available in the git repository). 13 14 //! Utility functions for handling a stream or sink format. 15 16 use std::os::raw::c_char; 17 use num_derive::{FromPrimitive, ToPrimitive}; 18 use crate::sample::{pa_sample_spec, pa_sample_format_t}; 19 use crate::{proplist::pa_proplist, channelmap::pa_channel_map}; 20 21 #[repr(C)] 22 #[non_exhaustive] 23 #[derive(Debug, Copy, Clone, PartialEq, Eq)] 24 #[derive(FromPrimitive, ToPrimitive)] 25 #[allow(non_camel_case_types)] 26 pub enum pa_encoding_t { 27 Any, 28 PCM, 29 AC3_IEC61937, 30 EAC3_IEC61937, 31 MPEG_IEC61937, 32 DTS_IEC61937, 33 MPEG2_AAC_IEC61937, 34 #[cfg(any(doc, feature = "pa_v13"))] 35 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] 36 TRUEHD_IEC61937, 37 #[cfg(any(doc, feature = "pa_v13"))] 38 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] 39 DTSHD_IEC61937, 40 41 Invalid = -1, 42 } 43 44 pub const PA_ENCODING_MAX: usize = 7; 45 46 pub const PA_ENCODING_ANY: pa_encoding_t = pa_encoding_t::Any; 47 pub const PA_ENCODING_PCM: pa_encoding_t = pa_encoding_t::PCM; 48 pub const PA_ENCODING_AC3_IEC61937: pa_encoding_t = pa_encoding_t::AC3_IEC61937; 49 pub const PA_ENCODING_EAC3_IEC61937: pa_encoding_t = pa_encoding_t::EAC3_IEC61937; 50 pub const PA_ENCODING_MPEG_IEC61937: pa_encoding_t = pa_encoding_t::MPEG_IEC61937; 51 pub const PA_ENCODING_DTS_IEC61937: pa_encoding_t = pa_encoding_t::DTS_IEC61937; 52 pub const PA_ENCODING_MPEG2_AAC_IEC61937: pa_encoding_t = pa_encoding_t::MPEG2_AAC_IEC61937; 53 #[cfg(any(doc, feature = "pa_v13"))] 54 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] 55 pub const PA_ENCODING_TRUEHD_IEC61937: pa_encoding_t = pa_encoding_t::TRUEHD_IEC61937; 56 #[cfg(any(doc, feature = "pa_v13"))] 57 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] 58 pub const PA_ENCODING_DTSHD_IEC61937: pa_encoding_t = pa_encoding_t::DTSHD_IEC61937; 59 pub const PA_ENCODING_INVALID: pa_encoding_t = pa_encoding_t::Invalid; 60 61 impl Default for pa_encoding_t { default() -> Self62 fn default() -> Self { 63 pa_encoding_t::Invalid 64 } 65 } 66 67 /// Represents the format of data provided in a stream or processed by a sink. 68 #[repr(C)] 69 pub struct pa_format_info { 70 pub encoding: pa_encoding_t, 71 pub plist: *mut pa_proplist, 72 } 73 74 /// The maximum length of strings returned by [`pa_format_info_snprint()`]. 75 /// 76 /// Please note that this value can change with any release without warning and without being 77 /// considered API or ABI breakage. You should not use this definition anywhere where it might 78 /// become part of an ABI. 79 pub const PA_FORMAT_INFO_SNPRINT_MAX: usize = 256; 80 81 /// Represents the type of value of a property. 82 #[repr(C)] 83 #[derive(Debug, Copy, Clone, PartialEq, Eq)] 84 #[derive(FromPrimitive, ToPrimitive)] 85 pub enum pa_prop_type_t { 86 /// Integer. 87 Int, 88 /// Integer range. 89 IntRange, 90 /// Integer array. 91 IntArray, 92 /// String. 93 String, 94 /// String array. 95 StringArray, 96 97 /// Invalid. 98 Invalid = -1, 99 } 100 101 pub const PA_PROP_TYPE_INT: pa_prop_type_t = pa_prop_type_t::Int; 102 pub const PA_PROP_TYPE_INT_RANGE: pa_prop_type_t = pa_prop_type_t::IntRange; 103 pub const PA_PROP_TYPE_INT_ARRAY: pa_prop_type_t = pa_prop_type_t::IntArray; 104 pub const PA_PROP_TYPE_STRING: pa_prop_type_t = pa_prop_type_t::String; 105 pub const PA_PROP_TYPE_STRING_ARRAY: pa_prop_type_t = pa_prop_type_t::StringArray; 106 pub const PA_PROP_TYPE_INVALID: pa_prop_type_t = pa_prop_type_t::Invalid; 107 108 impl Default for pa_prop_type_t { default() -> Self109 fn default() -> Self { 110 pa_prop_type_t::Invalid 111 } 112 } 113 114 #[rustfmt::skip] 115 #[link(name = "pulse")] 116 extern "C" { pa_encoding_to_string(e: pa_encoding_t) -> *const c_char117 pub fn pa_encoding_to_string(e: pa_encoding_t) -> *const c_char; 118 #[cfg(any(doc, feature = "pa_v12"))] 119 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v12")))] pa_encoding_from_string(encoding: *const c_char) -> pa_encoding_t120 pub fn pa_encoding_from_string(encoding: *const c_char) -> pa_encoding_t; 121 pa_format_info_new() -> *mut pa_format_info122 pub fn pa_format_info_new() -> *mut pa_format_info; pa_format_info_copy(src: *const pa_format_info) -> *mut pa_format_info123 pub fn pa_format_info_copy(src: *const pa_format_info) -> *mut pa_format_info; pa_format_info_free(f: *mut pa_format_info)124 pub fn pa_format_info_free(f: *mut pa_format_info); pa_format_info_valid(f: *const pa_format_info) -> i32125 pub fn pa_format_info_valid(f: *const pa_format_info) -> i32; pa_format_info_is_pcm(f: *const pa_format_info) -> i32126 pub fn pa_format_info_is_pcm(f: *const pa_format_info) -> i32; pa_format_info_is_compatible(first: *const pa_format_info, second: *const pa_format_info) -> i32127 pub fn pa_format_info_is_compatible(first: *const pa_format_info, second: *const pa_format_info) -> i32; pa_format_info_snprint(s: *mut c_char, l: usize, f: *const pa_format_info) -> *mut c_char128 pub fn pa_format_info_snprint(s: *mut c_char, l: usize, f: *const pa_format_info) -> *mut c_char; pa_format_info_from_string(s: *const c_char) -> *mut pa_format_info129 pub fn pa_format_info_from_string(s: *const c_char) -> *mut pa_format_info; pa_format_info_from_sample_spec(ss: *const pa_sample_spec, map: *const pa_channel_map) -> *mut pa_format_info130 pub fn pa_format_info_from_sample_spec(ss: *const pa_sample_spec, map: *const pa_channel_map) -> *mut pa_format_info; pa_format_info_to_sample_spec(f: *const pa_format_info, ss: *mut pa_sample_spec, map: *mut pa_channel_map) -> i32131 pub fn pa_format_info_to_sample_spec(f: *const pa_format_info, ss: *mut pa_sample_spec, map: *mut pa_channel_map) -> i32; pa_format_info_get_prop_type(f: *const pa_format_info, key: *const c_char) -> pa_prop_type_t132 pub fn pa_format_info_get_prop_type(f: *const pa_format_info, key: *const c_char) -> pa_prop_type_t; pa_format_info_get_prop_int(f: *const pa_format_info, key: *const c_char, v: *mut i32) -> i32133 pub fn pa_format_info_get_prop_int(f: *const pa_format_info, key: *const c_char, v: *mut i32) -> i32; pa_format_info_get_prop_int_range(f: *const pa_format_info, key: *const c_char, min: *mut i32, max: *mut i32) -> i32134 pub fn pa_format_info_get_prop_int_range(f: *const pa_format_info, key: *const c_char, min: *mut i32, max: *mut i32) -> i32; pa_format_info_get_prop_int_array(f: *const pa_format_info, key: *const c_char, values: *mut *mut i32, n_values: *mut i32) -> i32135 pub fn pa_format_info_get_prop_int_array(f: *const pa_format_info, key: *const c_char, values: *mut *mut i32, n_values: *mut i32) -> i32; pa_format_info_get_prop_string(f: *const pa_format_info, key: *const c_char, v: *mut *mut c_char) -> i32136 pub fn pa_format_info_get_prop_string(f: *const pa_format_info, key: *const c_char, v: *mut *mut c_char) -> i32; pa_format_info_get_prop_string_array(f: *const pa_format_info, key: *const c_char, values: *mut *mut *mut c_char, n_values: *mut i32) -> i32137 pub fn pa_format_info_get_prop_string_array(f: *const pa_format_info, key: *const c_char, values: *mut *mut *mut c_char, n_values: *mut i32) -> i32; pa_format_info_free_string_array(values: *mut *mut c_char, n_values: i32)138 pub fn pa_format_info_free_string_array(values: *mut *mut c_char, n_values: i32); 139 #[cfg(any(doc, feature = "pa_v13"))] 140 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] pa_format_info_get_sample_format(f: *const pa_format_info, sf: *mut pa_sample_format_t) -> i32141 pub fn pa_format_info_get_sample_format(f: *const pa_format_info, sf: *mut pa_sample_format_t) -> i32; 142 #[cfg(any(doc, feature = "pa_v13"))] 143 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] pa_format_info_get_rate(f: *const pa_format_info, rate: *mut u32) -> i32144 pub fn pa_format_info_get_rate(f: *const pa_format_info, rate: *mut u32) -> i32; 145 #[cfg(any(doc, feature = "pa_v13"))] 146 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] pa_format_info_get_channels(f: *const pa_format_info, channels: *mut u8) -> i32147 pub fn pa_format_info_get_channels(f: *const pa_format_info, channels: *mut u8) -> i32; 148 #[cfg(any(doc, feature = "pa_v13"))] 149 #[cfg_attr(docsrs, doc(cfg(feature = "pa_v13")))] pa_format_info_get_channel_map(f: *const pa_format_info, map: *const pa_channel_map) -> i32150 pub fn pa_format_info_get_channel_map(f: *const pa_format_info, map: *const pa_channel_map) -> i32; pa_format_info_set_prop_int(f: *mut pa_format_info, key: *const c_char, value: i32)151 pub fn pa_format_info_set_prop_int(f: *mut pa_format_info, key: *const c_char, value: i32); pa_format_info_set_prop_int_array(f: *mut pa_format_info, key: *const c_char, values: *const i32, n_values: i32)152 pub fn pa_format_info_set_prop_int_array(f: *mut pa_format_info, key: *const c_char, values: *const i32, n_values: i32); pa_format_info_set_prop_int_range(f: *mut pa_format_info, key: *const c_char, min: i32, max: i32)153 pub fn pa_format_info_set_prop_int_range(f: *mut pa_format_info, key: *const c_char, min: i32, max: i32); pa_format_info_set_prop_string(f: *mut pa_format_info, key: *const c_char, value: *const c_char)154 pub fn pa_format_info_set_prop_string(f: *mut pa_format_info, key: *const c_char, value: *const c_char); pa_format_info_set_prop_string_array(f: *mut pa_format_info, key: *const c_char, values: *const *const c_char, n_values: i32)155 pub fn pa_format_info_set_prop_string_array(f: *mut pa_format_info, key: *const c_char, values: *const *const c_char, n_values: i32); pa_format_info_set_sample_format(f: *mut pa_format_info, sf: pa_sample_format_t)156 pub fn pa_format_info_set_sample_format(f: *mut pa_format_info, sf: pa_sample_format_t); pa_format_info_set_rate(f: *mut pa_format_info, rate: i32)157 pub fn pa_format_info_set_rate(f: *mut pa_format_info, rate: i32); pa_format_info_set_channels(f: *mut pa_format_info, channels: i32)158 pub fn pa_format_info_set_channels(f: *mut pa_format_info, channels: i32); pa_format_info_set_channel_map(f: *mut pa_format_info, map: *const pa_channel_map)159 pub fn pa_format_info_set_channel_map(f: *mut pa_format_info, map: *const pa_channel_map); 160 } 161