root/src/add-ons/kernel/drivers/audio/null/driver.c
/*
 * Copyright 2007 Haiku Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Bek, host.haiku@gmx.de
 */
#include "driver.h"

int32 api_version = B_CUR_DRIVER_API_VERSION;
device_t device;


status_t
init_hardware(void)
{
        dprintf("null_audio: %s\n", __func__);
        return B_OK;
}


status_t
init_driver(void)
{
        dprintf("null_audio: %s\n", __func__);
        device.running = false;
        return B_OK;
}


void
uninit_driver(void)
{
}


const char**
publish_devices(void)
{
        static const char* published_paths[] = {
                MULTI_AUDIO_DEV_PATH "/null/0",
                NULL
        };
        dprintf("null_audio: %s\n", __func__);

        return published_paths;
}


static status_t
null_audio_open (const char *name, uint32 flags, void** cookie)
{
        dprintf("null_audio: %s\n" , __func__ );
        *cookie = &device;
        return B_OK;
}


static status_t
null_audio_read (void* cookie, off_t a, void* b, size_t* num_bytes)
{
        dprintf("null_audio: %s\n" , __func__ );
        // Audio drivers are not supposed to return anything
        // inside here
        *num_bytes = 0;
        return B_IO_ERROR;
}


static status_t
null_audio_write (void* cookie, off_t a, const void* b, size_t* num_bytes)
{
        dprintf("null_audio: %s\n" , __func__ );
        // Audio drivers are not supposed to return anything
        // inside here
        *num_bytes = 0;
        return B_IO_ERROR;
}


static status_t
null_audio_control (void* cookie, uint32 op, void* arg, size_t len)
{
        //dprintf("null_audio: %s\n" , __func__ );
        // In case we have a valid cookie, initialized
        // the driver and hardware connection properly
        // Simply pass through to the multi audio hooks
        if (cookie)
                return multi_audio_control(cookie, op, arg, len);
        else
                dprintf("null_audio: %s called without cookie\n" , __func__);

        // Return error in case we have no valid setup
        return B_BAD_VALUE;
}


static status_t
null_audio_close (void* cookie)
{
        device_t* device = (device_t*) cookie;
        dprintf("null_audio: %s\n" , __func__ );
        if (device && device->running)
                null_stop_hardware(device);
        return B_OK;
}


static status_t
null_audio_free (void* cookie)
{
        dprintf("null_audio: %s\n" , __func__ );
        return B_OK;
}


device_hooks driver_hooks = {
        null_audio_open,
        null_audio_close,
        null_audio_free,
        null_audio_control,
        null_audio_read,
        null_audio_write
};


device_hooks*
find_device(const char* name)
{
        return &driver_hooks;
}