Google
 

Open Sound System
The Hitchhiker's Guide to OSS 4.1 Internals

Do you have problems with sound/audio application development? Don't panic! Click here for help!

BeOS/module.inc

OSS module wrapper for BeOS/Haiku

Description



This file will be included from the auto-generated drv_cfg.c files. Under UnixWare and OpenServer this will will be compiled during the initial build of OSS (in the development system).


This file is part of Open Sound System.

Copyright (C) 4Front Technologies 1996-2007.

This this source file is released under GPL v2 license (no other versions). See the COPYING file included in the main directory of this source distribution. Please contact sales@opensound.com for further info.


#include <PCI.h>

//pci_module_info *gPCI = NULL;
extern pci_module_info *gPCI;

#if DRIVER_TYPE==DRV_VIRTUAL
static oss_device_t *osdev = NULL;
#endif

#if DRIVER_TYPE==DRV_PCI
int DRIVER_PROBE()
{
  oss_device_t *osdev;
  pci_info pcii;
  uint32 pci_index = 0;
  uint32 count = 0;
  int err = ENOENT;
  static int instance = 0;
  FENTRY();
  
  /* while there are more pci devices */
  while ((*gPCI->get_nth_pci_info)(pci_index, &pcii) == B_NO_ERROR)
    {
      int vendor;
      bool match = false;
      bool sub = true;

      /* we first loop through all subsystem entries, then loop again */
rescan:
      vendor = 0;
      /* if we match a supported vendor */
      while (id_table[vendor].vendor)
        {

          /* check for function vendor & device id */
          if (!sub &&
              id_table[vendor].subsystem == false &&
              id_table[vendor].vendor == pcii.vendor_id &&
              id_table[vendor].product == pcii.device_id)
            {
              dprintf("oss: matching pci %04x,%04x\n", id_table[vendor].vendor, id_table[vendor].product);
              match = true;
            }

          /* check for subsystem vendor & device id */
          if (sub &&
              id_table[vendor].subsystem == true &&
              pcii.header_type == 0 &&
              id_table[vendor].vendor == pcii.u.h0.subsystem_vendor_id &&
              id_table[vendor].product == pcii.u.h0.subsystem_id)
            {
              dprintf("oss: matching pci subsystem %04x,%04x\n", id_table[vendor].vendor, id_table[vendor].product);
              match = true;
            }

          if (match)
            {
              dev_info_t *di;
              di = PMALLOC(NULL, sizeof(dev_info_t));
              if (!di)
                break;
              memcpy(di, &pcii, sizeof(pcii));
              if ((osdev =
                   osdev_create (di, DRIVER_TYPE, instance, DRIVER_NICK, NULL)) == NULL)
                {
                  break;
                }

              /* should be called once, but we need an osdev */
              oss_load_options (osdev, local_driver_options);

              if (!DRIVER_ATTACH (osdev))
                {
                  cmn_err (CE_WARN, "Attach failed\n");
                  osdev_delete (osdev);
                  break;
                }

              instance++;
              count++;
              break;
            }
          vendor++;
        }
        /* we've checked for subsystem IDs, now rescan for IDs */
        if (!match && sub) {
          sub = false;
          goto rescan;
        }
      /* next pci_info struct, please */
      pci_index++;
    }

  oss_audio_delayed_attach ();

  if (count)
    err = 0;
err:
  FEXITR(err);
  return err;
}
#endif

#if DRIVER_TYPE==DRV_VIRTUAL
int DRIVER_PROBE()
{
  int err = EIO;
  FENTRY();
  if ((osdev =
       osdev_create (NULL, DRIVER_TYPE, 0, DRIVER_NICK, NULL)) == NULL)
    {
      goto err;
    }

  oss_load_options (osdev, local_driver_options);

  if (!DRIVER_ATTACH (osdev))
    {
      cmn_err (CE_WARN, "Attach failed\n");
      osdev_delete (osdev);
      goto err;
    }

  err = 0;
err:
  FEXITR(err);
  return err;
}
#endif






static status_t
stdops(int32 op, ...)
{
  status_t err;
  switch (op)
    {
    case B_MODULE_INIT:
      err = get_module(B_PCI_MODULE_NAME, (module_info **)&gPCI);
      return err;

    case B_MODULE_UNINIT:
      //err = unload_driver(DRIVER_NICK);
      //if (err < B_OK)
      //  return err;
      put_module(B_PCI_MODULE_NAME);
      return B_OK;

    }
  return B_ERROR;
}

oss_drv_module_info DRIVER_MODULE_OBJECT = {
	{
		OSS_MAKE_DRV_MOD_NAME(DRIVER_NICK),
		0,
		stdops,
	},
	DRIVER_PROBE,
	DRIVER_ATTACH,
	DRIVER_DETACH
};


Copyright (C) 4Front Technologies, 2007. All rights reserved.

Back to index OSS web site


Copyright (C) 4Front Technologies, 2007. All rights reserved.
Back to index OSS web site