Markus Rechberger / Audio Mixer
 
StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

calculate audio balance

Ein sehr altes Beispiel, als ich mich mal mit /dev/mixer beschäftigt habe..irgendwann bin ich ja draufgekommen das man das ganze bitweise betrachten sollte :-)

bit denkweise:

die volume geht jeweils von 0-100 das heisst 25700 entspricht links und rechts 100%, 25600 (links 100%) - 100 (rechts 100%) das ganze ist bitweise verknüpft, 100<<8 + 100 == 25700 das ganze benötigt 16 Bit (=soviel wird vom datentyp integer bereitgestellt)

left&right volume werden in der selben zahl versteckt die man mittels ioctl an die hardware übergibt
0-25700
256*n == rechts
n == links

value geht von 1-100

will man also die gesamte volume verändern muss man l&r beachten (am besten auslesen und weiterverarbeiten) 

Beispiel:

  float left, right, left_set_to, right_set_to;
  int valuetoset, value;
  float calcvalue;
  get_volume(&value);
  right=(int)value/256;
  left=(int)value%(int)256;
  (left>right)?calcvalue=left:calcvalue=right;
  valuetoset=(gint)adj->value;
  if(valuetoset>100){
          left_set_to=(float)calcvalue*((200-(float)valuetoset)/100);
          right_set_to=(float)calcvalue;
  } else {
          left_set_to=(float)calcvalue;
          right_set_to=(float)calcvalue*(((float)valuetoset)/100);
  }
  valuetoset=(int)left_set_to+(int)right_set_to*256;
  volume_scale(valuetoset);
  return FALSE;

values auslesen:

void get_volume(int *x){
        ioctl(pcm_fd,SOUND_MIXER_READ_VOLUME /*PCM */,x);
}

void volume_scale(int x){
        ioctl(pcm_fd,SOUND_MIXER_WRITE_VOLUME /*PCM*/,&x);
}


StartSeite | MarkusRechberger/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 13. Oktober 2004 0:24 (diff))
Suchbegriff: gesucht wird
im Titel
im Text