jack2/android/Shm.h

145 lines
5.5 KiB
C++

/*
Copyright (C) 2001-2003 Paul Davis
Copyright (C) 2005-2012 Grame
Copyright (C) 2013 Samsung Electronics
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __jack_shm_android_h__
#define __jack_shm_android_h__
#include <limits.h>
#include <sys/types.h>
#include "types.h"
#include "JackCompilerDeps.h"
#include <binder/MemoryHeapBase.h>
#include <utils/RefBase.h>
#ifdef __cplusplus
extern "C"
{
#endif
#define JACK_SHM_REGISTRY_FD -1
#define JACK_SHM_HEAP_ENOUGH_COUNT 300
void jack_instantiate();
#ifdef __cplusplus
}
#endif
namespace android {
class IAndroidShm;
class Shm {
public:
static Shm* Instantiate();
virtual ~Shm();
private:
Shm();
Shm( const Shm&);
Shm& operator=(const Shm);
private:
void set_server_prefix (const char *server_name);
int server_initialize_shm (int new_registry);
int shm_lock_registry (void);
void shm_unlock_registry (void);
int access_registry (jack_shm_info_t *ri);
void remove_shm (jack_shm_id_t *id);
int create_registry (jack_shm_info_t *ri);
int shm_validate_registry ();
int GetUID();
int GetPID();
void shm_init_registry ();
void release_shm_entry (jack_shm_registry_index_t index);
jack_shm_registry_t * get_free_shm_info ();
public:
static void jack_shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t);
static void jack_shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*);
static int jack_release_shm_info (jack_shm_registry_index_t);
static char* jack_shm_addr (jack_shm_info_t* si);
static int jack_register_server (const char *server_name, int new_registry);
static int jack_unregister_server (const char *server_name);
static int jack_initialize_shm (const char *server_name);
static int jack_initialize_shm_server (void);
static int jack_initialize_shm_client (void);
static int jack_cleanup_shm (void);
static int jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result);
static void jack_release_shm (jack_shm_info_t*);
static void jack_release_lib_shm (jack_shm_info_t*);
static void jack_destroy_shm (jack_shm_info_t*);
static int jack_attach_shm (jack_shm_info_t*);
static int jack_attach_lib_shm (jack_shm_info_t*);
static int jack_attach_shm_read (jack_shm_info_t*);
static int jack_attach_lib_shm_read (jack_shm_info_t*);
static int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
public:
void shm_copy_from_registry (jack_shm_info_t*, jack_shm_registry_index_t);
void shm_copy_to_registry (jack_shm_info_t*, jack_shm_registry_index_t*);
int release_shm_info (jack_shm_registry_index_t);
char* shm_addr (unsigned int fd);
// here begin the API
int register_server (const char *server_name, int new_registry);
int unregister_server (const char *server_name);
int initialize_shm (const char *server_name);
int initialize_shm_server (void);
int initialize_shm_client (void);
int cleanup_shm (void);
int shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* result);
void release_shm (jack_shm_info_t*);
void release_lib_shm (jack_shm_info_t*);
void destroy_shm (jack_shm_info_t*);
int attach_shm (jack_shm_info_t*);
int attach_lib_shm (jack_shm_info_t*);
int attach_shm_read (jack_shm_info_t*);
int attach_lib_shm_read (jack_shm_info_t*);
int resize_shm (jack_shm_info_t*, jack_shmsize_t size);
private:
static jack_shmtype_t jack_shmtype;
static jack_shm_id_t registry_id;
static jack_shm_fd_t registry_fd;
static jack_shm_info_t registry_info;
static jack_shm_header_t *jack_shm_header;
static jack_shm_registry_t *jack_shm_registry;
static char jack_shm_server_prefix[JACK_SERVER_NAME_SIZE+1];
static int semid;
static pthread_mutex_t mutex;
static Shm* ref;
void jack_release_shm_entry (jack_shm_registry_index_t index);
int jack_shm_lock_registry (void);
void jack_shm_unlock_registry (void);
//static sp<IAndroidShm> mShmService;
static sp<IMemoryHeap> mShmMemBase[JACK_SHM_HEAP_ENOUGH_COUNT];
public:
static sp<IAndroidShm> getShmService();
};
};
#endif /* __jack_shm_android_h__ */