Πως διορθώνουμε προβλήματα με τον ήχο

dimitris | Κυρ, 08/21/2011 - 11:05 | 15' | 1

Θέλετε να γράψετε κώδικα για τον πυρήνα Linux και να κάνετε την κάρτα ήχου σας να λειτουργεί σωστά; Να η ευκαιρία να π ετύχετε και τα δύο!

Του Σίμου Ξενιτέλλη*

 
Αρκετά συχνά ο ήχος δε λειτουργεί στην εντέλεια και χρειάζ εται να κάνουμε κάποια "μικρορύθμιση", τυπικά στο αρχείο /etc/modprobe.d/alsa-base.conf. Αν ο ήχος δεν απομονώνεται όταν συνδέετε τα ακουστικά σας, ή αν το μικρόφωνο δεν ακούγετ αι σωστά, τότε μια ρύθμιση μπορεί να διορθώσει το πρόβλημα. Ωστόσο, το να κάνουμε μικρορύθμισεις κάθε φορά που εγκαθιστούμε μια διανομή δεν είναι η σωστή πρακτική· πρέπει να τις βάλουμε στο ίδιο το λογισμικό, και στην προκειμένη περίπτωση στον πυρήνα του Linux.

Παρακάτω θα δούμε πως διαπιστώνουμε τι είδους πρόβλημα έχουμε στον ήχο και πως μπορούμε να ρυθμίσουμε το σύστημά μας εύκολα ώστε να επιλύσουμε το πρόβλημα. Ακόμα, θα δούμε πως μπορούμε να μεταγλωττίσουμε την πιο πρόσφατη έκδοση του υποσυστήματος ήχου του Linux. Τέλ ος, θα επέμβουμε γράφοντας μερικές γραμμές κώδικα που θα μπουν στον πυρήνα του Linux ώστε ο ήχος να λειτουργεί δίχως προβλήματα σε νεότερες διανομές.

Βασικές γνώσεις

Στα λειτουργικά συστήματα που βασίζονται στον πυρήνα Linux η υποστήριξη ήχου γίνεται από το υποσύστημα ALSA, goo.gl/Tv7V0. Για κάθε υποστηριζόμενη κάρτα ήχου υπάρχει ήδη drive r στο ALSA. Έτσι, δεν προσθέτουμε οι ίδιοι οδηγούς από τρίτους κατασκευαστές· οι οδηγοί είναι ήδη διαθέσιμοι στο ALSA.

Από το 2004 και μετά, οι υπολογιστές ακολουθούν το πρότυπο HD Audio της Intel για ήχο υψηλής πιστότητας. Το module του πυρήνα για HD Audio ονομάζεται snd-hda-intel, και είναι για κάρτες ήχου κάθε κατασκευαστή. Πριν το HD Audio υπήρχε το AC97. Αυτά που αναφέρουμε εδώ είναι κατά βάση για το HD Audio.

Κάθε κάρτα ήχου αποτελείται από τον ελεγκτή (controller) και τον κωδικοποιητή/αποκωδικοποιητή (codec). Συνήθως είναι ένας codec, για τον ήχο, ενώ ενδέχεται να υπάρχει και δεύτ ερος για το μόντεμ. Κάθε ένα από αυτά μπορεί να έχει πρόβλημα, ωστόσο το πιο συνηθισμένο είναι πιθανή αδυναμία στη σωστή ρύθμιση του codec ήχου. Αυτό που τυπικά χρειάζεται να καθ ορίσουμε είναι το μοντέλο προκαθορισμένων ρυθμίσεων (preset model). Στην ιδανική περίπτωση, το BIOS παρέχει τα στοιχεία αυτά στο υποσύστημα ALSA. Όμως, τις περισσότερες φορές το BIOS είναι προβληματικό και πρέπει να καθορίσουμε οι ίδιοι ότι ο codec ήχου της κάρτας μας ακολουθεί το τάδε υπάρχον μοντέλο. Ανάλογα με το codec της κάρτας μας, μπορούμε να δούμ ε τα διαθέσιμα μοντέλα στο goo.gl/Gk7zp. Επίσης, μπορούμε να διαβάσουμε περισσότερα για το HD Audio στο Linux στο goo.gl/0Eeei

Καταγραφή πληροφοριών της κάρτας ήχου

Για την καταγραφή των πληροφοριών της κάρτας ήχου μας, εκτελούμε την εντολή:

wget www.alsa-project.org/alsa-info.sh -O alsa-info.sh && bash ./alsa-info.sh

Η εντολή συνδέεται στο site του έργου ALSA, λαμβάνει το αρχείο alsa-info.sh, και μετά το εκτελεί. Κατά την εκτέλεση μας ζητάει αν θέλουμε να στείλουμε τα στοιχεία πίσω στο ALS A. Απαντούμε καταφατικά και καταγράφουμε το σύνδεσμο (URL) προς τις πληροφορίες αυτές.

Ανάλυση των πληροφοριών της κάρτας ήχου

Ας δούμε ένα παράδειγμα αρχείου alsa-info.txt, (goo.gl/kqNMr) για τη μητρική της Intel DP55WG, όπου η κάρτα ήχου δεν παράγει ήχο. Το αρχείο αποτελείται από μια σειρά ενοτήτων για τη διανομή του χρήστη, πληροφορίες του υπολογιστή όπως τις παρέχει το BIOS, πληροφορίες για τον πυρήνα και την έκδοση της ALSA. Στις τρεις επόμενες ενότητες επιβεβαιώνει ότι έχει φορτωθεί το module snd-hda-intel, ότι το σύστημα ήχου PulseAudio είναι σε λειτουργία και ότι έχουν αναγνωριστεί τρεις συσκευές ήχου. Η πρώτη κάρτα είναι η ενσωματωμένη του σ υστήματος, η δεύτερη είναι από κάποια συσκευή USB (πιθανόν κάμερα) και η τρίτη αντιστοιχεί στην έξοδο ήχου για τη θύρα HDMI. Μας ενδιαφέρει η πρώτη κάρτα.

Στην ενότητα "HDA-Intel Codec information" του ίδιου αρχείου υπάρχει αναφορά για το codec του ήχου, το "Realtek ALC889". Ακόμα, στο ίδιο σημείο γίνεται αναφορά για την ταυτότη τα του κατασκευαστή (Vendor ID) και την ταυτότητα του υποσυστήματος (Subsystem ID), που είναι 0x10ec0889 και 0x80860033 αντίστοιχα. Αυτά τα στοιχεία είναι σημαντικά για να προχωρ ήσουμε στο επόμενο βήμα παρακάτω, με τον καθορισμό του μοντέλου του codec ήχου στο αρχείο ρυθμίσεων του ALSA. Από τις υπόλοιπες ενότητες έχει κάποιο ενδιαφέρον η τελευταία, «ALSA /HDA dmesg», που περιλαμβάνει καταγραφές του ALSA και πιθανά μηνύματα σφάλματος.

Καθορισμός του μοντέλου του codec

Γνωρίζουμε ότι ο codec της κάρτας ήχου είναι ο «Realtek ALC889». Δοκιμάζουμε να εντοπίσουμε εναλλακτικά μοντέλα για τον συγκεκριμένο codec, και να ρυθμίσουμε κατάλληλα το υποσ ύστημα ALSA. Η πλήρης λίστα των διαθέσιμων μοντέλων είναι διαθέσιμη στο σύνδεσμο goo.gl/Ka1mw και ο codec μας υπάρχει στο αρχείο αυτό στην υποενότητα «ALC882/883/885/888/889». Σ την υποενότητα υπάρχουν ειδικά μοντέλα ανάλογα με τον κατασκευαστή και υπάρχει το γενικό μοντέλο «6stack-dig» που θα δοκιμάσουμε πρώτο.

Ανοίγουμε το αρχείο /etc/modprobe.d/alsa-base.conf με την εντολή

sudo gedit /etc/modprobe.d/alsa-base.conf

και προσθέτουμε στο τέλος του αρχείου τη γραμμή

options snd-hda-intel model=6stack-dig

Αποθηκεύουμε το αρχείο και επανεκκινούμε τον υπολογιστή μας. Αν ο ήχος δε λειτουργήσει, τότε επεξεργαζόμαστε ξανά το alsa-base.conf και αλλάζουμε το 6stack-dig με κάποιο άλλο μοντέλο, και επανεκκινούμε ξανά. Αν ωστόσο ο ήχος λειτουργήσει, τότε έχουμε εντοπίσει το σωστό μοντέλο για το codec του υποσυστήματος ALSA!

Όσο διατηρούμε την εγκατάσταση της διανομής αυτής, τότε ο ήχος θα λειτουργεί. Όταν εγκαταστήσουμε νέα έκδοση της διανομής, τότε πρέπει να επέμβουμε ξανά στο αρχείο /etc/modpro be.d/alsa-base.conf και να θέσουμε το μοντέλου του codec ήχου.

Ο καθορισμός του μοντέλου που κάναμε παραπάνω μπορεί να προστεθεί με patch και στον κώδικα του πυρήνα Linux ώστε ο πυρήνας να είναι σε θέση να γνωρίζει ότι η ταυτότητα κατασκε υαστή αντιστοιχεί σε συγκεκριμένο μοντέλο για το codec ήχου. Η προσθήκη στον πυρήνα Linux θα έχει ως αποτέλεσμα να λειτουργεί ο ήχος στον υπολογιστή στις νεότερες εκδόσεις διανομ ών, χωρίς να απαιτούνται ρυθμίσεις.

Μεταγλώττιση της πιο πρόσφατης έκδοσης ALSA

Για να είμαστε σε θέση να κάνουμε τη διόρθωση στο πυρήνα Linux, πρέπει να κάνουμε μεταγλώττιση της πιο πρόσφατης έκδοσης του ALSA. Ακόμα, αν αντιμετωπίζουμε γενικό πρόβλημα με την υποστήριξη ήχου, είναι σημαντικό να δοκιμάζουμε αν η πιο πρόσφατη έκδοση της ALSA επιλύει το πρόβλημα, πριν προχωρήσουμε παραπέρα.

Για να μεταγλωττίσουμε την πιο πρόσφατη έκδοση της ALSA, ακολουθούμε τις οδηγίες στο goo.gl/wl35G. Συγκεκριμένα, εκτελούμε

$ wget -O alsa-compile.sh http://www.alsa-project.org/alsa-compile.sh
$ chmod 755 alsa-compile.sh
$ sudo ./alsa-compile.sh --help

Για τη μεταγλώττιση, εκτελούμε

$ sudo ./alsa-compile.sh –build

Για την εγκατάσταση εκτελούμε

$ sudo ./alsa-compile.sh –install

Για την ενεργοποίηση της νέας έκδοσης χρειάζεται να γίνει επανεκκίνηση. Μπορείτε να διαπιστώσετε βελτιώσεις με σύγκριση μεταξύ των αποτελεσμάτων της εξόδου της εντολής alsa-info.sh.

Υπάρχει κι άλλος τρόπος για μεταγλώττιση της ALSA με το χέρι, με εκτέλεση των εντολών ./configure, make, και sudo make install. Αν επιλέξετε την οδό αυτή, τότε για Ubuntu 10.10 ή νεότερο, εκτελέστε την εντολή

./configure –use-oss=no.

Προσθήκη στο πυρήνα Linux

Διαπιστώσαμε ότι ο codec ήχου είναι ο "Realtek ALC889", με ταυτότητα κατασκευαστή 0x10ec 0889.
Στο σύνδεσμο goo.gl/c1ElT υπάρχουν τα σχετικά αρχεία patch για κάθε κατασκευαστή. Στην προκειμένη περίπτωση, μελετούμε το αρχείο patch_realtek.c (θα το βρείτε εδώ goo.gl/CglQh). Το πρόγραμμα alsa-compile.sh τοποθετεί τον κώδικα του ALSA στον υποκατάλογο /tmp/alsa-compile-script/ από όπου εντοπίζουμε το αρχείο patch_realtek.c. Ανοίγουμε αυτό το αρχείο με έναν κειμενογράφο, βρίσκουμε τη συνάρτηση snd_pci_quirk alc882_cfg_tbl και της προσθέτουμε τη γραμμή:

SND_PCI_QUIRK(0x10ec, 0x0889, "Intel DP55WG", ALC882_6ST_DIG),

όπως βλέπουμε στην εικόνα 1.

Στη συνάρτηση SND_PCI_QUIRK(), τα δύο πρώτα ορίσματα καθορίζουν την ταυτότητα του κατασκευαστή, 0x10ec 0889. Το τρίτο όρισμα είναι αλφαριθμητικό που περιγράφει τη συσκευή. Το τελευταίο όρισμα είναι μια σταθερά που αντιστοιχεί στο μοντέλο 6stack-dig. Αν και αναφέρει ALC882, μπορεί να χρησιμοποιηθεί και για το ALC889 που έχουμε εδώ.

Στο σημείο αυτό μεταγλωττίζουμε ξανά το ALSA και το εγκαθιστούμε. Επιβεβαιώνουμε ότι έχουμε αφαιρέσει τη ρύθμιση μοντέλου από το /etc/modprobe.d/alsa-base.conf και κάνουμε επανεκκίνηση. Αν για κάποιο λόγο θέλουμε να επαναφέρουμε το σύστημά μας στην αρχική κατάσταση σε σχέση με την ALSA, εκτελούμε το alsa-compile.sh με την παράμετρο –kmod-clean, ή εγκαθιστούμε ξανά τον πυρήνα του συστήματος.

Προώθηση της αλλαγής στο έργο ALSA

Από τη στιγμή που έχουμε επιβεβαιώσει την προσθήκη, είμαστε σε θέση να επικοινωνήσουμε με τη λίστα alsa-devel των συντελεστών του έργου ALSA, goo.gl/XuUR0 Συντάσσουμε ένα email που να μοιάζει με goo.gl/Q9kAL και το στέλνουμε στη λίστα alsa-devel. Οι συντελεστές του έργου ALSA θα ελέγξουν την προσθήκη και θα ενεργήσουν κατάλληλα.

Επίλογος

Είδαμε πως μεταγλωττίζουμε την πιο πρόσφατη έκδοση του υποσυστήματος ήχου ALSA, πως συλλέγουμε τεχνικές πληροφορίες για την κάρτα ήχου, και πως μπορούμε να καθορίσουμε το μοντέλο του κόντεκ για να επιλύσουμε προβλήματα. Αν το πρόβλημα που αντιμετωπίζουμε έχει να κάνει με το μοντέλο, τότε μπορούμε εύκολα να προσθέσουμε μια γραμμή στο κατάλληλο σημείο στον κώδικα του Linux και να διορθώσουμε μια και καλή το πρόβλημα. Τέλος, είδαμε πως στέλνουμε την προσθήκη για να μπει στη νεότερη έκδοση του Linux. Καλή επιτυχία!

 

*Ο Σίμος περνάει την ώρα του μαθαίνοντας περισσότερα για ελ/λακ. 

Φόρουμ
Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Χάρηκα ιδιαιτέρως όταν είδα το συγκεκριμένο άρθρο στο RSS feed μου, γιατί έχω κάποια προβλήματα με τον ήχο (χαμηλή ένταση) στο σύστημά μου, ένα καινούριο DELL XPS 15 L502X με εγκατεστημένα Chakra x64, KDE 4.7 και kernel 3.

Προσπαθώντας να ακολουθήσω τον οδηγό παρουσιάστηκαν 2 προβλήματα:

1> Τι κάνουμε όταν δεν υπάρχει το μοντέλο μας στην λίστα; Συγκεκριμένα στο laptop μου υπάρχει το ALC655. Θα πρότεινες κάποιο σαν εναλλακτικό; Η απλά να περιμένω μέχρι να υποστηριχθεί;
2> Στο σύστημά μου δεν υπάρχει το αρχείο alsa-base.conf. Το να το δημιουργήσω έχει νόημα;

Τα στοιχεία του alsainfo μου είναι εδώ:
http://www.alsa-project.org/db/?f=ffc8f51c7c1ec1423d07203d03790b0c5dbd5e4e

Ευχαριστώ για τον επεξηγηματικό οδηγό!