mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2024-12-26 23:36:32 +00:00
proper stereo osc
This commit is contained in:
parent
59d8ba00d8
commit
7d75cfe958
2 changed files with 103 additions and 108 deletions
|
@ -51,15 +51,9 @@ U0 AudioPlayNote(U8 note, U8 velocity, U8 instrument) {
|
||||||
|
|
||||||
//ApplyEnvelope(buffer, SAMPLE_RATE); // TODO: Apply fade in and fade out
|
//ApplyEnvelope(buffer, SAMPLE_RATE); // TODO: Apply fade in and fade out
|
||||||
|
|
||||||
//I64 i;
|
gSharedBuffer = buffer;
|
||||||
//for (i = 0; i < bufferSize; i++) {
|
gSharedBufferSize = bufferSize;
|
||||||
// Copy data to the shared oscilloscope buffer
|
gSharedBufferPosition = 0; // Resetting the position
|
||||||
//gSharedBuffer[i] = buffer[i];
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
UpdateSharedBuffer(buffer, SAMPLE_RATE/winmgr.fps);
|
|
||||||
|
|
||||||
// Play the buffer using the AC97 driver:
|
// Play the buffer using the AC97 driver:
|
||||||
AudioSFXPlay(buffer, bufferSize);
|
AudioSFXPlay(buffer, bufferSize);
|
||||||
// silly debug print
|
// silly debug print
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
|
|
||||||
// #define CHUNK_SIZE 1470 // (44100 / 30) // 30 FPS
|
|
||||||
// winmgr.fps
|
|
||||||
|
|
||||||
// Globals
|
// Globals
|
||||||
|
//#define CHUNK_SIZE 1470
|
||||||
|
|
||||||
|
#define SAMPLE_RATE 44100
|
||||||
|
|
||||||
U32 *gSharedBuffer;
|
U32 *gSharedBuffer;
|
||||||
I64 gSharedBufferPosition = 0;
|
I64 gSharedBufferPosition = 0;
|
||||||
I64 gSharedBufferSize;
|
I64 gSharedBufferSize;
|
||||||
|
|
||||||
|
I32 GetSignedSample(I64 index) {
|
||||||
|
U32 sample = gSharedBuffer[index];
|
||||||
|
I32 signedValue;
|
||||||
|
signedValue = sample - 0x80000000; // Convert U32 to centered I32
|
||||||
|
return signedValue;
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize shared buffer
|
// Initialize shared buffer
|
||||||
U0 InitSharedBuffer(I64 size)
|
U0 InitSharedBuffer(I64 size)
|
||||||
{
|
{
|
||||||
|
@ -15,58 +22,51 @@ U0 InitSharedBuffer(I64 size)
|
||||||
gSharedBufferPosition = 0;
|
gSharedBufferPosition = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update shared buffer in your audio playback function
|
U0 DrawIt(CTask *task, CDC *dc)
|
||||||
U0 UpdateSharedBuffer(U32 *buffer, I64 size)
|
|
||||||
{
|
{
|
||||||
I64 i;
|
I64 CHUNK_SIZE = SAMPLE_RATE/winmgr.fps;
|
||||||
for (i = 0; i < size; i++)
|
F64 snd_vol = 1; // effectively the height of the lines?
|
||||||
|
|
||||||
|
I64 i, x1, y1, x2, y2, startIndex, endIndex,
|
||||||
|
cy = task->pix_height >> 1;
|
||||||
|
|
||||||
|
if(gSharedBufferPosition >= gSharedBufferSize) return; // If we reached the end of the buffer, don't draw.
|
||||||
|
|
||||||
|
// Start drawing from the current position
|
||||||
|
startIndex = gSharedBufferPosition;
|
||||||
|
endIndex = gSharedBufferPosition + CHUNK_SIZE;
|
||||||
|
|
||||||
|
// If endIndex goes beyond the buffer, adjust it.
|
||||||
|
if(endIndex > gSharedBufferSize) endIndex = gSharedBufferSize;
|
||||||
|
|
||||||
|
dc->color = BLACK;
|
||||||
|
x2 = 0; y2 = cy;
|
||||||
|
for (i = startIndex; i < endIndex; i += 2) // Assuming stereo, hence i+=2
|
||||||
{
|
{
|
||||||
gSharedBuffer[gSharedBufferPosition] = buffer[i];
|
I32 signedValue = GetSignedSample(i);
|
||||||
gSharedBufferPosition = (gSharedBufferPosition + 1) % gSharedBufferSize;
|
x1 = (i - startIndex) * task->pix_width / CHUNK_SIZE;
|
||||||
|
y1 = cy - (signedValue * cy / snd_vol / I32_MAX);
|
||||||
|
GrLine(dc, x2, y2, x1, y1);
|
||||||
|
x2 = x1; y2 = y1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I64 i;
|
|
||||||
// for (i = 0; i < size; i++) {
|
|
||||||
// gSharedBuffer[gSharedBufferPosition] = buffer[i];
|
|
||||||
// gSharedBufferPosition = (gSharedBufferPosition + 1) % gSharedBufferSize;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
U0 OscilloscopeDraw(CTask *task, CDC *dc)
|
dc->color = PURPLE;
|
||||||
{
|
x2 = 0; y2 = cy;
|
||||||
I64 i, y;
|
for (i = startIndex + 1; i < endIndex; i += 2)
|
||||||
I64 CHUNK_SIZE = SAMPLE_RATE / winmgr.fps;
|
|
||||||
// Start from the most recent sample and display CHUNK_SIZE samples
|
|
||||||
I64 startPosition = (gSharedBufferPosition - CHUNK_SIZE + gSharedBufferSize) % gSharedBufferSize;
|
|
||||||
|
|
||||||
for (i = 0; i < CHUNK_SIZE; i++)
|
|
||||||
{
|
{
|
||||||
I16 sample_value = (gSharedBuffer[startPosition] & 0xFFFF) - 32768;
|
I32 signedValueG = GetSignedSample(i);
|
||||||
F64 normalized_sample = ToF64(sample_value) / 32768.0;
|
x1 = (i - startIndex -1) * task->pix_width / CHUNK_SIZE;
|
||||||
y = 300 / 2 - (normalized_sample * 300 / 2);
|
y1 = cy - (signedValueG * cy / snd_vol / I32_MAX);
|
||||||
|
GrLine(dc, x2, y2, x1, y1);
|
||||||
GrPlot(dc, i, y);
|
x2 = x1; y2 = y1;
|
||||||
|
|
||||||
startPosition = (startPosition + 1) % gSharedBufferSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// I64 i, y;
|
gSharedBufferPosition += CHUNK_SIZE; // Move forward by the chunk size
|
||||||
|
//Sleep(10);
|
||||||
// //DCClear(dc);
|
|
||||||
|
|
||||||
// I64 startPosition = gSharedBufferPosition;
|
|
||||||
// for (i = 0; i < 400; i++) {
|
|
||||||
// I16 sample_value = (gSharedBuffer[startPosition] & 0xFFFF) - 32768; // extract left channel and center around 0
|
|
||||||
// F64 normalized_sample = ToF64(sample_value) / 32768.0;
|
|
||||||
// y = 300 / 2 - (normalized_sample * 300 / 2);
|
|
||||||
|
|
||||||
// GrPlot(dc, i, y); // Using GrPlot instead of DrawPoint
|
|
||||||
|
|
||||||
// startPosition = (startPosition + 1) % gSharedBufferSize;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
U0 StartOscilloscope()
|
U0 StartOscilloscope()
|
||||||
{
|
{
|
||||||
I64 ch, sc;
|
I64 ch, sc;
|
||||||
|
@ -76,65 +76,55 @@ U0 StartOscilloscope()
|
||||||
U8 *name = "Oscilloscope";
|
U8 *name = "Oscilloscope";
|
||||||
CTask *task = Spawn(&ServerCmdLine, NULL, name,, Fs);
|
CTask *task = Spawn(&ServerCmdLine, NULL, name,, Fs);
|
||||||
|
|
||||||
StrCopy(task->task_title, name);
|
// this permits the task not to clog MusicTracker
|
||||||
task->title_src = TTS_LOCKED_CONST;
|
|
||||||
task->border_src = BDS_CONST;
|
|
||||||
task->border_attr = LTGREEN << 4 + WHITE;
|
|
||||||
|
|
||||||
TaskExe(task, Fs, ";", 1 << JOBf_WAKE_MASTER | 1 << JOBf_FREE_ON_COMPLETE);
|
TaskExe(task, Fs, ";", 1 << JOBf_WAKE_MASTER | 1 << JOBf_FREE_ON_COMPLETE);
|
||||||
|
|
||||||
|
TaskWait(task);
|
||||||
|
|
||||||
|
StrCopy(task->task_title, name);
|
||||||
|
task->text_attr = DKGRAY << 4 + BLUE;
|
||||||
|
task->title_src = TTS_LOCKED_CONST;
|
||||||
|
task->border_src = BDS_CONST;
|
||||||
|
task->border_attr = TRANSPARENT << 4 + WHITE;
|
||||||
|
//WinBorder(OFF,task);
|
||||||
|
DocClear(task->border_doc, TRUE);
|
||||||
|
|
||||||
|
DocCursor(OFF, task->display_doc);
|
||||||
|
//DocClear(task);
|
||||||
|
|
||||||
|
|
||||||
WinHorz((TEXT_COLS / 2) - 32, (TEXT_COLS / 2) + 32, task);
|
WinHorz((TEXT_COLS / 2) - 32, (TEXT_COLS / 2) + 32, task);
|
||||||
WinVert((TEXT_ROWS / 2) - 16, (TEXT_ROWS / 2) + 16, task);
|
WinVert((TEXT_ROWS / 2) - 8, (TEXT_ROWS / 2) + 8, task);
|
||||||
task->win_inhibit = WIG_NO_FOCUS_TASK_DEFAULT;
|
task->win_inhibit = WIG_NO_FOCUS_TASK_DEFAULT;
|
||||||
// WinHorz(task->win_left, task->win_left + 50, task);
|
|
||||||
// WinVert(2, 2 + 8, task);
|
|
||||||
// task->animate_task = Spawn(&OscilloscopeAnimate, NULL, "Animate",, task);
|
|
||||||
task->draw_it = &OscilloscopeDraw; // Set the draw callback
|
|
||||||
|
|
||||||
// DocPut(task)->max_entries = 100;
|
//task->animate_task = Spawn(&AnimateTask, NULL, "Animate",, Fs);
|
||||||
|
task->draw_it = &DrawIt; // Set the draw callback
|
||||||
|
|
||||||
// CCtrl *oscWindow = OscWindow;
|
|
||||||
// windowed
|
|
||||||
// oscWindow->win_task->win_left = (GR_WIDTH / 23);
|
|
||||||
// oscWindow->win_task->win_right = (GR_WIDTH / 13);
|
|
||||||
// oscWindow->win_task->win_top = GR_HEIGHT / 80;
|
|
||||||
// oscWindow->win_task->win_bottom = GR_HEIGHT / 10;
|
|
||||||
|
|
||||||
// SettingsPush(); // Push current settings
|
|
||||||
//Fs->win_width = 400; // Width of the oscilloscope window
|
|
||||||
//Fs->win_height = 300; // Height of the oscilloscope window
|
|
||||||
|
|
||||||
// WinHorz((TEXT_COLS / 2) - 32, (TEXT_COLS / 2) + 32, Fs);
|
|
||||||
// WinVert((TEXT_ROWS / 2) - 16, (TEXT_ROWS / 2) + 16, Fs);
|
|
||||||
|
|
||||||
// oscWindow->win_task->border_src = BDS_CONST;
|
|
||||||
// oscWindow->win_task->border_attr = LTGREEN << 4 + WHITE;
|
|
||||||
// StrCopy(oscWindow->win_task->task_title, "Oscilloscope");
|
|
||||||
|
|
||||||
|
|
||||||
//Spawn("Oscilloscope", OscilloscopeTask); // Start the oscilloscope task
|
|
||||||
|
|
||||||
// Fs->draw_it = &OscilloscopeDraw; // Set the draw callback
|
|
||||||
|
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// do
|
|
||||||
// switch (ch = KeyGet(&sc))
|
|
||||||
// {
|
|
||||||
// case '\n':
|
|
||||||
// "dood\n";
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// while (ch != CH_ESC && ch != CH_SHIFT_ESC);
|
|
||||||
//}
|
|
||||||
//catch
|
|
||||||
// PutExcept;
|
|
||||||
|
|
||||||
// OscWindowDel(c);
|
|
||||||
|
|
||||||
// SettingsPop(); // Pop settings
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//StartOscilloscope;
|
||||||
|
|
||||||
|
// U0 OscilloscopeDraw(CTask *task, CDC *dc)
|
||||||
|
// {
|
||||||
|
// I64 i, y;
|
||||||
|
// I64 CHUNK_SIZE = SAMPLE_RATE / winmgr.fps;
|
||||||
|
// // Start from the most recent sample and display CHUNK_SIZE samples
|
||||||
|
// I64 startPosition = (gSharedBufferPosition - CHUNK_SIZE + gSharedBufferSize) % gSharedBufferSize;
|
||||||
|
|
||||||
|
// for (i = 0; i < CHUNK_SIZE; i++)
|
||||||
|
// {
|
||||||
|
// I16 sample_value = (gSharedBuffer[startPosition] & 0xFFFF) - 32768;
|
||||||
|
// F64 normalized_sample = ToF64(sample_value) / 32768.0;
|
||||||
|
// y = 300 / 2 - (normalized_sample * 300 / 2);
|
||||||
|
|
||||||
|
// GrPlot(dc, i, y);
|
||||||
|
|
||||||
|
// startPosition = (startPosition + 1) % gSharedBufferSize;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
// U0 OscilloscopeAnimate()
|
// U0 OscilloscopeAnimate()
|
||||||
// {
|
// {
|
||||||
// while (TRUE)
|
// while (TRUE)
|
||||||
|
@ -175,4 +165,15 @@ U0 StartOscilloscope()
|
||||||
// QueueRemove(c);
|
// QueueRemove(c);
|
||||||
// Free(c);
|
// Free(c);
|
||||||
// }
|
// }
|
||||||
//StartOscilloscope;
|
|
||||||
|
|
||||||
|
// Update shared buffer in your audio playback function
|
||||||
|
//U0 UpdateSharedBuffer(U32 *buffer, I64 size)
|
||||||
|
//{
|
||||||
|
// I64 i;
|
||||||
|
// for (i = 0; i < size; i++)
|
||||||
|
// {
|
||||||
|
// gSharedBuffer[gSharedBufferPosition] = buffer[i];
|
||||||
|
// gSharedBufferPosition = (gSharedBufferPosition + 1) % gSharedBufferSize;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
Loading…
Reference in a new issue