LINUX.ORG.RU

Что делает вот этот кусок alsa.conf?

 ,


0

2

В общем потихоньку разбираюсь с настройкой alsa, но так как нормальной документации на эту alsa нет, то приходится разбираться старым виндавозным способом, а именно удалять всё, что не участвует в работе, что не удаётся удалить конкретизировать и по получившемуся результату постараться понять что и как работает.

И вот значит дошёл черёд до удаления вот такого куска кода:

cards.@hooks [
	{
		func load
		files [
			{
				@func concat
				strings [
					{ @func datadir }
					"/pcm/default.conf"
				]
			}
		]
	}
]

В /pcm/default.conf содержится вот это(с сокращением):

pcm.!default {
	# много кода аудиоустройства
}

И вот у меня какая проблема, этот cards.@hooks не выходит ни упростить, ни заменить на содержимое /pcm/default.conf, такое впечатление, и оно косвенно подтверждается load, что этот кусок alsa.conf грузит файл /pcm/default.conf в отдельном процессе или что-то похожее.

Что вообще делают func load files[] и @func concat strings [{ @func datadir } "/pcm/default.conf"]?

Зачем надо грузить /pcm/default.conf в отдельном процессе или пространстве?

Полное содержимое файлов можете посмотреть в своей ОС относительно каталога /usr/share/alsa.

И ещё вопрос, что бы мне такое написать чтобы мой кодек ALC888 стал работать на поддерживаемых им 24 битном стерео звуке с частотой дискритизации 96 или 192 кГц?

Сейчас он работает как моно с ужасающим качеством звучания.

★★★★★

Последнее исправление: torvn77 (всего исправлений: 2)

Полное содержание alsa.conf(все файлы из /etc удалены)

#
#  ALSA library configuration file
#

# pre-load the configuration files
# load card-specific configuration files (on request)

cards.@hooks [
	{
		func load
		files [
			{
				@func concat
				strings [
					{ @func datadir }
					"/pcm/default.conf"
				]
			}
		]
	}
#	{
#		func load_for_all_cards
#		files [	/cards/HDA-Intel.conf	]
#		errors false
#	}
]


#
# defaults
#

# show all name hints also for definitions without hint {} section
defaults.namehint.showall on
# show just basic name hints
defaults.namehint.basic on
# show extended name hints
defaults.namehint.extended on
#
defaults.ctl.card 0
defaults.pcm.card 0
defaults.pcm.device 0
defaults.pcm.subdevice -1
defaults.pcm.nonblock 1
defaults.pcm.compat 0
defaults.pcm.minperiodtime 5000		# in us
defaults.pcm.ipc_key 5678293
defaults.pcm.ipc_gid audio
defaults.pcm.ipc_perm 0660
defaults.pcm.dmix.max_periods 0
defaults.pcm.dmix.rate 192000
defaults.pcm.dmix.format "U24_LE"
# Main
defaults.pcm.rate_converter "speexrate_medium"
# Main_End
#
defaults.pcm.dmix.card defaults.pcm.card
defaults.pcm.dmix.device defaults.pcm.device
defaults.pcm.dsnoop.card defaults.pcm.card
defaults.pcm.dsnoop.device defaults.pcm.device
defaults.pcm.front.card defaults.pcm.card
defaults.pcm.front.device defaults.pcm.device
defaults.pcm.rear.card defaults.pcm.card
defaults.pcm.rear.device defaults.pcm.device
defaults.pcm.surround21.card defaults.pcm.card
defaults.pcm.surround21.device defaults.pcm.device
# truncate files via file or tee PCM

#
#  PCM interface
#

# redirect to load-on-demand extended pcm definitions
pcm.cards cards.pcm

pcm.default cards.pcm.default
pcm.sysdefault cards.pcm.default
pcm.front cards.pcm.front
pcm.rear cards.pcm.rear
pcm.surround21 cards.pcm.surround21

pcm.hw {
	@args [ CARD DEV SUBDEV ]
	@args.CARD {
		type string
		default {
			@func getenv
			vars [
				ALSA_PCM_CARD
				ALSA_CARD
			]
			default {
				@func refer
				name defaults.pcm.card
			}
		}
	}
	@args.DEV {
		type integer
		default {
			@func igetenv
			vars [
				ALSA_PCM_DEVICE
			]
			default {
				@func refer
				name defaults.pcm.device
			}
		}
	}
	@args.SUBDEV {
		type integer
		default {
			@func refer
			name defaults.pcm.subdevice
		}
	}		
	type hw
	card $CARD
	device $DEV
	subdevice $SUBDEV
	hint {
		show {
			@func refer
			name defaults.namehint.extended
		}
		description "Direct hardware device without any conversions"
	}
}







#
#  Control interface
#

ctl.hw {
	@args [ CARD ]
	@args.CARD {
		type string
		default {
			@func getenv
			vars [
				ALSA_CTL_CARD
				ALSA_CARD
			]
			default {
				@func refer
				name defaults.ctl.card
			}
		}
	}
	type hw
	card $CARD
	hint.description "Direct control device"
}


pcm.null {
	type null
	hint {
		show {
			@func refer
			name defaults.namehint.basic
		}
		description "Discard all samples (playback) or generate zero samples (capture)"
	}
}
torvn77 ★★★★★
() автор топика
Последнее исправление: torvn77 (всего исправлений: 1)

Полное содержание /pcm/default.conf(пока я его ни как не изменял, привожу для справки)

#
# Default output
#

pcm.!default {
	@args [ CARD ]
	@args.CARD {
		type string
		default {
			@func getenv
			vars [
				ALSA_PCM_CARD
				ALSA_CARD
			]
			default {
				@func refer
				name defaults.pcm.card
			}
		}
	}
	type empty
	slave.pcm {
		# use card-specific definition if exists
		@func refer
		name {
			@func concat
			strings [
				"cards."
				{
					@func card_driver
					card $CARD
				}
				".pcm.default:CARD=" $CARD
			]
		}
		default {
			# use plughw as default
			type plug
			slave.pcm {
				type hw
				card $CARD
			}
			hint.device 0
		}
	}
	hint {
		description "Default Audio Device"
		device_output {
			@func refer
			name defaults.pcm.dmix.device
		}
		device_input {
			@func refer
			name defaults.pcm.dsnoop.device
		}
	}
}
torvn77 ★★★★★
() автор топика

Я нашёл команду для вывода информации о кодеке, оказывается то, что он умеет только 44.1 или 192 кГц и S16_LE или S32_LE формат звука.
Поставил 192кГц S32_LE, звук стал хорошим, но по прежнему остался моно, а не стерео.

Команда: aplay --device hw /dev/urandom --dump-hw-params

torvn77 ★★★★★
() автор топика
Последнее исправление: torvn77 (всего исправлений: 2)

Что делает вот этот кусок alsa.conf?

очевидно инклудит pcm/default.conf из альсовой папки (/usr/share/alsa/).

Зачем надо грузить /pcm/default.conf в отдельном процессе или пространстве?

да никто его в отдельном процессе не грузит:

$ strace --trace openat aplay -L 2>&1 | grep pcm/default.conf
openat(AT_FDCWD, "/usr/share/alsa/pcm/default.conf", O_RDONLY) = 4
anonymous
()
Ответ на: комментарий от anonymous

очевидно инклудит pcm/default.conf из альсовой папки (/usr/share/alsa/).

Нет, инклюдии вот такое: <confdir:expl.conf>.
Скорее оно инклюдит с подстановкой подставляя всякие переменные вида @args(я понимаю так, что это переменная).

Вот тут я нашёл описание на load https://www.alsa-project.org/alsa-doc/alsa-lib/confhooks.html



The hook extension in the ALSA library allows expansion of configuration nodes at run-time. The existence of a hook is determined by the presence of a @hooks compound node.

This example defines a hook which loads two configuration files at the beginning:
@hooks [
    {
        func load
        files [
            "/etc/asound.conf"
            "~/.asoundrc"
        ]
        errors false
    }
]
Function reference

    The function load - snd_config_hook_load() - loads and parses the given configuration files.
    The function load_for_all_cards - snd_config_hook_load_for_all_cards() - loads and parses the given configuration files for each installed sound card. The driver name (the type of the sound card) is passed in the private configuration node.


Видимо cards@hooks ставит хук на событие появления карты или на объект карта.

torvn77 ★★★★★
() автор топика
Последнее исправление: torvn77 (всего исправлений: 2)
Ответ на: комментарий от torvn77

слушай, вот тут в самом начале огромный камент, раскрывающий детали синтаксиса. я не читал, но может ты там найдёшь то, что тебя интересует.

конкат — это функция конкатенирующая строки: https://github.com/alsa-project/alsa-lib/blob/master/src/confmisc.c#L359

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.