/[qemu]/qemu/audio/ossaudio.c
ViewVC logotype

Diff of /qemu/audio/ossaudio.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by bellard, Sun Oct 30 18:58:22 2005 UTC revision 1.7 by bellard, Sat Nov 5 18:55:27 2005 UTC
# Line 91  static void GCC_FMT_ATTR (3, 4) oss_loge Line 91  static void GCC_FMT_ATTR (3, 4) oss_loge
91  {  {
92      va_list ap;      va_list ap;
93    
94      AUD_log (AUDIO_CAP, "Can not initialize %s\n", typ);      AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
95    
96      va_start (ap, fmt);      va_start (ap, fmt);
97      AUD_vlog (AUDIO_CAP, fmt, ap);      AUD_vlog (AUDIO_CAP, fmt, ap);
# Line 179  static int oss_to_audfmt (int ossfmt, au Line 179  static int oss_to_audfmt (int ossfmt, au
179      return 0;      return 0;
180  }  }
181    
182  #ifdef DEBUG_MISMATCHES  #if defined DEBUG_MISMATCHES || defined DEBUG
183  static void oss_dump_info (struct oss_params *req, struct oss_params *obt)  static void oss_dump_info (struct oss_params *req, struct oss_params *obt)
184  {  {
185      dolog ("parameter | requested value | obtained value\n");      dolog ("parameter | requested value | obtained value\n");
# Line 253  static int oss_open (int in, struct oss_ Line 253  static int oss_open (int in, struct oss_
253      obt->fragsize = abinfo.fragsize;      obt->fragsize = abinfo.fragsize;
254      *pfd = fd;      *pfd = fd;
255    
256    #ifdef DEBUG_MISMATCHES
257      if ((req->fmt != obt->fmt) ||      if ((req->fmt != obt->fmt) ||
258          (req->nchannels != obt->nchannels) ||          (req->nchannels != obt->nchannels) ||
259          (req->freq != obt->freq) ||          (req->freq != obt->freq) ||
260          (req->fragsize != obt->fragsize) ||          (req->fragsize != obt->fragsize) ||
261          (req->nfrags != obt->nfrags)) {          (req->nfrags != obt->nfrags)) {
 #ifdef DEBUG_MISMATCHES  
262          dolog ("Audio parameters mismatch\n");          dolog ("Audio parameters mismatch\n");
263          oss_dump_info (req, obt);          oss_dump_info (req, obt);
 #endif  
264      }      }
265    #endif
266    
267  #ifdef DEBUG  #ifdef DEBUG
268      oss_dump_info (req, obt);      oss_dump_info (req, obt);
# Line 283  static int oss_run_out (HWVoiceOut *hw) Line 283  static int oss_run_out (HWVoiceOut *hw)
283      st_sample_t *src;      st_sample_t *src;
284      struct audio_buf_info abinfo;      struct audio_buf_info abinfo;
285      struct count_info cntinfo;      struct count_info cntinfo;
286        int bufsize;
287    
288      live = audio_pcm_hw_get_live_out (hw);      live = audio_pcm_hw_get_live_out (hw);
289      if (!live) {      if (!live) {
290          return 0;          return 0;
291      }      }
292    
293        bufsize = hw->samples << hw->info.shift;
294    
295      if (oss->mmapped) {      if (oss->mmapped) {
296          int bytes;          int bytes;
297    
# Line 300  static int oss_run_out (HWVoiceOut *hw) Line 303  static int oss_run_out (HWVoiceOut *hw)
303    
304          if (cntinfo.ptr == oss->old_optr) {          if (cntinfo.ptr == oss->old_optr) {
305              if (abs (hw->samples - live) < 64) {              if (abs (hw->samples - live) < 64) {
306                  dolog ("warning: overrun\n");                  dolog ("warning: Overrun\n");
307              }              }
308              return 0;              return 0;
309          }          }
# Line 309  static int oss_run_out (HWVoiceOut *hw) Line 312  static int oss_run_out (HWVoiceOut *hw)
312              bytes = cntinfo.ptr - oss->old_optr;              bytes = cntinfo.ptr - oss->old_optr;
313          }          }
314          else {          else {
315              bytes = hw->bufsize + cntinfo.ptr - oss->old_optr;              bytes = bufsize + cntinfo.ptr - oss->old_optr;
316          }          }
317    
318          decr = audio_MIN (bytes >> hw->info.shift, live);          decr = audio_MIN (bytes >> hw->info.shift, live);
# Line 321  static int oss_run_out (HWVoiceOut *hw) Line 324  static int oss_run_out (HWVoiceOut *hw)
324              return 0;              return 0;
325          }          }
326    
327          if (abinfo.bytes < 0 || abinfo.bytes > hw->bufsize) {          if (abinfo.bytes < 0 || abinfo.bytes > bufsize) {
328              ldebug ("warning: invalid available size, size=%d bufsize=%d\n",              ldebug ("warning: Invalid available size, size=%d bufsize=%d\n",
329                      abinfo.bytes, hw->bufsize);                      abinfo.bytes, bufsize);
330              return 0;              return 0;
331          }          }
332    
# Line 362  static int oss_run_out (HWVoiceOut *hw) Line 365  static int oss_run_out (HWVoiceOut *hw)
365                  int wsamples = written >> hw->info.shift;                  int wsamples = written >> hw->info.shift;
366                  int wbytes = wsamples << hw->info.shift;                  int wbytes = wsamples << hw->info.shift;
367                  if (wbytes != written) {                  if (wbytes != written) {
368                      dolog ("warning: misaligned write %d (requested %d), "                      dolog ("warning: Misaligned write %d (requested %d), "
369                             "alignment %d\n",                             "alignment %d\n",
370                             wbytes, written, hw->info.align + 1);                             wbytes, written, hw->info.align + 1);
371                  }                  }
# Line 396  static void oss_fini_out (HWVoiceOut *hw Line 399  static void oss_fini_out (HWVoiceOut *hw
399    
400      if (oss->pcm_buf) {      if (oss->pcm_buf) {
401          if (oss->mmapped) {          if (oss->mmapped) {
402              err = munmap (oss->pcm_buf, hw->bufsize);              err = munmap (oss->pcm_buf, hw->samples << hw->info.shift);
403              if (err) {              if (err) {
404                  oss_logerr (errno, "Failed to unmap buffer %p, size %d\n",                  oss_logerr (errno, "Failed to unmap buffer %p, size %d\n",
405                              oss->pcm_buf, hw->bufsize);                              oss->pcm_buf, hw->samples << hw->info.shift);
406              }              }
407          }          }
408          else {          else {
# Line 409  static void oss_fini_out (HWVoiceOut *hw Line 412  static void oss_fini_out (HWVoiceOut *hw
412      }      }
413  }  }
414    
415  static int oss_init_out (HWVoiceOut *hw, int freq, int nchannels, audfmt_e fmt)  static int oss_init_out (HWVoiceOut *hw, audsettings_t *as)
416  {  {
417      OSSVoiceOut *oss = (OSSVoiceOut *) hw;      OSSVoiceOut *oss = (OSSVoiceOut *) hw;
418      struct oss_params req, obt;      struct oss_params req, obt;
# Line 417  static int oss_init_out (HWVoiceOut *hw, Line 420  static int oss_init_out (HWVoiceOut *hw,
420      int err;      int err;
421      int fd;      int fd;
422      audfmt_e effective_fmt;      audfmt_e effective_fmt;
423        audsettings_t obt_as;
424    
425      req.fmt = aud_to_ossfmt (fmt);      req.fmt = aud_to_ossfmt (as->fmt);
426      req.freq = freq;      req.freq = as->freq;
427      req.nchannels = nchannels;      req.nchannels = as->nchannels;
428      req.fragsize = conf.fragsize;      req.fragsize = conf.fragsize;
429      req.nfrags = conf.nfrags;      req.nfrags = conf.nfrags;
430    
# Line 434  static int oss_init_out (HWVoiceOut *hw, Line 438  static int oss_init_out (HWVoiceOut *hw,
438          return -1;          return -1;
439      }      }
440    
441        obt_as.freq = obt.freq;
442        obt_as.nchannels = obt.nchannels;
443        obt_as.fmt = effective_fmt;
444    
445      audio_pcm_init_info (      audio_pcm_init_info (
446          &hw->info,          &hw->info,
447          obt.freq,          &obt_as,
         obt.nchannels,  
         effective_fmt,  
448          audio_need_to_swap_endian (endianness)          audio_need_to_swap_endian (endianness)
449          );          );
450      oss->nfrags = obt.nfrags;      oss->nfrags = obt.nfrags;
451      oss->fragsize = obt.fragsize;      oss->fragsize = obt.fragsize;
452      hw->bufsize = obt.nfrags * obt.fragsize;  
453        if (obt.nfrags * obt.fragsize & hw->info.align) {
454            dolog ("warning: Misaligned DAC buffer, size %d, alignment %d\n",
455                   obt.nfrags * obt.fragsize, hw->info.align + 1);
456        }
457    
458        hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
459    
460      oss->mmapped = 0;      oss->mmapped = 0;
461      if (conf.try_mmap) {      if (conf.try_mmap) {
462          oss->pcm_buf = mmap (0, hw->bufsize, PROT_READ | PROT_WRITE,          oss->pcm_buf = mmap (
463                               MAP_SHARED, fd, 0);              0,
464                hw->samples << hw->info.shift,
465                PROT_READ | PROT_WRITE,
466                MAP_SHARED,
467                fd,
468                0
469                );
470          if (oss->pcm_buf == MAP_FAILED) {          if (oss->pcm_buf == MAP_FAILED) {
471              oss_logerr (errno, "Failed to map %d bytes of DAC\n",              oss_logerr (errno, "Failed to map %d bytes of DAC\n",
472                          hw->bufsize);                          hw->samples << hw->info.shift);
473          } else {          } else {
474              int err;              int err;
475              int trig = 0;              int trig = 0;
# Line 472  static int oss_init_out (HWVoiceOut *hw, Line 490  static int oss_init_out (HWVoiceOut *hw,
490              }              }
491    
492              if (!oss->mmapped) {              if (!oss->mmapped) {
493                  err = munmap (oss->pcm_buf, hw->bufsize);                  err = munmap (oss->pcm_buf, hw->samples << hw->info.shift);
494                  if (err) {                  if (err) {
495                      oss_logerr (errno, "Failed to unmap buffer %p size %d\n",                      oss_logerr (errno, "Failed to unmap buffer %p size %d\n",
496                                  oss->pcm_buf, hw->bufsize);                                  oss->pcm_buf, hw->samples << hw->info.shift);
497                  }                  }
498              }              }
499          }          }
500      }      }
501    
502      if (!oss->mmapped) {      if (!oss->mmapped) {
503          oss->pcm_buf = qemu_mallocz (hw->bufsize);          oss->pcm_buf = audio_calloc (
504                AUDIO_FUNC,
505                hw->samples,
506                1 << hw->info.shift
507                );
508          if (!oss->pcm_buf) {          if (!oss->pcm_buf) {
509                dolog ("Could not allocate DAC buffer (%d bytes)\n",
510                       hw->samples << hw->info.shift);
511              oss_anal_close (&fd);              oss_anal_close (&fd);
512              return -1;              return -1;
513          }          }
# Line 528  static int oss_ctl_out (HWVoiceOut *hw, Line 552  static int oss_ctl_out (HWVoiceOut *hw,
552      return 0;      return 0;
553  }  }
554    
555  static int oss_init_in (HWVoiceIn *hw,  static int oss_init_in (HWVoiceIn *hw, audsettings_t *as)
                         int freq, int nchannels, audfmt_e fmt)  
556  {  {
557      OSSVoiceIn *oss = (OSSVoiceIn *) hw;      OSSVoiceIn *oss = (OSSVoiceIn *) hw;
558      struct oss_params req, obt;      struct oss_params req, obt;
# Line 537  static int oss_init_in (HWVoiceIn *hw, Line 560  static int oss_init_in (HWVoiceIn *hw,
560      int err;      int err;
561      int fd;      int fd;
562      audfmt_e effective_fmt;      audfmt_e effective_fmt;
563        audsettings_t obt_as;
564    
565      req.fmt = aud_to_ossfmt (fmt);      req.fmt = aud_to_ossfmt (as->fmt);
566      req.freq = freq;      req.freq = as->freq;
567      req.nchannels = nchannels;      req.nchannels = as->nchannels;
568      req.fragsize = conf.fragsize;      req.fragsize = conf.fragsize;
569      req.nfrags = conf.nfrags;      req.nfrags = conf.nfrags;
570      if (oss_open (1, &req, &obt, &fd)) {      if (oss_open (1, &req, &obt, &fd)) {
# Line 553  static int oss_init_in (HWVoiceIn *hw, Line 577  static int oss_init_in (HWVoiceIn *hw,
577          return -1;          return -1;
578      }      }
579    
580        obt_as.freq = obt.freq;
581        obt_as.nchannels = obt.nchannels;
582        obt_as.fmt = effective_fmt;
583    
584      audio_pcm_init_info (      audio_pcm_init_info (
585          &hw->info,          &hw->info,
586          obt.freq,          &obt_as,
         obt.nchannels,  
         effective_fmt,  
587          audio_need_to_swap_endian (endianness)          audio_need_to_swap_endian (endianness)
588          );          );
589      oss->nfrags = obt.nfrags;      oss->nfrags = obt.nfrags;
590      oss->fragsize = obt.fragsize;      oss->fragsize = obt.fragsize;
591      hw->bufsize = obt.nfrags * obt.fragsize;  
592      oss->pcm_buf = qemu_mallocz (hw->bufsize);      if (obt.nfrags * obt.fragsize & hw->info.align) {
593            dolog ("warning: Misaligned ADC buffer, size %d, alignment %d\n",
594                   obt.nfrags * obt.fragsize, hw->info.align + 1);
595        }
596    
597        hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
598        oss->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
599      if (!oss->pcm_buf) {      if (!oss->pcm_buf) {
600            dolog ("Could not allocate ADC buffer (%d bytes)\n",
601                   hw->samples << hw->info.shift);
602          oss_anal_close (&fd);          oss_anal_close (&fd);
603          return -1;          return -1;
604      }      }
# Line 623  static int oss_run_in (HWVoiceIn *hw) Line 657  static int oss_run_in (HWVoiceIn *hw)
657    
658              if (nread > 0) {              if (nread > 0) {
659                  if (nread & hw->info.align) {                  if (nread & hw->info.align) {
660                      dolog ("warning: misaligned read %d (requested %d), "                      dolog ("warning: Misaligned read %d (requested %d), "
661                             "alignment %d\n", nread, bufs[i].add << hwshift,                             "alignment %d\n", nread, bufs[i].add << hwshift,
662                             hw->info.align + 1);                             hw->info.align + 1);
663                  }                  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26