M5: Abgeschlossen
This commit is contained in:
@@ -8,13 +8,26 @@
|
||||
#include <math.h>
|
||||
#include "gip.h"
|
||||
|
||||
#define READ_WAV_FILE 1
|
||||
|
||||
// UIO & pointers
|
||||
int fdMmvs = open("/dev/uio0", O_RDWR);
|
||||
int fdMem = open("/dev/uio16", O_RDWR);
|
||||
static PGIP_AXI_2D_MM2VS mmvs = (PGIP_AXI_2D_MM2VS)mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fdMmvs, 0);
|
||||
|
||||
// Funktion zum fuellen des Buffers mit einer
|
||||
void fillBuffer(int16_t* pBuffer, size_t bufferSize);
|
||||
// open sound file
|
||||
int fdSoundFile = open("/home/user/Music/HaveANiceDay.wav", O_RDONLY);
|
||||
|
||||
// Funktion zum fuellen des Buffers mit einer Sinus-Funktion mit fester Periodendauer
|
||||
// bufferSize: Groesse des Buffers in Bytes
|
||||
void fillBuffer(int16_t* pBuffer, uint32_t bufferSize);
|
||||
|
||||
// Funktion zum fuellen des Buffers mit einer Sinus-Funktion mit variabler Periodendauer
|
||||
// bufferSize: Groesse des Buffers in Bytes
|
||||
// period: Anzahl der Abtastwerte pro eine Periode
|
||||
void fillBufferSine(int16_t *pBuffer, uint32_t bufferSize, uint32_t period);
|
||||
|
||||
void fillBufferSoundFile(int fd, int16_t *pBuffer, uint32_t bufferSize);
|
||||
|
||||
// Hinweis zu "__attribute__((unused))"
|
||||
// Hiermit wird dem Compiler mitgeteilt, dass eine Variable oder eine Funktion eventuell nicht verwendet wird
|
||||
@@ -33,6 +46,10 @@ void MM2VS_Handler()
|
||||
uint32_t bufferNumChunks = 188;
|
||||
__attribute__((unused)) int16_t* pBuffer;
|
||||
|
||||
// WAV-Datei Header einlesen und verwerfen
|
||||
uint8_t buf[44];
|
||||
read(fdSoundFile, buf, 44);
|
||||
|
||||
// MM2VS Initialization
|
||||
mmvs->VS2MM_Control &= ~1; // VS2MM: Run-Bit loeschen
|
||||
mmvs->MM2VS_Control &= ~1; // MM2VS: Run-Bit loeschen
|
||||
@@ -45,9 +62,6 @@ void MM2VS_Handler()
|
||||
mmvs->InterruptEnable = 0; // IP-INT-Enable zuruecksetzen
|
||||
mmvs->InterruptStatus = 0; // IP-INT-Status zuruecksetzen
|
||||
|
||||
// gesamten Pufferspeicher mit Daten fuellen
|
||||
//fillBuffer((int16_t *) ((uint32_t) pMem + bufferStartOffset), (size_t) bufferChunkSize*bufferNumChunks);
|
||||
|
||||
// Enable Interrupts
|
||||
mmvs->InterruptEnable = 0x1;
|
||||
int reenable = 1;
|
||||
@@ -86,26 +100,56 @@ void MM2VS_Handler()
|
||||
printf("Fill DataAddress: 0x%x\n", (unsigned int) pBuffer);
|
||||
|
||||
// Fill not used buffer with values
|
||||
fillBuffer(pBuffer, (size_t) bufferChunkSize*bufferNumChunks/2);
|
||||
// fillBuffer(pBuffer, bufferChunkSize*bufferNumChunks);
|
||||
//fillBufferSine(pBuffer, bufferChunkSize*bufferNumChunks, 12);
|
||||
int ret = read(fdSoundFile, pBuffer, bufferChunkSize*bufferNumChunks);
|
||||
printf("Bytes read: %u", ret);
|
||||
if (ret == -1) {
|
||||
printf("Failed to read Soundfile\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
printf("Start Program\n");
|
||||
std::thread t1(MM2VS_Handler);
|
||||
|
||||
if (fdSoundFile == -1) {
|
||||
printf("Fehler beim Einlesen der WAV-Datei.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::thread t1(MM2VS_Handler);
|
||||
t1.join();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fillBuffer(int16_t* pBuffer, size_t bufferSize)
|
||||
void fillBuffer(int16_t* pBuffer, uint32_t bufferSize)
|
||||
{
|
||||
// Sinuswerte einer Periode auf 8 mal 16bit aufgeteilt
|
||||
int16_t sine_values[] = {0,23169,32767,23169,0,-23170,-32768,-23170};
|
||||
|
||||
for (size_t i = 0; i < bufferSize; i++) {
|
||||
for (uint32_t i = 0; i < bufferSize/2; i++) {
|
||||
int16_t *pData = pBuffer + i;
|
||||
*pData = sine_values[i%8];
|
||||
}
|
||||
}
|
||||
|
||||
void fillBufferSine(int16_t *pBuffer, uint32_t bufferSize, uint32_t period)
|
||||
{
|
||||
static uint32_t n = 0;
|
||||
double deltaX = 2 * M_PI / period;
|
||||
|
||||
for (uint32_t i = 0; i < bufferSize/2; i++) {
|
||||
int16_t *pData = pBuffer + i;
|
||||
int16_t sineValue = (int16_t) 32767 * sin(n*deltaX);
|
||||
*pData = sineValue;
|
||||
|
||||
n = (n+1) % period;
|
||||
}
|
||||
}
|
||||
|
||||
void fillBufferSoundFile(int fd, int16_t *pBuffer, uint32_t bufferSize)
|
||||
{
|
||||
read(fdSoundFile, pBuffer, bufferSize);
|
||||
}
|
||||
|
||||
@@ -2,21 +2,22 @@ from math import pi, sin
|
||||
|
||||
# Dieses Skript berechnet die Sinuswerte, welche vom C-Programm in den
|
||||
# Pufferspeicher gelegt werden
|
||||
|
||||
# Anzahl der Werte pro Periode
|
||||
period = 12
|
||||
|
||||
def arduino_map(x, in_min, in_max, out_min, out_max):
|
||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
|
||||
|
||||
|
||||
sine_values = []
|
||||
dx = 2 * pi / 8
|
||||
dx = 2 * pi / period
|
||||
|
||||
for i in range(8):
|
||||
for i in range(period):
|
||||
sine_values.append(int(arduino_map(sin(i*dx), -1, 1, -32768, 32767)))
|
||||
print(sine_values[i])
|
||||
|
||||
print()
|
||||
print("{}", end="")
|
||||
print("{", end="")
|
||||
for v in sine_values:
|
||||
print(v, end="")
|
||||
print(",", end="")
|
||||
|
||||
Reference in New Issue
Block a user