mirror of
https://github.com/openharmony/third_party_tinyalsa.git
synced 2026-07-19 15:24:22 -04:00
@@ -177,6 +177,7 @@ int pcm_read(struct pcm *pcm, void *data, unsigned int count);
|
||||
* mmap() support.
|
||||
*/
|
||||
int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count);
|
||||
int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count);
|
||||
int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset,
|
||||
unsigned int *frames);
|
||||
int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames);
|
||||
|
||||
@@ -301,7 +301,7 @@ static void pcm_hw_munmap_status(struct pcm *pcm) {
|
||||
}
|
||||
|
||||
static int pcm_areas_copy(struct pcm *pcm, unsigned int pcm_offset,
|
||||
const char *src, unsigned int src_offset,
|
||||
char *buf, unsigned int src_offset,
|
||||
unsigned int frames)
|
||||
{
|
||||
int size_bytes = pcm_frames_to_bytes(pcm, frames);
|
||||
@@ -309,12 +309,18 @@ static int pcm_areas_copy(struct pcm *pcm, unsigned int pcm_offset,
|
||||
int src_offset_bytes = pcm_frames_to_bytes(pcm, src_offset);
|
||||
|
||||
/* interleaved only atm */
|
||||
memcpy((char*)pcm->mmap_buffer + pcm_offset_bytes,
|
||||
src + src_offset_bytes, size_bytes);
|
||||
if (pcm->flags & PCM_IN)
|
||||
memcpy(buf + src_offset_bytes,
|
||||
(char*)pcm->mmap_buffer + pcm_offset_bytes,
|
||||
size_bytes);
|
||||
else
|
||||
memcpy((char*)pcm->mmap_buffer + pcm_offset_bytes,
|
||||
buf + src_offset_bytes,
|
||||
size_bytes);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcm_mmap_write_areas(struct pcm *pcm, const char *src,
|
||||
static int pcm_mmap_transfer_areas(struct pcm *pcm, char *buf,
|
||||
unsigned int offset, unsigned int size)
|
||||
{
|
||||
void *pcm_areas;
|
||||
@@ -324,7 +330,7 @@ static int pcm_mmap_write_areas(struct pcm *pcm, const char *src,
|
||||
while (size > 0) {
|
||||
frames = size;
|
||||
pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
|
||||
pcm_areas_copy(pcm, pcm_offset, src, offset, frames);
|
||||
pcm_areas_copy(pcm, pcm_offset, buf, offset, frames);
|
||||
commit = pcm_mmap_commit(pcm, pcm_offset, frames);
|
||||
if (commit < 0) {
|
||||
oops(pcm, commit, "failed to commit %d frames\n", frames);
|
||||
@@ -924,7 +930,7 @@ int pcm_wait(struct pcm *pcm, int timeout)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int pcm_mmap_write(struct pcm *pcm, const void *buffer, unsigned int bytes)
|
||||
int pcm_mmap_transfer(struct pcm *pcm, const void *buffer, unsigned int bytes)
|
||||
{
|
||||
int err = 0, frames, avail;
|
||||
unsigned int offset = 0, count;
|
||||
@@ -986,7 +992,7 @@ int pcm_mmap_write(struct pcm *pcm, const void *buffer, unsigned int bytes)
|
||||
break;
|
||||
|
||||
/* copy frames from buffer */
|
||||
frames = pcm_mmap_write_areas(pcm, buffer, offset, frames);
|
||||
frames = pcm_mmap_transfer_areas(pcm, (void *)buffer, offset, frames);
|
||||
if (frames < 0) {
|
||||
fprintf(stderr, "write error: hw 0x%x app 0x%x avail 0x%x\n",
|
||||
(unsigned int)pcm->mmap_status->hw_ptr,
|
||||
@@ -1001,3 +1007,19 @@ int pcm_mmap_write(struct pcm *pcm, const void *buffer, unsigned int bytes)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count)
|
||||
{
|
||||
if ((~pcm->flags) & (PCM_OUT | PCM_MMAP))
|
||||
return -ENOSYS;
|
||||
|
||||
return pcm_mmap_transfer(pcm, (void *)data, count);
|
||||
}
|
||||
|
||||
int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count)
|
||||
{
|
||||
if ((~pcm->flags) & (PCM_IN | PCM_MMAP))
|
||||
return -ENOSYS;
|
||||
|
||||
return pcm_mmap_transfer(pcm, data, count);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user