Changes

1,250 bytes removed ,  13:27, 15 April 2016
Partial page redesign
Line 1: Line 1: −
Benvenuti nella pagina Wiki di Simone Giustetti.
+
{{header_en|title=Configuring a sound card in Slackware Linux| keyword={{Template:keyword_en_linux}}| description=A brief guide discussing how to configure a default sound card in Slackware Linux | link_page=scheda_sonora_di_default}}
    +
I recently upgraded my "work" machine to Slackware 14.0 from a previously in use 13.37 release, that started to be too old for my needs. The upgrade procedure was easy and straightforward: in a couple of hours I could reboot to the new system. Unfortunately I noticed some annoying issues with the sound card later while configuring it. In the following article I'll discuss the issues and the corresponding solution.
   −
Lingue: [[vtigercrm_update_date_field_default_behavior | English]] - '''Italiano'''
     −
----
+
While configuring the audio subsystem, the 3.2.29 kernel detected two sound cards instead of the only one the previously in use 2.6.37 kernel did. The newly detected card was set as default for the operating system but did not seem to work. Some annoying issues with the installed multimedia applications arose:
 +
* It was difficult / nearly impossible to set a decent volume level for some programs.
 +
* The mixer volume controlling device needed to be selected after each reboot.
 +
* '''No more than one multimedia application at a time seemed able to access the mixer'''. The earlier run one exclusively seized  mixers and sound cards preventing others from reproducing any sound.
 +
* Sound related error messages appeared uninterruptedly.
 +
* It was '''impossible to reproduce sound files or clips with Wine'''.
 +
The situation was unbearable. Reverting to Slackware 13.37 was not an option so I decided to try and solve the configuration issues.
   −
== Comportamento del Controllo '''datefield''' ==
  −
Le date sono gestite mediante un '''apposito controllo calendario''' (datefield) in VtigerCRM. In fase di inserimento o modifica dei dati, il controllo '''suggerisce automaticamente la data del giorno corrente'''. La compilazione automatica, generalmente utile, può risultare fastidiosa in alcuni contesti: ad esempio maschere con molte date. Una maschera in cui siano presenti molti campi data costringerebbe l'utente a scorrerli tutti correggendo o rimuovendo i valori indesiderati. Ne consegue la necessità di '''modificare il comportamento standard del controllo in modo che suggerisca in automatico una data nulla'''. Il suggerimento dovrebbe comparire solo quando l'utente selezioni esplicitamente il controllo e non a prescindere. Nel proseguo dell'articolo verrà esposto come modificare il comportamento standard per i controlli data in '''VtigerCRM versione 5.2.1'''.
      +
== Problem-solving  ==
 +
My first goal consisted in understanding why the 3.2.29 kernel was detecting two sound cards in a machine with only one. I started by reading the pseudo-file '''/proc/asound/cards''':
 +
  root@darkstar_5:~# '''cat''' /proc/asound/cards
 +
    0 [Generic        ]: HDA-Intel - HD-Audio Generic
 +
                        HD-Audio Generic at 0xfeb44000 irq 42
 +
    1 [Generic_1      ]: HDA-Intel - HD-Audio Generic
 +
                        HD-Audio Generic at 0xfeb40000 irq 16
 +
Then I read the device configuration for both cards from the output produced by command '''amixer'''. Each card was selected using the '''-c''' option:
 +
  root@darkstar_5:~# '''amixer info''' ''-c'' 0
 +
  Card default 'Generic'/'HD-Audio Generic at 0xfeb44000 irq 42'
 +
    Mixer name    : 'ATI R6xx HDMI'
 +
    Components    : 'HDA:1002aa01,00aa0100,00100200'
 +
    Controls      : 5
 +
    Simple ctrls  : 1
 +
  root@darkstar_5:~# '''amixer info''' ''-c'' 1
 +
  Card hw:1 'Generic_1'/'HD-Audio Generic at 0xfeb40000 irq 16'
 +
    Mixer name    : 'Realtek ALC269VB'
 +
    Components    : 'HDA:10ec0269,144dc608,00100100'
 +
    Controls      : 17
 +
    Simple ctrls  : 11
 +
I thus learned that the second detected sound card was not a real device but the '''ATI video card [http://en.wikipedia.org/wiki/Hdmi HDMI] output device''' instead. Support for HDMI was introduced in kernel release 3.2 that explained why Slackware 13.37 had no issue with the ATI card: The 2.6 kernel could not manage the hardware anyhow.
   −
== Funzionamento Interno di VtigerCRM ==
  −
In VtigerCRM il codice di elaborazione dei dati è separato da quello di presentazione degli stessi. Le informazioni vengono estratte dal database, i file di configurazione ed altre fonti, elaborate e infine passate a sezioni separate del codice, che si occupano della formattazione e scrittura delle pagine HTML. '''Tutte le pagine generate dal software sono basate su modelli predefiniti detti template'''. VtigerCRM utilizza '''Smarty''' come motore per i template. I template consistono in file di testo formattati secondo una sintassi specifica, simile ad '''HTML''' con l'aggiunta di variabili e cicli. I modelli sono reperibili in una apposita directory all'interno dell'albero di installazione di VtigerCRM: '''Smarty/templates'''. Di seguito è elencato il contenuto di tale directory:
  −
  bash-4.1# '''ls''' ''-la'' ./Smarty
  −
  total 64
  −
  drwxr-xr-x  8 apache apache  4096 Nov 15  2010 .
  −
  drwxr-xr-x 28 apache apache  4096 Sep  7 01:32 ..
  −
  -rw-r--r--  1 apache apache 24389 Nov 15  2010 COPYING.lib
  −
  drwxrwxr-x  2 apache apache  4096 May  5  2011 cache
  −
  drwxr-xr-x  2 apache apache  4096 Nov 15  2010 configs
  −
  drwxr-xr-x  4 apache apache  4096 Nov 15  2010 libs
  −
  drwxr-xr-x  2 apache apache  4096 Nov 15  2010 misc
  −
  drwxr-xr-x  8 apache apache  4096 Nov 15  2010 templates
  −
  drwxrwxr-x  2 apache apache 12288 Sep 16 00:25 templates_c
  −
La directory '''templates''' contiene il codice sorgente dei modelli di controlli, maschere e pagine.<BR>
  −
La directory '''templates_c''' contiene una versione precompilata dei template pronta per l'uso da parte del motore del programma.
     −
Il file '''Smarty/templates/EditViewUI.tpl''' contiene alcuni template utilizzati dalle maschere del programma in fase di inserimento / modifica dei dati.
+
== Solutions ==
 +
With the problem cause discovered two tentative solutions were possible:
 +
# Disable the HDMI device in order for the operating system to ignore it.
 +
# Set the Realtek card as the default one for the system.
   −
Il file '''Smarty/templates/DetailView.tpl''' contiene i template per i controlli predefiniti suddivisi sulla base del modulo di appartenenza.
+
I chose the former path given that I do not usually connect external devices to the video card anyway. The idea consisted in disabling the HDMI related kernel module by adding a '''blacklist''' entry in the '''/etc/modprobe.d/alsa-base.conf''' file. I needed the module name and in order to obtain it run command '''lspci''' using option '''-v'''. A synthesis of the output I got follows:
 +
  root@darkstar_5:~# lspci -v
 +
  ...
 +
  00:01.1 Audio device: Advanced Micro Devices [AMD] nee ATI BeaverCreek HDMI Audio [Radeon HD 6500D and 6400G-6600G series]
 +
          Subsystem: Advanced Micro Devices [AMD] nee ATI BeaverCreek HDMI Audio [Radeon HD 6500D and 6400G-6600G series]
 +
          Flags: bus master, fast devsel, latency 0, IRQ 42
 +
          Memory at feb44000 (32-bit, non-prefetchable) [size=16K]
 +
          Capabilities: [50] Power Management version 3
 +
          Capabilities: [58] Express Root Complex Integrated Endpoint, MSI 00
 +
          Capabilities: [a0] MSI: Enable+ Count=1/1 Maskable- 64bit+
 +
          Capabilities: [100] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
 +
          '''Kernel driver in use: snd_hda_intel'''
 +
  ...
 +
  00:14.2 Audio device: Advanced Micro Devices [AMD] Hudson Azalia Controller (rev 01)
 +
          Subsystem: Samsung Electronics Co Ltd Device c608
 +
          Flags: bus master, slow devsel, latency 32, IRQ 16
 +
          Memory at feb40000 (64-bit, non-prefetchable) [size=16K]
 +
          Capabilities: [50] Power Management version 2
 +
          '''Kernel driver in use: snd_hda_intel'''
 +
Both cards needed the same module. Blacklisting snd_hda_intel module was impossible: the latter solution, '''configuring the Realtek card as default''', seemed the only feasible one.
   −
Il file '''include/utils/utils.php''' contiene la funzione '''get_textdateField''' che impone il formato / valore di default per i campi data.
     −
Il file '''include/utils/CommonUtils.php''' contiene la funzione '''getNewDisplayDate()''' che assegna il valore della data corrente ad un campo data. La funzione ha lo scopo di inizializzare le variabili ed &egrave; pertanto lei ''a definire il comportamento di tutti i campi data in fase di inserimento o modifica dei dati''.
+
The installed [http://www.alsa-project.org/main/index.php/Main_Page ALSA] library version, 1.0.26, can work without any configuration files, by directly interfacing to the system. To bypass the system configuration and impose a customized one the configuration files are needed. For this particular case I created file '''/etc/asound.conf''' aimed at configuring sound cards for the whole system. The file affects audio subsystem configuration for all users. The following entries were added to the file:
 +
  root@darkstar_5:~# '''cat''' /etc/asound.conf
 +
  # Set the realtek sound card as the default one
 +
  defaults.ctl.card 1
 +
  defaults.pcm.card 1
 +
  defaults.pcm.device 0
 +
To check the configuration update I restarted ALSA:
 +
  root@darkstar_5:~# '''/etc/rc.d/rc.alsa restart'''
 +
  Loading ALSA mixer settings:  /usr/sbin/alsactl restore
 +
  Found hardware: "HDA-Intel" "Realtek ALC269VB" "HDA:10ec0269,144dc608,00100100" "0x144d" "0xc608"
 +
  Hardware is initialized using a generic method
 +
And was immediately able to verify it complied with my wishes:
 +
  root@darkstar_5:~# '''amixer info''' ''-c'' 0
 +
  Card hw:0 'Generic'/'HD-Audio Generic at 0xfeb44000 irq 42'
 +
    Mixer name    : 'ATI R6xx HDMI'
 +
    Components    : 'HDA:1002aa01,00aa0100,00100200'
 +
    Controls      : 5
 +
    Simple ctrls  : 1
 +
  root@darkstar_5:~# '''amixer info''' ''-c'' 1
 +
  Card hw:1 'Generic_1'/'HD-Audio Generic at 0xfeb40000 irq 16'
 +
    Mixer name    : 'Realtek ALC269VB'
 +
    Components    : 'HDA:10ec0269,144dc608,00100100'
 +
    Controls      : 17
 +
    Simple ctrls  : 11
 +
  root@darkstar_5:~# '''amixer info''' ''-d'' default
 +
  Card default 'Generic_1'/'HD-Audio Generic at 0xfeb40000 irq 16'
 +
    Mixer name    : 'Realtek ALC269VB'
 +
    Components    : 'HDA:10ec0269,144dc608,00100100'
 +
    Controls      : 17
 +
    Simple ctrls  : 11
 +
To double check I started a test sound file reproduction by running the '''aplay''' command. The "default" output card was selected using the '''-D''' option:
 +
  root@darkstar_5:~# '''aplay''' ''-D'' default /usr/share/sounds/alsa/Front_Center.wav
 +
  Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
 +
Both speakers reproduced the "front center" words sequence when previously I managed to get only an annoying silence.
   −
La funzione '''getNewDisplayDate()''' viene utilizzata in altri file del programma:
  −
* '''include/utils/EditViewUtils.php'''
  −
* '''include/utils/utils.php'''
  −
* '''modules/Emails/Save.php'''
  −
* '''modules/com_vtiger_workflow/VTSimpleTemplate.inc'''
     −
Il codice sorgente della funzione deve essere modificato in modo da alterare il comportamento standard dei controlli calendario utilizzati nei moduli del programma. Il fine della modifica &egrave; far si che i campi data vengano inizializzati con valore nullo anzich&egrave; la data corrente. Di seguito e' riportato il codice sorgente originale ed il codice a seguito della modifica apportata.
+
For any feedback, questions, errors and such, please e-mail me at ''studiosg [at] giustetti [dot] net''
   −
=== Codice Sorgente Originale ===
  −
<syntaxhighlight lang="php">
  −
  /** This function returns the date in user specified format.
  −
  * Takes no param, receives the date format from current user object
  −
  */
  −
 
  −
  function getNewDisplayDate()
  −
  {
  −
      global $log;
  −
      $log->debug("Entering getNewDisplayDate() method ...");
  −
        $log->info("in getNewDisplayDate ");
  −
 
  −
      global $current_user;
  −
      $dat_fmt = $current_user->date_format;
  −
      if($dat_fmt == '')
  −
        {
  −
                  $dat_fmt = 'dd-mm-yyyy';
  −
        }
  −
      $display_date='';
  −
      if($dat_fmt == 'dd-mm-yyyy')
  −
      {
  −
        $display_date = date('d-m-Y');
  −
      }
  −
      elseif($dat_fmt == 'mm-dd-yyyy')
  −
      {
  −
        $display_date = date('m-d-Y');
  −
      }
  −
      elseif($dat_fmt == 'yyyy-mm-dd')
  −
      {
  −
        $display_date = date('Y-m-d');
  −
      }
  −
       
  −
      $log->debug("Exiting getNewDisplayDate method ...");
  −
      return $display_date;
  −
  }
  −
</syntaxhighlight>
     −
=== Codice Sorgente Modificato ===
+
External links
<syntaxhighlight lang="php">
  −
  /** This function returns the date in user specified format.
  −
  * Takes no param, receives the date format from current user object
  −
  */
  −
 
  −
  function getNewDisplayDate()  {
  −
      global $log;
  −
      $log->debug("Entering getNewDisplayDate() method ...");
  −
      $log->info("in getNewDisplayDate ");
  −
 
  −
      $display_date='';
  −
      $log->debug("Exiting getNewDisplayDate method ...");
  −
      return $display_date;
  −
  }
  −
</syntaxhighlight>
     −
=== Modifica Solo per Moduli Specifici ===
+
----
Il cambiamento introdotto influenzer&agrave; il comportamento di tutti i moduli di VtigerCRM. Naturalmente potrebbe essere desiderabile una modifica meno invasiva. Potrebbe valere ad esempio la pena di '''modificare il comportamento dei controlli calendario per alcuni moduli specifici''' lasciando invece inalterato il resto del programma. Supponendo di voler limitare la modifica al modulo predefinito "Progetti" ed al modulo personalizzato "Polizze", il codice sorgente dovra' essere modificato come segue:
  −
<syntaxhighlight lang="php">
  −
  /** This function returns the date in user specified format.
  −
  * Takes no param, receives the date format from current user object
  −
  */
  −
 
  −
  function getNewDisplayDate()  {
  −
      global $log;
  −
      $log->debug("Entering getNewDisplayDate() method ...");
  −
      $log->info("in getNewDisplayDate ");
  −
 
  −
      $display_date='';
  −
      $module_name = $_REQUEST['module'];
  −
      switch($module_name)  {
  −
      case "Policy":
  −
        $display_date = '';
  −
      break;
  −
      case "Project":
  −
        $display_date = '';
  −
      break;
  −
      default:
  −
        global $current_user;
  −
        $dat_fmt = $current_user->date_format;
  −
        if($dat_fmt == '')  {
  −
            $dat_fmt = 'dd-mm-yyyy';
  −
        }
  −
        if($dat_fmt == 'dd-mm-yyyy')  {
  −
            $display_date = date('d-m-Y');
  −
        }  elseif($dat_fmt == 'mm-dd-yyyy')  {
  −
            $display_date = date('m-d-Y');
  −
        }  elseif($dat_fmt == 'yyyy-mm-dd')  {
  −
            $display_date = date('Y-m-d');
  −
        }
  −
      }
  −
      $log->debug("Exiting getNewDisplayDate method ...");
  −
      return $display_date;
  −
  }
  −
</syntaxhighlight>
  −
 
  −
La riga:
  −
<syntaxhighlight lang="php">
  −
      $module_name = $_REQUEST['module'];
  −
</syntaxhighlight>
  −
 
  −
salva in una variabile locale il nome del modulo interessato, che verr&agrave; utilizzato in un apposito filtro. Il costrutto "case" consente di filtrare i moduli applicando codice specifico per ognuno di essi. In particolare le righe
  −
<syntaxhighlight lang="php">
  −
      case "Policy":
  −
        $display_date = '';
  −
      break;
  −
      case "Project":
  −
        $display_date = '';
  −
      break;
  −
</syntaxhighlight>
  −
 
  −
impongono un valore nullo in fase di inserimento e modifica dei campi data per i moduli "Polizze" e "Progetti". Infine le righe
  −
<syntaxhighlight lang="php">
  −
      default:
  −
        global $current_user;
  −
        $dat_fmt = $current_user->date_format;
  −
        if($dat_fmt == '')  {
  −
            $dat_fmt = 'dd-mm-yyyy';
  −
        }
  −
        if($dat_fmt == 'dd-mm-yyyy')  {
  −
            $display_date = date('d-m-Y');
  −
        }  elseif($dat_fmt == 'mm-dd-yyyy')  {
  −
            $display_date = date('m-d-Y');
  −
        }  elseif($dat_fmt == 'yyyy-mm-dd')  {
  −
            $display_date = date('Y-m-d');
  −
        }
  −
      }
  −
</syntaxhighlight>
  −
 
  −
specificano che venga applicato il comportamento standard del controllo calendario in tutti gli altri moduli di VtigerCRM.
  −
 
  −
L'esempio presentato &egrave; semplice, ma il codice pu&ograve; essere modificato ed ampliato ulteriormente per eseguire controlli sui valori suggeriti, imporre un comportamento specifico per ogni modulo oppure eseguire ulteriori elaborazioni sui dati. Pu&ograve; essere considerato una base di partenza generica.
  −
 
  −
 
  −
Per commenti, consigli, domande inviate una e-mail all'indirizzo studiosg [chiocciola] giustetti [punto] net.
      +
* [http://www.alsa-project.org/main/index.php/Documentation The ALSA project documentation page]
 +
* [https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture The ALSA related page in the ArchLinux WIKI]
    
----
 
----
   −
Lingue: [[vtigercrm_update_date_field_default_behavior | English]] - '''Italiano'''
+
{{footer_en | link_page=scheda_sonora_di_default}}