ReactOS 0.4.15-dev-7924-g5949c20
wave.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: mkernel/modules/sound/sound.c
5 * PURPOSE: SoundBlaster 16 Driver
6 * PROGRAMMER: Snatched from David Welch (welch@mcmail.com)
7 * Modified for Soundblaster by Robert Bergkvist (fragdance@hotmail.com)
8 * UPDATE HISTORY:
9 * ??/??/??: Created
10 *
11 */
12
13/* FUNCTIONS **************************************************************/
14
15#include <ntddk.h>
16#include <string.h>
17#include <devices.h>
18
19#include "sb16.h"
20#include "dsp.h"
21#include "mixer.h"
22#include "in.h"
23#include "wave.h"
24
25#define NDEBUG
26#include <debug.h>
27
29
32
34{
35 DPRINT1("interrupt\n");
36 return FALSE;
37}
38
40{
41 ULONG MappedIrq;
42 KIRQL Dirql;
45 unsigned int newmask;
46
47 unsigned int i;
48 unsigned int tmp[255];
49 i=0;
51 do
52 {
53// tmp[i++]=get_dma_page(0x0fffff);
54// DPRINT1("0x%x ",tmp[i-1]);
55 }
56 while((tmp[i-1]&0xffff)!=0);
57 // free_page((tmp[0]),i-1);
58 sb16.buffer=((unsigned char*)tmp[i-1]);
59
60 /*
61 * Because this is used by almost every subsystem including irqs it
62 * must be atomic. The following code sequence disables interrupts after
63 * saving the previous state of the interrupt flag
64 */
65
66 _disable();
67
68 memcpy(sb16.buffer,(&wave->data),wave->dLen);
69
70
71 MappedIrq = HalGetInterruptVector(Internal,0,0,8+sb16.irq,&Dirql,&Affinity);
72
73
74
76
77 // mask=inb(0x21);
78 newmask=((int)1<<sb16.irq);
79 // outb(0x21,(mask&~newmask));
80
81 // Restore the interrupt flag
82 _enable();
83
84
85
86 // disable_dma(sb16.dma8);
87 //outb(0x0a,5);
88 // clear_dma_ff(1);
89 //outb(0xc,0);
90 // set_dma_count(1,wave->dLen);
91 //set_dma_mode(1,DMA_MODE_WRITE);
92 //outb(0xb,0x49);
93 //outb(0x3,(wave->dLen)&0xff);
94 //outb(0x3,((unsigned int)(wave->dLen)>>8)&0xff);
95 //set_dma_addr(sb16.dma8,(unsigned int)sb16.buffer);
96 //outb(0x83,(((unsigned int)(sb16.buffer-IDMAP_BASE)>>16))&0xf);
97 //outb(0x2,((unsigned int)sb16.buffer&0xff));
98 //outb(0x2,(((unsigned int)(sb16.buffer-IDMAP_BASE)>>8))&0xff);
99 //enable_dma(sb16.dma8);
100 //outb(0xa,1);
101
102 write_dsp(sb16.base,0x00D1);
103
104 write_dsp(sb16.base,0x40);
105 write_dsp(sb16.base,((unsigned char)256-(1000000/wave->nSamplesPerSec)));
106
107// outb(sb16.base + 4, (int) 0xa);
108// outb(sb16.base + 5, (int) 0x00);
109
110// outb(sb16.base + 4, (int) 4);
111// outb(sb16.base + 5, (int) 0xFF);
112
113// outb(sb16.base + 4, (int) 0x22);
114// outb(sb16.base + 5, (int) 0xFF);
115
116 write_dsp(sb16.base,0x14);
117 write_dsp(sb16.base,(wave->dLen&0x00ff));
118 write_dsp(sb16.base,((wave->dLen)&0xff00)>>8);
119
120// write_dsp(sb16.base,0xc0);
121// write_dsp(sb16.base,0x0);
122// OldIRQ=HalGetInterruptVector(Internal,0,0,irq+8,&irql,&affinity);
123// DPRINT1("OldIRQ: 0x%x\n",OldIRQ);
124
125// status=IoConnectInterrupt(&IrqObject,playRoutine,0,NULL,OldIRQ,irql,irql,0,FALSE,affinity,FALSE);
126// if(status!=STATUS_SUCCESS) DPRINT1("Couldn't set irq\n");
127// else DPRINT1("IRQ set\n");
128
129}
130
132{
133 DPRINT1("wave.rID: %c%c%c%c\n",wave->rID[0],wave->rID[1],wave->rID[2],wave->rID[3]);
134 DPRINT1("wave.rLen: 0x%x\n",wave->rLen);
135 DPRINT1("wave.wID: %c%c%c%c\n",wave->wID[0],wave->wID[1],wave->wID[2],wave->wID[3]);
136 DPRINT1("wave.fID: %c%c%c%c\n",wave->fID[0],wave->fID[1],wave->fID[2],wave->fID[3]);
137 DPRINT1("wave.fLen: 0x%x\n",wave->fLen);
138 DPRINT1("wave.wFormatTag: 0x%x\n",wave->wFormatTag);
139 DPRINT1("wave.nChannels: 0x%x\n",wave->nChannels);
140 DPRINT1("wave.nSamplesPerSec: 0x%x\n",wave->nSamplesPerSec);
141 DPRINT1("wave.nAvgBytesPerSec: 0x%x\n",wave->nAvgBytesPerSec);
142 DPRINT1("wave.nBlockAlign: 0x%x\n",wave->nBlockAlign);
143 DPRINT1("wave.FormatSpecific: 0x%x\n",wave->FormatSpecific);
144 DPRINT1("wave.dID: %c%c%c%c\n",wave->dID[0],wave->dID[1],wave->dID[2],wave->dID[3]);
145 DPRINT1("wave.dLen: 0x%x\n",wave->dLen);
146}
147
149{
150 return FALSE;
151}
unsigned char BOOLEAN
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
ULONG_PTR KAFFINITY
Definition: compat.h:85
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
BOOLEAN playRoutine(PKINTERRUPT Interrupt, PVOID ServiceContext)
Definition: wave.c:148
ULONG OldIRQ
Definition: wave.c:30
void sb16_play(WAVE_HDR *wave)
Definition: wave.c:39
void dump_wav(WAVE_HDR *wave)
Definition: wave.c:131
SB16 sb16
Definition: wave.c:28
static BOOLEAN NTAPI DMAOutputISR(PKINTERRUPT Interrupt, PVOID ServiceContext)
Definition: wave.c:33
PKINTERRUPT IrqObject
Definition: wave.c:31
NTHALAPI ULONG NTAPI HalGetInterruptVector(INTERFACE_TYPE, ULONG, ULONG, ULONG, PKIRQL, PKAFFINITY)
void write_dsp(unsigned short base, unsigned char data)
Definition: dsp.c:73
UCHAR KIRQL
Definition: env_spec_w32.h:591
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
@ Internal
Definition: hwresource.cpp:137
unsigned char wave[]
Definition: in.h:3
void __cdecl _disable(void)
Definition: intrin_arm.h:365
void __cdecl _enable(void)
Definition: intrin_arm.h:373
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
Definition: irq.c:22
Definition: sb16.h:2
unsigned char * buffer
Definition: sb16.h:7
unsigned char irq
Definition: sb16.h:4
unsigned short base
Definition: sb16.h:3
Definition: wave.h:6
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
Definition: wdfinterrupt.h:379
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
Definition: halfuncs.h:174
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID ServiceContext
Definition: iofuncs.h:801